回顾:

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以及编译器自身的备份文件;