回顾:
systemd
kernel
ko文件管理工具:
lsmod,moninfo,depmod,insmod,rmmod,modprobe
Kernel (2)
ramdisk管理:
ramdisk文件是在操作系统安装完成之后,由特定的应用程序根据当前硬件设备信息,文件系统信息等量身定制而成;
ramdisk文件的制作工具:
CentOS 5:
mkinitrd
mkinitrd - creates initial ramdisk p_w_picpaths for preloading modules为预加载模块创建初始的虚拟磁盘映像
mkinitrd initrd-KERNEL-VERSION.img kernel-version
CentOS 6/7:
dracut
dracut - create initial ramdisk p_w_picpaths for preloading modules为预加载模块创建初始的虚拟磁盘映像
dracut initramfs-KERNEL-VERSION.img kernel-version
mkinitrd脚本
内核信息输出的两个重要的伪文件系统:
/proc:内核状态及统计信息的主要的输出接口
/proc/sys:能够输入配置信息,完成内核参数实时配置的接口
/proc/*(除了sys目录):信息输出,只读;
/proc/sys:可读写,可以接受用户指定的"新值",来实现对内核相应功能或特性的实时配置;
查看内核输出的状态信息或统计信息,直接使用cat命令即可;
修改或设置内核功能或特性:
使用echo命令,借助于覆盖输出重定向进行修改或设置即可;
echo "VALUE" > /proc/sys/PATH/TO/PARAMETER
查看内核参数以及配置/proc/sys中的诸多功能,还可以使用:
sysctl命令:
sysctl - configure kernel parameters at runtime
查看内核参数:
sysctl -a:查看所有可以被修改的内核参数;
sysctl variable:查看指定内核参数的设定值;
配置某个内核参数(功能或特性)的值:
sysctl -w variable=value
注意:在此方法中,"="两端不能写空格字符;
sysctl -p:根据配置文件设置内存参数值;重新读取并加载配置文件中所有的设置参数并且使其生效;
常用的几个内核参数:
net.ipv4.ip_forward:Linux的核心转发功能,路由功能;取值0,1
net.ipv4.icmp_echo_ignore_all:忽略所有来源于外部主机的ping操作请求,取值0,1
vm.drop_caches:清理buffer和cache,释放物理内存,取值:0,1,2
kernel.hostname:当前生效的主机名;
DDOS:Dynamic Deny Of Service,动态拒绝服务***;
DHCP:IP地址耗尽策略,发送大量随机MAC地址DHCP discover消息
DNS:ARP***,ARP欺骗,
网关欺骗
源IP地址欺骗
dead ping:
/sys:sysfs
专门为用户提供的伪文件系统,输出内核识别出来的各硬件设备的相关属性信息,也包括内核对硬件特性的可设定的信息;对于某些参数进行特定格式的修改,以调整或设定硬件的工作特性;
echo '- - -' > /sys/class/scsi_host/host2/scan
udev:
通过读取/sys目录下的硬件设备的信息,按需为各硬件设备创建设备文件;
udev是运行在用户空间的进程;
专用工具:udevadmin,hotplug...
当内核已经被加载至内存中,加入操作系统被安装到sda磁盘上,则内核需要先标识出sda磁盘并且将其标记为设备(创建设备文件),而后才能挂载此设备;
为了能够让这样的设备以后也能正常使用,内核通过内置的devtmpfs为每个内核所要使用的设备创建设备文件;而这样的文件可以在被当做文件系统挂载之后,从内核直接转移到真正的rootfs中的dev目录内的;对于操作系统启动之后被新插入的设备,就必须要依靠udev来识别并创建设备文件了;
udev之所以能够为设备创建设备文件,主要依赖于其事先定义好的规则;而这样的规则一般保存在udev的规则配置文件中;
/etc/udev/rules.d
/usr/lib/udev/rules.d
定制内核——编译内核源代码:
http://kernel.org 内核维护的官方站点,可以获取内核源代码包;
编译源代码的前提条件:
1.开发环境:
开发工具:gcc,make,automake,qt,GTK,ncurses
程序包组:
"Development Tools", "Server Platform Development"
"开发工具", "服务器平台开发"
ncurses-devel
头文件:/usr/include/*.h
2.获取目标主机上各硬件设备的相关信息;
CPU:
# cat /proc/cpuinfo
# lscpu
# x86info -a
PCI设备:
# lspci [-v|-vv]
USB设备:
# lsusb [-v|-vv]
块设备:
# lsblk
了解更多的硬件设备的信息:
# hal-device (CentOS6可用,包名:hal-0.5.14-14.el6.x86_64)
3.获取目标主机系统功能的相关选项:
比如:目标主机需要使用哪种文件系统;
目标主机是否需要启用安全防护机制;
...
编译安装应用程序的一般步骤:
1) # ./.configure ARG1 [ARG2...]
2) # make
3) # make install
编译安装内核的一般步骤:
1.需要准备或生成一个.config的文件,该文件记录了内核的编译细节:
哪些功能直接编译进内核;
哪些功能编译成内核模块;
哪些功能在此次编译中不启用;
make menuconfig|xconfig|gconfig|config
2.开始编译内核
make [-j #]
多线程编译,可以将编译进程在多个CPU核心上并行进行,加快编译速度;
3.安装模块:
make modules_install
4.安装内核核心文件,并生成grub的启动菜单;
make install
安装的是bzImage文件,安装到/boot/vmlinuz-VERSION-release;
生成与内核版本完全匹配的initramfs文件;
编辑grub的配置文件,生成启动菜单项;
screen命令:
开启screen:
# screen
拆除screen:
ctrl+a,d
列表显示screen:
# screen -ls
恢复连接至指定的screen:
# screen -r SCREEN_ID
关闭screen:
# exit
内核的配置选项:
64-bit kernel
是否支持64位内核
General setup --->
通用配置项
() Local version - append to kernel release
自定义本地版本号,附加到内核版本号后面的信息,由编译者定义;
((none)) Default hostname
定义当没有设置主机名时的默认主机名;
Enable loadable module support
是否支持内核模块的动态装卸载;
Enable the block layer
是否支持启用块层,通常是选择支持;
processor type and features:
处理器类型和特性
Processor family (Generic-x86-64) --> (Core 2/newer Xeon)
选择处理器类型
Power management and ACPI options:
电源管理及高级电源管理接口选项
Executable file formats / Emulations
指定可执行文件的格式,默认为ELF,以#!开头的文件也具备可执行特性;
Networking support:
内核中的网络协议栈
Networking options
[ ] IPv6 support
Device drivers:
设备驱动程序
File system:
DOS/FAT/NT file systems
[M] NTFS support
Kernel hacking:
内核调试的相关内容
Security options:
NSA SELInux support
安全选项
Cryptographic API:
加密解密的应用编程接口;
Virtualization:
虚拟化相关
配置内核方式:
1. make config:基于单行命令行以遍历内核所有功能的方式进行内核配置,因此每个内核选项的配置都是交互式的;
2. make menuconfig:基于curses的文本模式的配置窗口;
3. make gconfig:基于GTK开发环境的窗口配置界面;一般情况下,只要安装了"桌面平台开发"程序包组就可以了;
4. make xconfig:基于QT开发环境的窗口配置界面;一般情况下,只要安装了"桌面平台开发"程序包组就可以了;
5. make defconfig:基于内核为目标平台提供默认配置模版进行配置;
6. make allnoconfig:所有的功能全部不编译(全部选no)配置方式;
7. make allyesconfig:所有的功能全部编译进核心(全部选yes)的配置方式;
内核的编译方式:
1.全编译:make [-j #]
2.部分编译:
a.只编译某个子目录中的相关源代码;
# cd /usr/src/linux
# make [-j #] DIR_NAME/
b.只编译特定的模块
# cd /usr/src/linux
# make [DIR/]file.ko
示例:
# cd /usr/src/linux
# make drivers/net/ethernet/intel/e1000/e1000.ko
3.交叉编译:编译的目标平台与当前编译的平台不相同;
make ARCH=arch_name
示例:
make ARCH=arm
内核重新编译:
1.将所有/usr/src/linux-VERSION目录的内容直接删除,重新从源代码包释放;随后可以重复之前的步骤重新编译即可;
2.先清理之前的编译结果:
make clean:
清理大多数的编译生成的文件,但是会保留.config文件;
make mrproper:
清理所有编译生成的文件,包括.config以及其他的备份文件;
make distclean:
相当于make mrproper,但是还会额外清理各种patches以及编译器自身的备份文件;