1、centos系统启动流程:
post(检测硬件环境)--->bootloader(根据bios中的设置去查找从哪个设备启动,然后根据选择的设备上的mbr去引导grub的第一阶段,启动系统)--->加载内核(运行放置于initrd中的内核镜像)--->roofs(以只读方式挂载根文件系统)--->switchroot(根切换为正式的root根文件系统)--->/sbin/init(用户空间的第一个程序)
2、内核设计体系:单内核设计、微内核设计两种
linux属于单内核设计,但是它充分借鉴了微内核体系的设计优点(为内核引入了模块化机制)
3、linux内核的组成部分:
主要有三部分:vmlinuz(内核的核心)、kernel object(内核对象)、ramdisk(辅助性文件)
3.1、vmlinuz:内核的核心 vmlinuz一般为bzimage压缩的文件;通常位于/boot目录下,名称为:vmlinuz-version-release |
3.2、kernel object:内核对象 kernel object内核对象即内核模块,一般放置于//lib/modules/version-release //注意:内核模块的版本号version-release信息必须和内核核心文件的版本号一致 内核模块的选择: [ ] :N,不编译内核模块 [M]:modules,编译为内核模块,用到时编译内核模块,不用时则不编译,这样做的好处是:虽然占用了磁盘了空间,但是减少了内存空间的占用 [*]:Y,编译进内核核心,这样做的好处是:节省了装载内核模块时间。
|
3.3、ramdisk:辅助性文件,并非必须的,这取决于内核是否能直接驱动rootfs所在的设备,如果可以则不需要,否则需要此文件。 ramdisk能够加载的驱动: 目标设备驱动:如scsi设备的驱动 逻辑设备驱动:如lvm设备的驱动 文件系统:如xfs文件系统的驱动 ramdisk是一个简装版的根文件系统,它是放在内存中的,它仅仅是为了能够找到真正的根文件系统存在的,真正根文件系统放在硬盘中,数据不会丢失。 |
注意:当看到系统启动完成后,内核已经加载完成了,我们看到的内核文件是静态的,此时修改内核文件,不会立即生效,重启后才生效。
4、内核信息查看:(内核信息对应的文件:/boot/vmlinuz-version-release)
4.1、uname:显示系统信息:
格式:uname [OPTION]...
option:
-r:显示发行号信息
如:[root@localhost ~]# uname -r
3.10.0-514.el7.x86_64
-n:显示当前主机名和hostname显示结果一样
[root@localhost ~]# uname -n
localhost.localdomain
[root@localhost ~]# hostname
localhost.localdomain
[root@localhost ~]#
-a:显示所有信息
[root@centos6 ~]# uname -a
Linux centos6.localdomain 2.6.32-358.el6.x86_64 #1 SMP Tue Jan 29 11:47:41 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@centos6 ~]#
4.2、内核模块(kernel object)信息查看:
lsmod:显示内核中的模块状态信息(显示已经装载的),lsmod是抽取/proc/modules文件中的信息,它显示的三个字段分别是:modules、size、used by(used by表示被引用的次数和被什么所引用) 如:[root@localhost ~]# lsmod Module Size Used by tcp_lp 12663 0 |
modinfo:显示linux内核特定模块信息,(能显示已装载的和未被装载的)。centos6上的命令,centos7没有此命令。 命令格式:modinfo [-0][-F field][-k kernelversion][-b basedir] module... -k:显示特定版本内核的模块信息,如果有多个内核同时存在,会用到此项 -F:显示指定字段的信息 -n:显示文件路径 如[root@centos6 ~]# modinfo ext4 filename: /lib/modules/2.6.32-358.el6.x86_64/kernel/fs/ext4/ext4.ko license: GPL description: Fourth Extended Filesystem author: Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others srcversion: 3780C48738D7031144B9762 depends: mbcache,jbd2 vermagic: 2.6.32-358.el6.x86_64 SMP mod_unload modversions [root@centos6 ~]# modinfo -F filename ext4 /lib/modules/2.6.32-358.el6.x86_64/kernel/fs/ext4/ext4.ko [root@centos6 ~]# modinfo -n ext4 /lib/modules/2.6.32-358.el6.x86_64/kernel/fs/ext4/ext4.ko [root@centos6 ~]# modinfo -F filename ext2 /lib/modules/2.6.32-358.el6.x86_64/kernel/fs/ext2/ext2.ko [root@centos6 ~]# 注意:modinfo是通过/lib/modules目录下与当前内核版本同名目录下的各文件获取的 [root@centos6 ~]# ls /lib/modules/2.6.32-358.el6.x86_64/ build modules.ccwmap modules.isapnpmap modules.seriomap vdso extra modules.dep modules.modesetting modules.symbols weak-updates kernel modules.dep.bin modules.networking modules.symbols.bin modules.alias modules.drm modules.ofmap modules.usbmap modules.alias.bin modules.ieee1394map modules.order source modules.block modules.inputmap modules.pcimap updates [root@centos6 ~]#
|
5、内核模块管理命令
5.1、modprobe命令(向内核中装载模块,或从内核中下载模块) 格式:modprobe [-v] [-V] [-C config-file] [-n] [-i] [-q] [-b] [modulename] [module parameters...] modprobe [-r] [-v] [-n] [-i] [modulename...] modprobe [-c] modprobe [--dump-modversions] [filename] modprobe MODULESNAME //安装模块,动态操作 modprobe -r MODULESNAME //卸载模块,动态操作 示例: [root@localhost ~]# lsmod | grep btrfs //查看有没有安装btrfs内核模块 [root@localhost ~]# [root@localhost ~]# modprobe btrfs //安装btrfs内核模块 [root@localhost ~]# lsmod | grep btrfs btrfs 1003474 0 zlib_deflate 26914 1 btrfs raid6_pq 97812 1 btrfs xor 21411 1 btrfs [root@localhost ~]# 注意:对使用中的模块不要随意卸载,尤其是默认安装的内核模块。 |
5.2、depmod命令:生成模块依赖关系(即内核模块依赖关系文件的生成工具) |
5.3、insmod命令:插入模块 rmmod命令:卸载模块 格式:insmod [filename] [module options...] //filename是指模块文件的文件路径 rmmod MODULESNAME 示例: [root@localhost ~]# modprobe -r btrfs [root@localhost ~]# lsmod | grep btrfs [root@localhost ~]# modinfo btrfs filename: /lib/modules/3.10.0-514.el7.x86_64/kernel/fs/btrfs/btrfs.ko license: GPL alias: devname:btrfs-control alias: char-major-10-234 alias: fs-btrfs rhelversion: 7.3 srcversion: DBE5027041B7F046DBC5525 depends: raid6_pq,xor,zlib_deflate intree: Y vermagic: 3.10.0-514.el7.x86_64 SMP mod_unload modversions signer: CentOS Linux kernel signing key sig_key: D4:88:63:A7:C1:6F:CC:27:41:23:E6:29:8F:74:F0:57:AF:19:FC:54 sig_hashalgo: sha256 [root@localhost ~]# insmod `modinfo -n btrfs` insmod: ERROR: could not insert module /lib/modules/3.10.0-514.el7.x86_64/kernel/fs/btrfs/btrfs.ko: Unknown symbol in module [root@localhost ~]# |
6、ramdisk文件管理:不是由内核生成的,而是由内核上提供的命令管理的
centos5/6/7:mkinitrd:
centos6/7:dracut
[root@localhost ~]# ls /boot | grep initramfs
initramfs-0-rescue-2870a7d09372452a93f532a5bc3afdad.img
initramfs-3.10.0-514.el7.x86_64.img //提供装载内核所需要的驱动,如果此文件不存在,则无法启动系统。可以自己创建
initramfs-3.10.0-514.el7.x86_64kdump.img
[root@localhost ~]#
mkinitrd命令:为当前使用中的内核重新制作ramdisk文件。 命令格式:mkinitrd [OPTION...] [ option: --with= --preload= 示例: mkinitrd /boot/initramfs-3.10.0-514.el7.x86_64.img 3.10.0-514.el7.x86_64 |
dracut命令:更底层的生成initramfs镜像的工具 格式: dracut [OPTION...] [ 示例: [root@localhost ~]# dracut /boot/initramfs-`uname -r`.img `uname -r` |
7、内核信息输出的伪文件系统:/proc、/sys ;系统调优一般是这两个目录下参数的设置调整
/proc /proc:内核状态和统计信息的输出接口;同时还提供一个配置接口:/proc/sys /proc下的参数分类:只读、可写 只读:信息输出;例如/proc/#/* //#表示数字, 可写:可接受用户指定的一个“新值”来实现对内核某功能或特性的配置;写权限仅root拥有;可写的参数位于:/proc/sys目录下 示例: [root@localhost ~]# ls /proc 1 16 271 2913 3020 3186 394 544 665 745 driver meminfo sysvipc 10 17 2713 292 3031 3253 395 545 666 749 execdomains misc timer_list 1003 18 2714 2930 3038 3257 396 546 676 760 fb modules timer_stats 1004 19 272 2944 3047 3258 397 547 677 8 filesystems mounts tty 1008 2 274 2951 3053 3274 398 563 678 9 fs mpt uptime 1019 20 2782 2955 3058 3315 399 565 679 94 interrupts mtrr version 1026 21 2787 2963 3062 3342 4 569 680 999 iomem net vmallocinfo 1027 2291 28 297 3067 3416 40 571 683 acpi ioports pagetypeinfo vmstat 1028 2414 282 2979 3071 3420 400 573 685 asound irq partitions zoneinfo 12 2420 283 2984 3072 3468 41 578 686 buddyinfo kallsyms sched_debug 13 2495 284 2988 3074 365 42 580 690 bus kcore schedstat 14 2503 286 2991 3077 366 43 583 692 cgroups keys scsi 1460 2528 2879 3 3078 376 481 6 696 cmdline key-users self 1473 26 288 30 3084 377 5 62 7 consoles kmsg slabinfo 1474 2677 29 3003 3091 38 504 621 700 cpuinfo kpagecount softirqs 1486 2689 290 3004 3092 39 506 640 701 crypto kpageflags stat 15 27 2903 3007 3121 391 518 650 703 devices loadavg swaps 1550 2703 2908 3018 3137 392 531 655 709 diskstats locks sys 1553 2706 291 302 3180 393 542 662 734 dma mdstat sysrq-trigger [root@localhost ~]# [root@localhost ~]# ls /proc/sys abi crypto debug dev fs kernel net sunrpc vm [root@localhost ~]# /proc/sys/net/ipv4/ip_forward相当于:/proc/sys/net.ipv4.ip_forward 修改/proc参数值得方法:sysctl命令、echo命令、cat命令 sysctl命令:专用于查看或设定/proc/sys目录下参数的值 sysctl命令格式: sysctl [options] [variable[=value]] [...] sysctl -p [file or regexp] [...] 查看内核参数设置 [root@localhost ~]# sysctl -a //查看所有内核参数设置 [root@localhost ~]# sysctl -a |grep ip_forward net.ipv4.ip_forward = 1 net.ipv4.ip_forward_use_pmtu = 0 [root@localhost ~]# [root@localhost ~]# sysctl net.ipv4.ip_forward //查看特定参数设置 net.ipv4.ip_forward = 1 [root@localhost ~]# 或 [root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward //另一种方法查看内核信息参数设置 1 [root@localhost ~]# 修改内核参数设置: 方法一: sysctl -w variable=value 方法二:echo "VALUE" > /proc/sys/PATH/TO/SOME_KERNEL_FILE 示例: #echo "host" > /proc/sys/kernel/hostname #uname -a 注意:通过sysctl和cat命令设定的内核参数,重启后会丢失配置。 方法三:通过配置文件修改内核参数 配置文件位置:/etc/sysctl.conf, /etc/sysctl.d/*.conf [root@localhost ~]# ls /etc/sysctl.conf /etc/sysctl.d/*.conf -ld -rw-r--r--. 1 root root 449 Nov 6 2016 /etc/sysctl.conf lrwxrwxrwx. 1 root root 14 Aug 29 20:05 /etc/sysctl.d/99-sysctl.conf -> ../sysctl.conf [root@localhost ~]# 示例: #vim /etc/sysctl.conf net.ipv4.ip_forward=1 //核心转发,即从一个网络转到另一个网络 重读配置文件:sysctl -p [/PATH/TO/CONFIG_FILE]
内核参数: net.ipv4.ip_forward:核心转发 vm.drop_caches:回收内存 kernel.hostname:主机名 net.ipv4.icmp_echo_ignore_all:忽略所有ping自己操作 |
/proc/sys目录: sys是一个伪文件系统,主要用来输出内核识别出的各硬件的相关属性信息,也有内核对硬件特性的可设置参数,对这些参数的修改,即可定制设备的相关工作特性。 udev:通过读取/sys目录下的硬件设备信息,按需为各硬件设备创建设备文件,udev是用户空间程序,专用工具有:devadmin、hotplug udev为设备创建设备文件时,会读取其实现定义好的规则文件,一般在/etc/udev/rules.d目录下以及/usr/lib/udec/rules.d目录下。 |