• 第10章 无持久存储的文件系统 (1)


    目录

    前言

    10.1 proc文件系统

    10.1.1 /proc 内容


    本专栏文章将有70篇左右,欢迎+关注,查看后续文章。

    前言

    即存在于内存中的文件系统。如:

            proc:

            sysfs:

                    即/sys目录。

                    内容不一定是ASCII文本,可能是二进制。

                    收集内核对象kobject的拓扑信息。

            debugfs:

                    作用:快速向应用层导出,或从应用层导入值

                    原理:使用了 libfs+顺序文件。

    10.1 proc文件系统

    procfs,即 process data filesystem。

    proc 文件系统作用:

            1. cat 文件时,动态生成相关信息。

            2. echo " " > 文件,修改系统配置

    10.1.1 /proc 内容

    proc 信息分为几类:

            1. 内存管理

            2. 进程信息

            3. 文件系统

            4. 设备驱动

            5. 系统总线

            6. 电源管理

            7. 系统控制参数

    1. 特定于进程的数据

    cat /proc/3883/         数字为进程 PID

            cmdline:开启该进程的命令,如 ./a.out 1 2

            environ:该进程设置的环境变量。

            maps:进程本身,及其使用的库的内存映射(可用于定位进程crash)

            status

            fd: 进程打开的文件描述符,都是链接文件。

                    如:

                            /proc/2820/fd/1 -> /dev/null

                            /proc/2820/fd/4 -> socket:[10030]

            cwd:进程当前的工作目录。

            exe:链接指向进程的二进制程序。

                    如:

                            /proc/2820/exe -> /bin/cbsd

    举例:

    cat   /proc/906/status

            Name:      systemd         对应可执行文件名字。

            Umask:     0022             该进程创建文件的默认权限掩码。

            State:       S (sleeping)

            Tgid:         906                线程组ID。

            Ngid:        0                     下一个可用的线程组ID。

            Pid:          906                 进程ID。

            PPid:         1                    父进程ID。

            TracerPid: 0                    跟踪该进程的调试器进程ID。

            Uid:         0 0 0 0

                    实际用户ID、有效用户ID、保存的设置用户ID、文件系统用户ID。

            Gid:         0 0 0 0

                    进程的实际组ID、有效组ID、保存的设置组ID、文件系统组ID。

            FDSize:     1024                进程的文件描述符限制大小。

            Groups:

            NStgid:          906         NS=namespace

            NSpid:          906

            NSpgid:         906

            NSsid:           906

            VmPeak:       1311540 kB

                    进程使用的虚拟内存峰值。

            VmSize:         1071592 kB

                    进程使用的虚拟内存当前值。

                    不等于实际使用物理内存(如部分数据可存储在交换区)。

            VmLck:         0 kB

                    锁定的内存区域大小。

                    即不被swap到磁盘,也无法回收。

            VmHWM:         244276 kB         进程使用的物理内存峰值。

            VmRSS:         239916 kB          进程当前使用物理内存值。

            RssAnon:         36428 kB          进程的匿名内存的大小(如堆、栈、共享内存)

            RssFile:          10140 kB           进程文件缓存页大小。

            RssShmem:     0 kB                  进程使用的共享内存的总大小。

            VmData:         628048 kB         数据段大小。

            VmStk:          136 kB                 栈大小。

            VmExe:         32 kB                   代码段大小。

            VmLib:          57908 kB              库大小。

            VmPTE:        2388 kB               页表的大小。

            VmSwap:       0 kB                     使用swap的大小。

            Threads:         1

            SigQ:           0/13035                         当前未处理信号数量 / 进程可接收信号最大数量。

            SigPnd:       0000000000000000         等待处理的信号位掩码。

            ShdPnd:      0000000000000000         共享的挂起信号掩码。

            SigBlk:         0000000000000000         进程阻塞信号掩码。

            SigIgn:         0000000000001000         进程忽略的信号掩码。

            SigCgt:         0000000000002000         进程可接收并可处理的信号。

            CapInh:         00000000a80425fb         从父进程继承的能力。

            CapPrm:        00000000a80425fb         进程当前的能力集合。

            CapEff:          00000000a80425fb         当前实际拥有的能力集合

            CapBnd:         00000000a80425fb         进程不能超出的能力集合。

            CapAmb:                      0000000000000000         可接受的能力集合。

            NoNewPrivs:                0

                    是否设置Privileges位,即不可增加特权。若设置,execve程序不能有更高权限。

            Seccomp:                     0                         安全计算模式,限定进程可使用的系统调用

            Cpus_allowed:              f                          允许允许的CPU掩码。

            Cpus_allowed_list:        0-3

            Mems_allowed:         00000000,00000001         允许使用的内存节点的掩码。

            Mems_allowed_list:                         0

            voluntary_ctxt_switches:               397

                    主动放弃CPU的次数,如进程阻塞I/O。

            nonvoluntary_ctxt_switches:         253

                    被迫放弃CPU的次数,如时间片用完。

    mlock系统调用:

            作用:将进程指定的虚拟内存区域锁定在物理内存中,防止被交换出去。

    RSS:常驻集大小(Resident Set Size)

            当前驻留在物理内存中的大小。不包括被换出到交换空间(Swap)的部分。

    当一个信号被设置为阻塞后,当进程收到该信号时不会立即处理,而是挂起信号,直到解除信号阻塞状态后才能处理。

    如何阻塞SIGINT信号?

            sigaddset(&block_set, SIGINT);

            sigprocmask(SIG_BLOCK, &block_set, NULL);

    信号在内核中状态:

            1. 递达:Delivery。收到信号,并执行信号处理函数。

            2. 未决 / 挂起:Pending。进程正处理一个信号时,收到的其余信号被挂起。

            3. 阻塞:Block。进程解除信号阻塞,立即执行信号处理函数。即延时接收。

    运用场景:

            挂起信号:优先处理某些紧急信号,推迟处理其他信号。

            阻塞信号:临时忽略某信号。例如在某些关键性操作期间,可防止信号干扰进程。

    进程常见能力包括:

            CAP_CHOWN:

                    更改文件的所有者的的能力。 即可执行chown

            CAP_DAC_READ_SEARCH:

                    读取任意文件和目录的能力。

            CAP_NET_RAW:

                    使用原始网络套接字的能力。

                    !ns_capable(net->user_ns, CAP_NET_RAW)

            CAP_SYS_ADMIN: 管理系统的能力

            CAP_SYS_RESOURCE:

                    允许进程配置系统资源。如nice setrlimit mlock

            CAP_SYS_PTRACE:

                    跟踪其他进程的能力。

            CAP_IPC_LOCK:

                    锁定内存的能力。

    内核如何判断进程的能力:

            与current->cred->cap_effective掩码计算。

    相关命令:

            sudo    setcap    cap_net_raw   +   ep   /usr/bin/ping

            sudo    getcap

    2. 系统信息

    iomem:即IO内存。

    IO内存的使用方法:

            1. request_mem_region(start, size, "name"); 请求一块物理地址内存区域。

            2. ioremap; 将物理地址映射到虚拟地址空间。

    /proc/iomem

            IO内存信息,包括系统物理地址布局。

    /proc/ioports

            IO端口信息。

    /proc/buddyinfo

            不同大小阶的页大小,都有多少可用。

    /proc/slabinfo

            slab分配器信息。

            内容举例:

                    # name : tunables : slabdata

                    kmalloc-16 0 0 16 256 1 : tunables 0 0 0 : slabdata 0 0 0

                    kmalloc-192 29 30 192 30 1 : tunables 0 0 0 : slabdata 1 1 0

                    ext4_inode_cache 35 35 1000 7 2 : tunables 0 0 0 : slabdata 5 5 0

                    active_objs: 该slab缓存当前活动对象数量。

                    num_objs: 可用总对象数。

                    objsize: 单个对象大小。

                    objperslab: 每个slab缓存中包含对象数。

                    pagesperslab:每个slab缓存中占用的页数。

    /proc/meminfo

            MemTotal:         16218688 kB         实际管理的内存 = 物理内存 - 预留内存。

            MemFree:         2576640 kB           空闲内存。

            MemAvailable: 8374184 kB

                    可用内存。已使用,但回收后仍可用,所以大于MemFree。

            Buffers:         50828 kB         块设备占用页缓存大小,如超级块所用的缓存页。

            Cached:         8665304 kB     普通文件页缓存大小。

            SwapCached: 2096 kB         交换分区缓存的大小,即用于匿名页换入换出的缓存。

            Active:             7965496 kB

                    active(file) + active(anon) 内存页总和(最近使用的内存页)。

            Inactive:         4651356 kB

                    Inactive(file)和Inactive(anon)内存页总和(最近未使用的页)。

            Active(anon):         3603464 kB         最近使用的匿名页。

            Inactive(anon):      1225800 kB         最近未使用的匿名页。

            Active(file):             4362032 kB         最近使用的文件页。

            Inactive(file):           3425556 kB        最近未使用的文件页。

            Unevictable:         25840 kB         不可回收页,如内核进程或驱动使用。

            Mlocked:               25840 kB         页被进程锁定,不能被移动交换回收。

            SwapTotal:            8388604 kB     交换分区总大小。

            SwapFree:            8384060 kB     未使用的交换分区大小。

            Dirty: 8 kB

            Writeback:             0 kB                 正回写页。

            AnonPages:         4198028 kB      匿名页的大小。

            Mapped:               1579700 kB      驱动映射和共享内存。

            Shmem:               130352 kB         共享内存。

            Slab:                     360424 kB        slab缓存大小。

            SReclaimable:       312900 kB        slab中可回收内存大小。

            SUnreclaim:         47524 kB           slab中不可回收内存。

            KernelStack:         4136 kB            当前内核线程的栈大小。

            PageTables:         6812 kB             页表占用内存大小。

            NFS_Unstable:    0 kB                   NFS客户端使用。

            VmallocTotal:        34359738367 kB         vmalloc虚拟地址空间大小。

            VmallocUsed:         329676 kB

            VmallocChunk:       34359396996 kB         vmalloc区域最大连续空闲块的大小。

            HardwareCorrupted:         0 kB

            ShmemPmdMapped:        0 kB

            CmaTotal:                 524288 kB         连续内存区域的总大小。

            CmaFree:                 357464 kB         连续内存区域中可用大小。

            HugePages_Total:         0                   大页。

            Hugepagesize:       2048 kB

            DirectMap4k:         144344 kB

            DirectMap2M:         8146944 kB

            DirectMap1G:         8388608 kB         管理的大内存,1G页对应一个页表,可减少页表。

            

    kswapd线程周期性把Active list中符合条件页移到Inactive list中。

    /proc/vmstat 内存页使用统计

            nr_free_pages               30248

            nr_inactive_anon           0

            nr_active_anon              2684

            nr_inactive_file               2534

            nr_active_file                  1462

            nr_unevictable                 0

            nr_mlock                         0

            nr_anon_pages               2689

    CMA(Contiguous Memory Allocator)

            内核启动时预留CMA的内存大小和位置(由内核启动参数或设备树配置)。

            使用方法:

                    驱动申请使用CMA内存时,内核从预留的CMA内存池中分配一块连续物理内存,并返回虚拟地址,供驱动设备DMA操作。

            使用场景:

                    USB,网络包处理,图形子系统等。

            内核参数:cma = 256M

    /proc/kallsyms

            内核符号表,及其虚拟地址(内核虚拟地址空间)。

            原理:

                    编译时,将所有函数和全局变量的地址组成一个数据块,并链接到vmlinux。

                    cat /proc/kallsyms 时读取该数据块。

            编译选项:

                    CONFIG_KALLSYMS

    System.map文件:

            80004000 A swapper_pg_dir 内核虚拟地址空间中的地址。

    System.map如何生成?

            linux-3.x/ scripts/ mksysmap,该脚本中执行 nm vmlinux > System.map 生成。

    System.map不包含驱动模块中符号。

    /proc/kallsyms包含模块等所有符号(即使没有EXPORT_SYMBOL)。

    /proc/interrupts

            中断统计信息,包括中断号,中断次数,所属中断控制器。

    3. 网络信息

    /proc/net/udp

    /proc/net/tcp

            包含socket fd、本地地址和端口号、远程地址和端口号、状态,发送队列等信息。

    /proc/net/arp         ARP表信息。

            IP address HW type Flags HW address Mask Device

            192.168.150.123 0x1 0x2 6c:b3:11:3f:47:fb * br0

            Flags 0x2:表示该ARP已验证,可使用。

    /proc/net/dev 所有网卡统计信息。

            fifo:因队列满的丢包数。

            frame:因帧错误的丢包数。

            carrier:因载波问题的丢包数。

    4. 系统控制参数

    /proc/sys/ 可写,从而控制系统。

            debug/ dev/ fs/ /kernel/ net/ vm/

    cat /proc/sys/vm/swappiness

            查看页交换积极程度。

  • 相关阅读:
    18.从组件外部调用一个方法
    MViT:性能杠杠的多尺度ViT | ICCV 2021
    springboot网上电子书店下载购买系统-图书商城网站961h3-java-ssm二级分类
    步步为营,如何将GOlang引用库的安全漏洞修干净
    Web3去中心化存储生态图景
    R语言ggplot2可视化:使用ggplot2可视化散点图、在geom_point参数中设置show_legend参数为FALSE配置不显示图例信息
    5.盒子阴影(重点)
    数组扩展方法(一)
    Python(5):字典
    vmware的Linux虚拟机创建新的卷组VG
  • 原文地址:https://blog.csdn.net/qingwangheni/article/details/141052990