回顧:
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以及編譯器自身的備份文件;