內核

  回顧:

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章