内核、内核编译、/proc、/sys

本文深入探讨Linux内核的设计理念,包括单内核体系、模块化机制、内核组成部分如kernel、kernel object以及辅助文件ramdisk等。文章还介绍了运行中的内核状态,如何使用uname、lsmod、modinfo等命令管理和查询内核模块,以及如何通过/proc和/sys目录调整内核参数和硬件设备特性。

Linux Kernel:

    单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。
        内核组成部分:
            kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE;
            kernel object: 内核对象,一般放置于/lib/modules/VERSION-RELEASE/
                [ ]: N
                [M]: M
                [*]: Y

            辅助文件:ramdisk
                initrd
                initramfs

    运行中的内核:

        uname命令:
            uname - print system information
            uname [OPTION]...
                -n: 显示节点名称;
                -r: 显示VERSION-RELEASE; 

        模块:
            lsmod命令:
                显示由核心已经装载的内核模块

                显示的内容来自于: /proc/modules文件

            modinfo命令:
                显示模块的详细描述信息

                modinfo [ -k kernel ]  [ modulename|filename... ]
                    -n: 只显示模块文件路径
                    -p: 显示模块参数
                    -a: author
                    -d: description
                    -l: license

            modprobe命令:
                装载或卸载内核模块

                modprobe [ -C config-file ]  [ modulename ]  [ module parame-ters... ]
                    配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf

                  modprobe [ -r ] modulename...

              depmod命令:
                  内核模块依赖关系文件及系统信息映射文件的生成工具;

              装载或卸载内核模块:
                  insmod命令:
                      insmod [ filename ]  [ module options... ]

                  rmmod
                      rmmod [ modulename ]

 

/proc目录:


        内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出;

        参数:
            只读:输出信息
            可写:可接受用户指定“新值”来实现对内核某功能或特性的配置
                /proc/sys

                (1) sysctl命令用于查看或设定此目录中诸多参数;
                    sysctl -w path.to.parameter=VALUE

                    ~]# sysctl -w kernel.hostname=mail.magedu.com

                (2) echo命令通过重定向的方式也可以修改大多数参数的值;
                    echo "VALUE" > /proc/sys/path/to/parameter

                    ~]# echo "www.magedu.com" > /proc/sys/kernel/hostname

            sysctl命令:
                默认配置文件:/etc/sysctl.conf
                    (1) 设置某参数
                        sysctl -w parameter=VALUE
                    (2) 通过读取配置文件设置参数
                        sysctl -p [/path/to/conf_file]

            内核中的路由转发:
                /proc/sys/net/ipv4/ip_forward

                常用的几个参数:
                    net.ipv4.ip_forward
                    vm.drop_caches
                    kernel.hostname

    /sys目录:

        sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性。

        udev通过此路径下输出的信息动态为各设备创建所需要设备文件;udev是运行用户空间程序;专用工具:udevadmin, hotplug;

        udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下;

    ramdisk文件的制作:

        (1) mkinitrd命令
            为当前正在使用的内核重新制作ramdisk文件
                ~] # mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

        (2) dracut命令 
            为当前正在使用的内核重新制作ramdisk文件
                ~] # dracut /boot/initramfs-$(uname -r).img $(uname -r) 

 

 

    编译内核:


        前提:
            (1) 准备好开发环境;
            (2) 获取目标主机上硬件设备的相关信息;
            (3) 获取到目标主机系统功能的相关信息,例如要启用的文件系统;
            (4) 获取内核源代码包;
                www.kernel.org

        准备好开发环境:
            包组(CentOS 6):
                Server Platform Development
                Development Tools

        目标主机硬件设备相关信息:
            CPU:
                ~]# cat /proc/cpuinfo
                ~]# x86info -a
                ~]# lscpu

            PCI设备:
                ~]# lspci
                    -v
                    -vv

                ~]# lsusb
                    -v
                    -vv

                ~]# lsblk

            了解全部硬件设备信息
                ~]# hal-device

        简单依据模板文件的制作过程:
            ~]# tar xf linux-3.10.67.tar.xz -C /usr/src
            ~]# cd /usr/src
            ~]# ln -sv linux-3.10.67 linux
            ~]# cd linux
            ~]# cp /boot/config-$(uname -r) ./.config

            ~]# make menuconfig
            ~]# screen
            ~]# make -j #

            ~]# make modules_install
            ~]# make install

            重启系统,并测试使用新内核;

        练习:编译好,并启用之;

<think> 我们正在讨论的是Linux内核中的`/proc/sys`文件系统。以下是对该主题的详细解释: ### 解释 `/proc/sys` 是 Linux 虚拟文件系统 `/proc` 的一个子目录,用于**动态调整内核运行时参数**。它提供了用户空间与内核交互的接口,允许系统管理员在运行时查看或修改内核配置,而无需重新编译内核或重启系统。 #### 核心功能: 1. **参数暴露**: 将内核变量(如网络栈参数、文件系统行为、内存管理设置等)以文件形式呈现。 **示例路径**: - 网络参数:`/proc/sys/net/ipv4/ip_forward`(控制IP转发功能) - 内存参数:`/proc/sys/vm/swappiness`(控制交换内存使用倾向) 2. **动态修改**: 通过 `echo` 或 `sysctl` 命令直接修改文件内容即可生效。 **示例命令**: ```bash echo 1 > /proc/sys/net/ipv4/ip_forward # 启用IP转发 sysctl -w vm.swappiness=60 # 等价修改 ``` 3. **层级结构**: 目录组织按功能分类: - `net/`:网络协议栈(IPv4/IPv6、路由、防火墙等) - `kernel/`:进程调度、信号量等核心行为 - `fs/`:文件系统配置(如文件句柄上限) - `vm/`:虚拟内存管理策略 #### 工作原理: - **文件与内核变量的映射**: 每个文件关联一个内核变量(通常是整型或字符串),通过 `proc_dointvec`、`proc_dostring` 等处理函数实现读写操作(如之前讨论的 `addrconf_sendrs` 函数即被 `/proc/sys` 调用)。 - **权限控制**: 文件权限(如 `rw-r--r--`)决定修改权限,通常需 root 权限写入。 #### 持久化配置: - 临时修改通过 `/proc/sys` 直接生效,但重启后丢失。 - 需将配置写入 `/etc/sysctl.conf` 或 `/etc/sysctl.d/*.conf` 文件,执行 `sysctl -p` 加载以实现永久生效。 ### 重要性 - **故障排查**:实时调整参数优化性能(如 TCP 缓冲区大小)。 - **安全加固**:快速关闭潜在风险功能(如 ICMP 重定向)。 - **实验调试**:开发者无需重编译即可测试内核行为。 --- §§相关问题§§ 1. `/proc/sys` 与 `/sys` 文件系统在功能上有哪些主要区别? 2. 修改 `/proc/sys` 中的参数时,内核如何确保并发访问的安全性? 3. 如何通过编程方式(C/Python)安全地读写 `/proc/sys` 中的参数? 4. 为什么某些 `/proc/sys` 参数修改后立即生效,而有些需要重启服务? 5. 在容器化环境中(如 Docker),`/proc/sys` 的访问会受到哪些限制? </think>### `/proc/sys` 文件系统详解 `/proc/sys` 是 Linux 内核提供的**动态内核参数配置接口**,属于虚拟文件系统 `/proc` 的核心子目录。它允许用户空间程序在运行时直接读取或修改内核参数,无需重新编译内核或重启系统。以下是关键特性: --- #### **核心功能** 1. **实时内核调优** - 通过读写虚拟文件即时调整内核行为(如网络协议栈、内存管理)。 - **示例**: ```bash # 启用IP转发(网络路由) echo 1 > /proc/sys/net/ipv4/ip_forward # 调整系统最大文件打开数 echo 100000 > /proc/sys/fs/file-max ``` 2. **层次化参数组织** - 按功能分类的目录结构: - `net/`:网络协议参数(IPv4/IPv6、TCP/UDP) - `kernel/`:进程调度、信号量等核心配置 - `vm/`:虚拟内存管理(缓存策略、交换分区) - `fs/`:文件系统设置(inode缓存、磁盘配额) 3. **与 `sysctl` 命令的关联** - `sysctl` 工具直接操作 `/proc/sys` 中的参数: ```bash sysctl net.ipv4.ip_forward=1 # 等价于直接写文件 ``` --- #### **工作原理** - **动态映射机制** 每个文件对应一个内核变量(如整型、字符串或结构体),通过内核注册的 `ctl_table` 结构关联(参见此前分析的 `addrconf_sendrs` 函数)。 - **读写处理流程**: 1. 用户写入文件(如 `echo "value" > /path`) 2. 内核调用 `proc_dointvec()` 等处理函数(示例代码中 `proc_dointvec` 处理整型参数) 3. 函数验证值有效性并更新内核变量 --- #### **重要特性** | 特性 | 说明 | |---------------------|----------------------------------------------------------------------| | **临时性** | 修改仅在运行时生效,重启后丢失(持久化需写入 `/etc/sysctl.conf`) | | **权限控制** | 默认仅 root 可写,文件权限为 `rw-r--r--`(640) | | **原子性操作** | 文件读写通过内核锁保证并发安全(如示例中的 `read_lock_bh()`) | | **副作用触发** | 某些参数修改触发内核动作(如 `sendrs` 触发发送路由器请求) | --- #### **典型应用场景** 1. **网络优化**:调整 TCP 拥塞窗口(`net.ipv4.tcp_window_scaling`) 2. **安全加固**:禁用 ICMP 重定向(`net.ipv4.conf.all.accept_redirects=0`) 3. **故障排查**:记录内核日志详细级别(`kernel.printk`) > ⚠️ 警告:错误修改可能导致系统不稳定!建议通过 `sysctl -a` 查看完整参数列表。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值