Linux内核 ============================================================================================================================================== 一、内核及模块 1、Linux内核组成 核心文件:内核 kernel /boot/vmlinuz-3.10.0-514.el7.x86_64 虚根(辅助性文件):initramfs(CentOS6|7) | randisk(CentOS5) # 将内存模拟成文件系统或者磁盘(挂载真正的根文件 前,先挂载虚根,也就是ramdisk) 内核模块:/usr/lib/modules/3.10.0-514.el7.x86_64/ 模块可以在编译的时候直接编译到内核核心,或者编译成模块,需要的时候加载模块。 2、lsmod 注:内核模块由内核控制自动加载和卸载 查看当前加载的内核模块 调用查看/proc/modules文件的内容 /lib/modules/3.10.0-514.el7.x86_64/modules.dep文件保存了模块之间的依赖关系 /lib/modules/3.10.0-514.el7.x86_64/modules.dep.bin是真正被使用的依赖关系文件,二进制格式 3、modinfo 查看模块的详细信息。 格式: modinfo MODULES_NAME 选项: -n # 只显示模块文件路径 -p # 显示模块参数 -a # author,显示作者 -d # description,显示描述信息 -l # license,显示许可证信息 4、modprobe 装载/卸载某模块。 配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf 格式: modprobe MODULES_NAME 选项: -r # 移除指定模块 -n # 测试装载模块 -q # 静默模式 5、insmod/rmmod insmod命令不会自动解决依赖的模块,需要指明对应模块的文件路径 6、depmod 内核模块依赖关系文件及系统信息映射文件的生成工具 7、/proc目录 proc目录是唯一内存中的伪文件系统,该目录下保存的是内核把自己内部状态信息及统计信息,以及可配置参数通 过proc伪文件系统加以输出.内核的状态信息通常是只读的,还有一些文件是用来配置内核的某些功能或特性,这些 文件是可写的。 /proc/cmdline 加载内核时传递给内核的参数 /proc/cpuinfo 本机的 CPU 的相关信息,包含频率、类型与运算功能等 /proc/devices 这个文件记录了系统各个主要设备的主要设备代号,与 mknod 有关 /proc/filesystems 当前加载的文件系统 /proc/interrupts 目前系统上面的 IRQ 分配状态 /proc/ioports 目前系统上面各个设备所配置的 I/O 位址 /proc/kcore /proc/loadavg 系统负载情况 top 以及 uptime 上头的三个平均数值就是记录在 /proc/meminfo 内存信息 /proc/modules 当前主机加载的模块信息 /proc/mounts 当前挂载信息,使用mount信息查看的就是此文件的信息 /proc/swaps 记录交换分区 /proc/partitions 使用 fdisk -l 会出现目前所有的 partition /proc/uptime uptime指明查看的信息 /proc/version 核心的版本,uname -a /proc/bus/* 一些总线的设备,还有 USB 的设备也记录在此 8、修改内核参数 1、sysctl 修改内核参数。 选项: -w # 修改内核参数 -p # 重读配置文件 -a # 显示当前内核生效的参数 2、echo 通过重定向的方式修改参数的值。 3、立即生效 1、echo Parameter_value > /proc/sys/dir_name/Parameter_name 2、sysctl -w dir_name.[...].parameter_name=parameter_value dir_name通常从/proc/sys目录下的文件开始例如net、kernel 4、永久生效 /etc/sysctl.conf /etc/sysctl.d 5、内核参数 net.ipv4.ip_forward = 0|1 # 路由转发功能 net.ipv4.ip_local_prot_range = # Linux中客户端使用的随机端口  net.ipv4.tcp_max_orphans = # 指定内核能接管的孤儿连接数目  net.ipv4.tcp_fin_timeout = # 指定孤儿连接在内核中生存的时间 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 忽略来自目标地址的广播报文的数据包 net.ipv4.icmp_echo_ignore_all = 1 # 忽略icmp报文 net.ipv4.ip_default_ttl = 128 # ttl值 net.ipv4.tcp_congestion_control = # 拥塞控制算法reno、vegas、cubic net.ipv4.tcp_retries1 = # 最少执行的超时重传次数,默认为3 net.ipv4.tcp_retries2 = # vm.drop_caches = 1 # 回收buff和cache使用的内存 kernel.hostname = # 主机名 kernel.shmmax= # 最大的内存共享段 kernel.shmall= # 内存分配最大页数 fs.file-max= # 系统中同时打开的文件个数 9、/sys目录 输出内核识别的各硬件设备的属性信息,也有内核对硬件特性的设定信息。有些参数可以修改,用于调整硬件工作特性。 udev是运行在用户空间的一个程序,udev可以根据内核在sys目录下输出的信息创建设备文件。 为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些 参数是可以修改的,用于调整硬件工作特性。 配置管理udev的工具是:udevadmin、hotplug udev为设备创建文件时,会读取规则文件,/etc/udev/rules.d 及 /usr/lib/udev/relus.d 配置文件书写格式: SUBSYSTEM=="block",KERNEL="sdb",NAME="myusb",SYMLINK="hahamyusb" # 重读配置文件 udevadm trigger ============================================================================================================================================== 二、initrad文件 1、解压initramfs文件 CentOS6: # 查看文件类型,发现是gzip格式压缩的文件 file initramfs-2.6.32-696.el6.x86_64.img # 修改文件名 mv file initramfs-2.6.32-696.el6.x86_64.img file initramfs-2.6.32-696.el6.x86_64.img.gz # 解压文件 gunzip initramfs-2.6.32-696.el6.x86_64.img.gz # 再次查看文件类型,ASCII cpio archive file file initramfs-2.6.32-696.el6.x86_64.img # 利用cpio接开归档文件 cpio -ivd < initramfs-2.6.32-696.el6.x86_64.img CentOS7: /usr/lib/dracut/skipcpio initramfs-3.10.0-514.el7.x86_64.img | zcat | cpio -ivd 2、制作initrad文件 1、CentOS6 格式: mkinitrd [OPTION...] [] 示例,为当前系统创建initrad: mkinitrd /boot/initramdfs-$(uname-r).img $(uname -r) dracut工具 dracut /boot/initramdfs-$(uname-r).img $(uname -r) 2、CentOS7 格式: dracut [-fv] [--add-drivers 列表] initramfs-$(uname-r).img $(uname -r) 选项: -f # 强制执行 示例: # 生成 initrad 文件 dracut -v initramfs-test.img $(uanme-r) # 给 initramfs 添加新模块 --add-drivers "e1000" --filesystems "ext4 nfs" ============================================================================================================================================== 三、编译内核 1、查看硬件信息 yum install pciutils # 查看CPU cat /proc/cpuinfo 或者 x86info 或者 lscpu # 查看USB lsusb [-v|-vv] # 查看pci总线设备 lspci [-v|-vv] # 查看每一个硬件的详细信息 hal-device 2、卸载内核 删除/lib/modules/目录下不需要的内核库文件 删除/usr/src/linux/目录下不需要的内核源码 删除/boot目录下启动的内核和内核映像文件 更改grub的配置文件,删除不需要的内核启动列表 3、编译 make -j N # 启用多线程编译 make config # 基于命令行以遍历的方式去配置内核的每个选项 make menuconfig # 字符的图形界面配置窗口 make defconfig # 基于内核为目标平台提供的“默认 ”配置进行配置 make allyesconfig # 所有选项均回答为yes make allnoconfig # 所有选项均回答为no ==============================================================================================================================================