其實內核就是系統上面的一個文件,包含了驅動主機各項硬件的檢測程序與驅動模塊,而Linux的內核是單內核體系,且是模塊化的
內核的組成部分:
核心文件:/boot/vmlinuz-VERSION
模塊文件:/lib/modules/VERSION/
*.ko: 模塊間或許存在依賴關係;
ramdisk: 非必須性內容;只是用於實現內核在無法加載根文件設備時提供
內核模塊管理:
lsmod命令:列出已經裝載的模塊
另一種辦法:# cat /proc/modules
modinfo: 查看指定模塊的詳細信息
modinfo [OPTIONS] MOD_NAME
-n模塊名: 只顯示模塊文件路徑
顯示出的信息中:
depends: 顯示被此模塊所依賴的其它模塊;
例: modinfo -n e1000
modprobe命令:實現模塊的裝載和卸載
裝載:modprobe MOD_NAME
注意:會自動解決依賴關係;
例:modprobee1000
卸載:modprobe -r MOD_NAME
例:modprobe-r e1000
手動實現模塊文件裝載和卸載
裝載:insmod命令
insmod/path/to/module_file
注意:不會自動解決依賴關係;
例:insmod`modinfo -n ext3`
卸載:rmmod命令
rmmodMOD_NAME
例:rmsmod ext3
與內核交互:
/proc僞文件系統接口
每個文件名均是內核參數,目錄名爲內核參數節點(子系統或子功能)信息;
例: net.ipv4.ip_forward = 1
/proc/sys/net/ipv4/ip_forward
/proc下的只讀文件:輸出內核信息
/proc下的讀寫文件:可修改的內核工作特性/proc/sys目錄下
僞文件系統:文件不能夠直接使用編輯器編輯;修改方法:
(1) echo
echo"New_Value" > /proc/sys/path/to/somefile
例:echo "lx">/proc/sys/kernel/hostname
(2) sysctl -w
sysctl-w path.to.somefile=New_Value
例如:/proc/sys/net/ipv4/ip_forward
echo"1" > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
注意:此兩種設定立即生效,但內核重啓後無效;
(3) 內核參數配置文件/etc/sysctl.conf
path.to.paramter= NEW_VALUE
例:net.ipv4.ip_forward =1
注意:此種設定不能立即生效;使其生效的方式:sysctl -p或重啓
查看當前運行中的內核的所有參數及其值:sysctl -a
/sys僞文件系統接口:
僞文件系統:sysfs;主要用於輸出內核識別出的各硬件設備的相關屬性信息;還能夠讓用戶修改某些參數的值來改變硬件的工作特性;
用戶空間的應用程序:udev通過讀取/sys目錄下保存硬件設備的相關信息來爲每個當前內核探測到的硬件設備創建設備文件;創建設備文件的文件權限、名稱等屬性是可定製的;
udev有規則文件:/etc/udev/rules.d/
例如:修改網卡設備名字;
vim /etc/udev/rules.d/70-persistent-net ;要生效則要先卸載網卡模塊,在裝上即可;即modprobe -r e1000 在modprobe e1000
ramdisk:
uname命令:
-r: 內核的release號;
-n: 主機名;
-a: 顯示所有信息;
ramdisk製作:
CentOS5: mkinitrd
CentOS6: dracut, mkinitrd
dracut [OPTION]... <p_w_picpath> <kernel-release>
-m LIST: 模塊列表
-d LIST: 驅動列表
例如:#dracut /boot/initramfs-$(uname -r).img $(uname -r)
手動修改:
展開initramfs文件:
#cp initramfs-2.6.32-504.el6.x86_64.img /tmp
#cd /tmp
#mv initramfs-2.6.32-504.el6.x86_64.img initramfs-2.6.32-504.el6.x86_64.img.gz
#gzip -d initramfs-2.6.32-504.el6.x86_64.img
#mkdir ramdisk
#cd ramdisk
#cpio -id < ../initramfs-2.6.32-504.el6.x86_64.img
歸檔:
#find . | cpio -o -H newc --quiet > /boot/myramdisk.img
#gzip /boot/myramdisk.img
#mv /boot/myramdisk.img.gz /boot/myramdisk
常用的內核參數:/proc/sys
kernel.hostname:主機名
net.ipv4.ip_forward: 本機的路由功能,開啓或關閉在接口之間轉發報文的功能;
/proc/sys/net/ipv4/icmp_echo_ignore_all:0表示不忽略所有人的ping請求,1表示忽略
內核編譯:
準備工作:
(1) 要充分獲知目標硬件設備的信息;
(2) 充分獲知目標系統平臺的各相關信息,如文件系統類型等;
(3) 打算啓用的新功能;
(4)準備好軟件開發環境及內核源代碼樹;
獲取硬件設備信息:
(1)CPU
#cat /proc/cpuinfo
#lscpu
#x86info -a
(2)PCI
#lspci [-v]
#lsusb [-v]
#lsblk
(3)hal-device
hal:hardware abstract layer
開發環境及源碼:
(1) 安裝開發包組:Development Tools, Server Platform Development
(2) 獲取內核源碼:www.kernel.org
內核編譯步驟
1.解壓內核源碼
tar -Jxf linux-3.10.67.tar.xz
2.內核功能的選擇
進入解壓的目錄下,用make menuconfig命令選定配置:
用空格鍵切換:
[ ] 不啓用此功能
[M] 編譯成內核模塊
[*] 編譯進內核
注意:要保存退出;所有選定的配置會保存在.config隱藏文件中;
3.編譯:
(1)在解壓的目錄下用make命令先創建MakeFile文件
# make help:獲取make命令的使用幫助
選定配置(其中一種即可,但偶爾會結合兩種或以上的方式進行):
# make config:遍歷每個選項
# make menuconfig:打開文本窗口
# make xconfig:Qt窗口,依賴於KDE開發組件;
# make gconfig:gtk窗口,依賴於GTK開發組件;
# make allnoconfig: 所有可選擇項均不選擇;
結果會保存至內核選項的配置文件中:.config
(2)安裝內核模塊:
#make modules_install
安裝在/lib/modules/VERSION
(3)安裝內核:
#make install
注:編譯時可以在終端使用screen命令,以免斷開連接等意外
screen命令:
打開:# screen
終止:# exit
拆除:Ctrl+a, d
查看所有已經打開的screen ID:# screen -ls
恢復連接至某screen: # screen -r SCREEN_ID
4.重啓系統,即可選擇使用新內核
內核編譯進階:
1、在原有曾經編譯過的內核源碼基礎上再次進行重編譯之前,要清理源代碼;
# make clean: 保留.config配置文件及外部模塊的相關文件;
# make mrproper:刪除所有編譯生成的文件,包括.config和各種備份文件;
# make distclean: 相當mrproper,以及刪除編輯器備份及補丁文件,相當於編譯之前;
2、只編譯其中部分代碼:
(1) 只編譯選定目錄中的代碼
#make dir/
(2) 只編譯一個模塊
#make dir/file.[oisS]
(3) 完整編譯一個模塊
#make dir/file.ko
3、查看內核版本信息
#make kernelrelease
#make kernelversion
4、只編譯內核核心,不編譯模塊
#make bzImage
5、交叉編譯
編譯操作所在的平臺非目標代碼運行的平臺,事實上,目標代碼將運行於另一個不同的平臺;
#make ARCH=arch_name
要獲取目標平臺的幫助:
#make ARCH=arch_name help
例如:
#make ARCH=arm bockw_defconfig
CentOS系統安裝:
安裝過程:通過安裝程序anaconda來進行;
bootloader--> vmlinuz, initrd.img --> anaconda
anaconda支持兩種模式:
GUI:圖形界面
text:文本界面
anaconda把安裝過程分成三個階段:
安裝前配置階段:
鍵盤類型
語言
時區
管理員密碼
磁盤及其分區方式
要安裝的程序包
安裝階段:
在目標磁盤創建分區、執行格式化;
將選定的程序包安裝至目標磁盤;
生成bootloader;
第一次啓動:
配置iptables, selinux, core dump
系統安裝的基本分區:
/ : 根分區
swap:交換分區
注意:如果根分區放置於邏輯卷,由於grub無法驅動並訪問邏輯卷,就必須將/boot單獨分區,並使用基本磁盤分區
anaconda支持通過讀取kickstart配置文件的內容來完成安裝過程的配置:
系統安裝後會在管理員的家目錄下生成/root/anaconda-ks.cfg,用於保存其安裝配置信息
kickstart文件即/root/anaconda-ks.cfg的組成:
命令段
程序包段:%packages, %end
@group
package[表示安裝這個包組]
-package[表示不安裝這個包組,但是如果它被其他包依賴的話就算減掉也會被安裝的]
腳本段:
%pre
安裝前腳本:安裝過程開始之前要執行的腳本;
注意:此時的Linux系統環境爲微縮版環境,因此腳本應該較簡單;
%post
安裝後腳本:安裝過程完成之後要執行的腳本;
注意:腳本執行環境爲完整的已經安裝完成的系統;
配置kickstart的方式:
(1) 手動編輯配置文件[有可能會有語法錯誤];
(2) system-config-kickstart,GUI工具[不支持配置LVM];
安裝過程如何獲取並使用kickstart文件:
(1) 放置於安裝程序能夠獲取到的位置;
(a) 放置於光盤鏡像;
(b) 網絡文件服務器;
要求:安裝程序得支持網絡功能,且能夠訪問到網絡文件服務器;
安裝過程的安裝引導選項
按Esc鍵進入boot提示符界面
boot:
linux:默認安裝模式
linux text:文本安裝模式
與網絡相關的引導選項:
ip=IPADDR
例ip=192.168.1.107
netmask=MASK
gateway=GW
dns=DNS_SERVER_IP
ifname=NAME:MAC_ADDR
指明獲取 kickstart 文件的路徑:
ks=
DVD drive ks=cdrom:/path/to/kickstart_file
HTTP Server ks=http://server_ip:port/path/to/kickstart_file
HTTPS Serverks=https://server_ip:port/path/to/kickstart_file
FTP Server ks=ftp://serverip:port/path/to/kickstart_file
NFS Server ks=nfs:server_ip:/path/to/kickstart_file
創建一個引導光盤:僅幫助啓動安裝過程,不提供安裝樹:
(1) 準備工作目錄,例如這裏使用/tmp/dvd;
mkdir/tmp/dvd
(2) 掛載系統發行光盤,複製isolinux目錄至/tmp/dvd;
mount/dev/cdrom /mnt
mkdir/tmp/dvd/isolinux
cp/mnt/isolinux/* /tmp/dvd/isolinux
chmodu+x /tmp/dvd/isolinux -R
(3) 複製製作好的kickstart文件ks.cfg至/tmp/cdrom某位置;
將/root/anaconda-ks.cfg修改成合適的kickstart文件並命名爲ks.cfg
cp/root/ks.cfg /tmp/dvd
(4) 如果需要,可以編輯/tmp/dvd/isolinux/isolinux.cfg
在某label後的append指令後附加ks=cdrom:/ks.cfg信息,從而實現自動調用光盤上提供的ks文件;
若ks.cfg在服務器上,就必須進入boot命令行,設置ip地址
即boot> linux
boot> ip=192.168.1.107
(5) 創建iso鏡像:這個命令必須在dvd的父目錄執行[創建好的iso鏡像在/root下]
# mkisofs -R -J -T -v --no-emul-boot--boot-load-size 4 --boot-info-table -V "CentOS 6.6 X86_64 boot disk"-b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso dvd/
注意:當ks.cfg在光盤上時,可以不用手動設置ip地址,可在ioslinux.cfg文件中直接設置。而且若光盤上還有安裝樹,可以不用連接網絡直接安裝。
而當ks.cfg在網絡服務器上時,就必須在boot提示符界面下手動指定ip地址,才能去連接網絡獲取安裝程序