· Linux组成
· Linux: kernel+rootfs
· kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
· rootfs:程序和glibc
· 库:函数集合, function, 调用接口(头文件负责描述)
· 过程调用:procedure,无返回值
· 函数调用:function
· 程序:二进制执行文件
· 内核设计流派
· 单内核(monolithic kernel):Linux
· 把所有功能集成于同一个程序
· 微内核(micro kernel):Windows, Solaris
· 每种功能使用一个单独子系统实现
· 内核
· Linux内核特点
· 支持模块化:.ko(内核对象)
· 如:文件系统,硬件驱动,网络协议等
· 支持内核模块的动态装载和卸载
· 组成部分
· 核心文件:
· /boot/vmlinuz-VERSION-release
· ramdisk:辅助的伪根系统
· CentOS 5: /boot/initrd-VERSION-release.img
· CentOS 6,7: /boot/initramfs-VERSION-release.img
· 模块文件:
· /lib/modules/VERSION-release
· CentOS6启动流程
· 1、加载BIOS硬件信息,获取第一个启动设备
· POST:Power-On-Self-Test
· 加电自检,是BIOS功能的一个主要部分
· 负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测
· ROM:BIOS,Basic Input and Output System
· 保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
· RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
· 按次序查找引导设备,第一个有引导程序的设备为本次启动设备
· 2、读取第一个启动设备MBR的引导加载程序(grub)的启动信息
· bootloader: 引导加载器,引导程序
· windows: ntloader
· Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
· LILO:LInux LOader
· GRUB: GRand Unified Bootloader
· GRUB 0.X: GRUB Legacy, GRUB2
· MBR:
· 446: bootloader, 64: 分区表, 2: 55AA
· GRUB:
· primary boot loader : 1st stage,1.5 stage
· secondary boot loader :2nd stage,分区文件
· 3、加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
· kernel
· 自身初始化
· 探测可识别到的所有硬件设备
· 加载硬件驱动程序(借助于ramdisk加载驱动)
· ramdisk
· 内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动
· ramdisk --> ramfs 提高速度
· CentOS 5: initrd
· 工具程序:mkinitrd
· CentOS 6,7: initramfs
· 工具程序:mkinitrd, dracut
· ramdisk文件的制作
· (1) mkinitrd命令
· 为当前正在使用的内核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
· (2) dracut命令
· 为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
· 以只读方式挂载根文件系统
· 运行用户空间的第一个应用程序:/sbin/init
· POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(systemd)
· 4、核心执行init程序,并获取默认的运行信息
· init程序的类型
· SysV: init, CentOS 5之前
· 配置文件:
· /etc/inittab
· Upstart: init,CentOS 6
· 配置文件:
· /etc/inittab
· /etc/init/*.conf
· Systemd:systemd, CentOS 7
· 配置文件:
· /usr/lib/systemd/system
· /etc/systemd/system
· 5、init程序执行/etc/rc.d/rc.sysinit文件
· CentOS 5的inittab文件
· 配置文件:/etc/inittab
· 每一行定义一种action以及与之对应的process
· id:runlevel:action:process
· action
· wait: 切换至此级别运行一次
· respawn:此process终止,就重新启动之
· initdefault:设定默认运行级别;process省略
· sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
· ca::ctrlaltdel:/sbin/shutdown -t3 -r now
· id:3:initdefault:
· si::sysinit:/etc/rc.d/rc.sysinit
· l0:0:wait:/etc/rc.d/rc 0
· l1:1:wait:/etc/rc.d/rc 1...
· l6:6:wait:/etc/rc.d/rc 6
· CentOS 6 /etc/inittab和相关文件
· /etc/inittab
· 设置系统默认的运行级别
· id:3:initdefault
· 示例
· 破解CentOS5和6的root口令
· 启动系统时,设置其运行级别1,进入单用户模式
· (1) 编辑grub菜单(选定要编辑的title,而后使用e命令)
· (2) 在选定的kernel后附加1, s, S或single都可以
· (3) 在kernel所在行,键入“b”命令
· init读取其初始化文件:/etc/inittab
· 初始运行级别(RUN LEVEL)
· 系统初始化脚本
· 对应运行级别的脚本目录
· 捕获某个关键字顺序
· 定义UPS电源终端/恢复脚本
· 在虚拟控制台生成getty
· 在运行级别5初始化X
· /sbin/init CentOS6之前
· 运行级别:为系统运行或维护等目的而设定;0-6:7个级别
· 0:关机
· 1:单用户模式(root自动登录), single, 维护模式
· 2: 多用户模式,启动网络功能,但不会启动NFS;维护模式
· 3:多用户模式,正常模式;文本界面
· 4:预留级别;可同3级别
· 5:多用户模式,正常模式;图形界面
· 6:重启
· 默认级别: 3, 5
· 切换级别:init #
· 查看级别:runlevel ; who -r
· /etc/rc.d/rc.sysinit:系统初始化脚本
· (1)设置主机名
· (2)设置欢迎信息
· (3)激活udev和selinux
· (4)挂载/etc/fstab文件中定义的文件系统
· (5)检测根文件系统,并以读写方式重新挂载根文件系统
· (6)设置系统时钟
· (7)激活swap设备
· (8)根据/etc/sysctl.conf文件设置内核参数
· (9)激活lvm及software raid设备
· (10)加载额外设备驱动程序
· (11)清理操作
· 6、启动核心的外挂模块
· rc N --> 意味着读取/etc/rc.d/rcN.d/
· K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
· S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
· for srv in /etc/rc.d/rcN.d/K*; do
· $srv stop
· done
· for srv in /etc/rc.d/rcN.d/S*; do
· $srv start
· done
· chkconfig命令
· 查看服务在所有级别的启动或关闭设定情形:
· chkconfig [--list] [name]
· 添加
· SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
· chkconfig --add name
· #!/bin/bash
· #LLLL 表示初始在哪个级别下启动,-表示都不启动
· # chkconfig: LLLL nn nn
· 修改指定的链接类型
· chkconfig [--level levels] name <on|off|reset>
· --level LLLL: 指定要设置的级别;省略时表示2345
· 删除
· chkconfig --del name
· ntsysv
· service 命令
· service 服务 start|stop|restart
· service --status-all
· xinetd管理的服务
· 瞬态(Transient)服务被xinetd进程所管理
· 进入的请求首先被xinetd代理
· 配置文件:
· /etc/xinetd.conf
· /etc/xinetd.d/<service>
· 7、init执行运行各个批处理文件(scripts)
· 注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本
· 8、init执行/etc/rc.d/rc.local
· /etc/rc.d/rc.local在指定运行级别脚本后运行
· 不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中
· 9、执行/bin/login程序,等待用户登录
· 1:2345:respawn:/usr/sbin/mingetty tty1
· 2:2345:respawn:/usr/sbin/mingetty tty2
· ...
· 6:2345:respawn:/usr/sbin/mingetty tty6
· mingetty会自动调用login程序
· x:5:respawn:/etc/X11/prefdm-nodaemon
· 10、登录之后开始以Shell控制主机
· 自制Linux系统
· 分区并创建文件系统
· fdisk /dev/sdb
· 两个必要的分区
· /dev/sdb1对应/boot
· /dev/sdb2对应根/
· 挂载boot
· mkdir /mnt/sysimage/boot 子目录必须为boot
· mount /dev/sdb1 /mnt/sysimage/boot
· 安装grub
· grub-install --root=/mnt/sysimage /dev/sdb
· 恢复内核和initramfs文件
· cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/sysimage/boot/
· cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/sysimage/boot
· 建立grub.conf
· vim /mnt/boot/grub.conf
· title wanglinux
· root (hd0,0)
· kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
· initrd /initramfs-2.6.32-642.el6.x86_64.img
· chroot /mnt/sysimage
· 建立根目录
· mkdir /mnt/sysimage
· mount /dev/sdb2 /mnt/sysimage
· mkdir –pv /mnt/sysimage/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
· 复制bash和相关库文件
· 复制相关命令及相关库文件
· 如:ls,cat,vim,reboot,hostname等
· Rescue mode
· 在根(边界)文件系统无法使用时需要,如/bin/mount删除
· 对系统没有特殊要求
· 从光盘引导(boot.iso或者安装光盘#1)
· 从USB盘(由boot.iso制作)引导
· 文件系统重组
· Anaconda将会询问是否应该挂载文件系统
· /mnt/sysimage/*
· /mnt/stage2
· $PATH包括硬盘的目录
· mknod了解major/minor
· 系统配置文件丢失修复
· 系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动。此时,只有通过救援模式才可以解决此类问题
· 有备份文件的恢复方法
· 进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行
· chroot /mnt/sysimage
· cp /etc/inittab.bak /etc/inittab
· 没有备份文件的恢复办法
· 如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包
· chroot /mnt/sysimage
· rpm -qf /etc/inittab
· initscripts-9.03.49-1.el6.centos.x86_64
· exit 退出chroot模式
· 挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下)
· mount /dev/sr0 /mnt/source
· CentOS6系统的RPM包存放在光盘Package目录下,要修复的硬盘系统的根目录在/mnt/sysimage下,需要使用--root选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包
· rpm -ivh --replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
· 其中的rpm命令选项“--replacepkgs”表示覆盖安装,执行完成后,即已经恢复了此文件
· 如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,执行命令:rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv./etc/inittab
· cp etc/inittab /mnt/sysimage/etc
· 注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可
· /proc目录
· /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 “websrv” > /proc/sys/kernel/hostname
· sysctl命令
· 默认配置文件:/etc/sysctl.conf
· (1) 设置某参数
· sysctl -w parameter=VALUE
· (2) 通过读取配置文件设置参数
· sysctl-p [/path/to/conf_file]
· (3) 查看所有生效参数
· sysctl-a
· 常用的几个参数
· net.ipv4.ip_forward
· net.ipv4.icmp_echo_ignore_all
· vm.drop_caches
· /sys目录
· sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;
· 有些参数是可以修改的,用于调整硬件工作特性
· udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序
· udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下
· 内核编译
· 单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
· 内核组成部分:
· kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSIONRELEASE
· kernel object: 内核对象,一般放置于/lib/modules/VERSION-RELEASE/
· [ ]: N
· [M]: M
· [*]: Y
· 辅助文件
· initrd
· initramfs
· 内核版本
· 运行中的内核
· uname命令
· uname - print system information
· uname [OPTION]...
· -n: 显示节点名称;
· -r: 显示VERSION-RELEASE;
· -a:显示所有信息
· 内核模块命令
· lsmod命令
· 显示由核心已经装载的内核模块
· 显示的内容来自于: /proc/modules文件
· modinfo命令
· 显示模块的详细描述信息
· modinfo [ -k kernel ] [ modulename|filename... ]
· -n: 只显示模块文件路径
· -p: 显示模块参数
· -a: author
· -d: description
· -l: license
· lsmod |grep xfs;modinfo xfs
· 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... ]
· insmod `modinfo –n exportfs`
· lnsmod `modinfo –n xfs`
· rmmod命令:卸载模块
· rmmod [ modulename ]
· rmmod xfs
· rmmod exportfs
· 编译内核
· 准备
· (1) 准备好开发环境
· 包组(CentOS 6):
· Server Platform Development
· Development Tools
· openssl-devel
· (2) 获取目标主机上硬件设备的相关信息
· CPU:
· #cat /proc/cpuinfo
· #x86info -a
· #lscpu
· PCI设备
· lspci
· -v
· -vv
· lsusb
· -v
· -vv
· lsblk 块设备
· 了解全部硬件设备信息
· hal -device (centos 6)
· (3) 获取目标主机系统功能的相关信息
· 例如:需要启用相应的文件系统
· (4) 获取内核源代码包
· www.kernel.org
· .config:准备文本配置文件
· make menuconfig:配置内核选项
· make [-j #]
· make modules_install:安装模块
· make install :安装内核相关文件
· 安装bzImage为/boot/vmlinuz-VERSION-RELEASE
· 生成initramfs文件
· 编辑grub的配置文件
· 如何交叉编译内核
· 编译的目标平台与当前平台不相同
· make ARCH=arch_name
· 要获取特定目标平台的使用帮助
· make ARCH=arch_name help
· make ARCH=arm help
· 在已经执行过编译操作的内核源码树做重新编译
· 需要事先清理操作:
· make clean:清理大多数编译生成的文件,但会保留config文件等
· make mrproper: 清理所有编译生成的文件、config及某些备份文件
· make distclean:mrproper、patches以及编辑器备份文件
· 卸载内核
· 删除/lib/modules/目录下不需要的内核库文件
· 删除/usr/src/linux/目录下不需要的内核源码
· 删除/boot目录下启动的内核和内核映像文件
· 更改grub的配置文件,删除不需要的内核启动列表