第八周知識總結
系統(tǒng)啟動和內(nèi)核管理
一.CentOS 6 的啟動管理
1. 加載BIOS的硬件信息,獲取第一個啟動設備
2. 讀取第一個啟動設備MBR的引導加載程序(grub)的啟動信息
3. 加載核心操作系統(tǒng)的核心信息,核心開始解壓縮,并嘗試驅(qū)動所有的硬件設備
4. 核心執(zhí)行init程序,并獲取默認的運行信息
5. init程序執(zhí)行/etc/rc.d/rc.sysinit文件,重新掛載根文件系統(tǒng)
6. 啟動核心的外掛模塊
7. init執(zhí)行運行的各個批處理文件(scripts)
8. init執(zhí)行/etc/rc.d/rc.local
9. 執(zhí)行/bin/login程序,等待用戶登錄
10. 登錄之后開始以Shell控制主機
Grub:分散在硬盤的不同空間:有的是以0101存在,有的是以文件形式
放在/boot/grub目錄下以及MBR前446個字節(jié)
1.3.2.1 grub 功能和組成
Centos6 Grub的三次階段:
第一階段stage1:MBR前446個字節(jié)
Stage1.5階段:加載第二階段所在分區(qū)的文件系統(tǒng) initramfs加載操作系統(tǒng)的根
提供根分區(qū)的驅(qū)動
第二階段stage2:放在/boot/grub/grub.conf里,記錄到內(nèi)核的路徑,
此文件不屬于任何包。安裝操作系統(tǒng)運行程序生成,grub實際上是聯(lián)系內(nèi)核和硬件之間的橋梁
通過記錄的路徑找到內(nèi)核,通過安裝anaconda(安裝向?qū)В┥?/strong>
Default=0(0指的是第一個內(nèi)核,系統(tǒng)里面可以允許多個內(nèi)核存在,1是指第二個內(nèi)核)
Timeout=5是在啟動時有五秒鐘選擇用哪個內(nèi)核
splashimage=(hd0,0)/grub/splash.xpm.gz是個背景圖片
hiddenmenu在啟動時默認隱藏內(nèi)核菜單,刪掉則會顯示
itle CentOS 6 (2.6.32-754.el6.x86_64內(nèi)核版本
vmlinuz-2.6.32-754.el6.x86_64 內(nèi)核路徑
root (hd0,0)第一個硬盤的第一個分區(qū)grub特殊描述方式相當于sda1,grub認為boot所在分區(qū)為根
initrd /initramfs-2.6.32-754.el6.x86_64.img內(nèi)核驅(qū)動文件放在這里,是個小型的linux系統(tǒng)的根
該文件是個gizp壓縮文件
需要解包的話使用gunzip命令,先修改文件后綴,解開之后是cpio格式,使用cpio-iv解開
root=UUID=bf543639-6204-42d7-a73a-1bc51032b951硬盤真正操作系統(tǒng)的根
Grub.Conf文件無法修復,只能手動寫
范例:誤刪除initramfs-2.6.32-754.el6.x86_64.img文件無法啟動,故障恢復
[root@centos6 ~]#rm -f /boot/initramfs-2.6.32-754.el6.x86_64.img
[root@centos6 ~]#reboot
#進入rescue模式
#chroot /mnt/sysimage
#mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
#sync
#exit
#exit
#reboot
范例:破壞內(nèi)核
誤刪除內(nèi)核文件/boot/vmlinuz-2.6.32-754.el6.x86_64無法啟動,故障恢復
光盤里面就有內(nèi)核包 ,可以重新裝內(nèi)核包,但是因為一個文件損壞重裝有些麻煩
光盤里面isolinux文件下有vmlinuz內(nèi)核包
[root@centos6 ~]#rm -f /boot/vmlinuz-2.6.32-754.el6.x86_64
[root@centos6 ~]#reboot
#進入rescue模式
#chroot /mnt/sysimage
#mount /dev/sr0 /mnt/
#cp /mnt/isolinux/vmlinuz /boot/vmlinuz-2.6.32-754.el6.x86_64
#sync
#exit
#reboot
一階段損壞 啟動失敗 系統(tǒng)認為硬盤不具有啟動功能
修復方法1:重新安裝
重啟 快速按esc鍵 進入第三項CD-ROM Drive 光盤啟動
進入rescue installd system 救援模式
語言默認
Setup netwoking NO
Rescue continue
Ok
硬盤的根實際上被掛到/mnt/sysimage下
chroot /mnt/sysimage 切根
grub-install /dev/sda 重新安裝
Sync 進行同步
Reboot重啟ctrl alt+delete
修復方法2:
使用grub修復所有階段
root (hdo,0)表示第一個硬盤的第一個分區(qū)
root (hd0,0)
Set up(hd0)
修復完畢
實際上修復的所有階段
1.5階段損壞:破壞27個扇區(qū),系統(tǒng)認為具有啟動功能但是進去之后找不到驅(qū)動,界面閃爍
修復:
光盤啟動,進入rescue模式
#chroot /mnt/sysimage
#grub-install /dev/sda
#sync
#按 ctrl+alt+delete 三個鍵重啟動
加載init
關掉快捷鍵ctrl+delete+alt 重啟:
vim /etc/init/control-alt-delete.conf
在這一行前面加上#注釋掉exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
1.3.4INIT初始化
Runlevel:即運行級別,可以定義在不同模式下服務是否啟動,不同模式就是服務開啟的不一樣
/etc/rc.d/rc 控制服務腳本的開機自動運行的服務
/etc/rc.d放的是7種模式rc服務腳本以及服務軟鏈接
說明:rc N --> 意味著讀取/etc/rc.d/rcN.d/
K: K##:##運行次序;數(shù)字越小,越先運行;數(shù)字越小的服務,通常為依賴到別的服務
S: S##:##運行次序;數(shù)字越小,越先運行;數(shù)字越小的服務,通常為被依賴到的服務
兩個服務1 2 先開的是S1 后開的是S2 那么關的時候則是S2先關 變成K1 ,S1變成K2
如果兩者有依賴關系 那么是S2依賴S1,先開的服務被依賴,先關的服務依賴于別人
范例:修改Satd95為關閉狀態(tài):S95atd實際上是文件/init.d/atd的軟鏈接
刪除S95atd,打開/etc/init.d/atd 查看chkconfig 95是S的編號,變成K則是5
然后ln -s ..init.d/K05atd
下次開機atd則不啟動
結束
切換在centos6中想再次啟動除了以上方法之外還以可以:
方法一:
也可以使用ntsysv命令進入界面,找到atd空格就可以,但是缺點在第三模式下只能改一種模式的atd,如果想改5模式的atd 需要使用ntsysv --level=5
方法二:
使用chkconfig命令
chkconfig --list 查看全部服務在0-6模式中是否開啟一目連然
Chkconfig --level 34 atd off 直接把3和4模式下atd服務全部關閉
Chkconfig atd on 直接默認把2-5模式全部打開atd,即我們生產(chǎn)中主流模式
chkconfig --list [name]#查看單個服務在所有級別的啟動或關閉設定情形
1.3.4.2 初始化腳本 sysinit 以及服務管理
這些服務真正的腳本在/etc/init.d中
如果我們開發(fā)一個軟件希望下次開機啟動或者自己寫一個啟動腳本
需要再這個目錄下寫一個啟動腳本,格式如下:需要支持一些參數(shù),如start, stop等
可以參考atd的腳本:
345是在什么模式啟動,95是開機啟動的序號S,5是開機不啟動的編號k
Description是寫的對腳本的描述
下面是支持的參數(shù)
自己編的服務開機啟動一般依賴別人,所以應該用數(shù)字比較大的,比的順序是從開頭往后按大小比
但是不不能用100這樣的反而會排在前面,應該用9開頭的如:S99,964
建立一個自己的服務腳本:touch testservice -是默認全是off 99是S 3是K,
編寫一個這樣的腳本:
要在 /etc/init.d目錄下vim testservice
#!/bin/bash
# chkconfig :- 98 3 (:一定要有不然不符合格式)
# description: test service 腳本描述
. /etc/init.d/functions 調(diào)用函數(shù)庫
start (){
touch /var/lock/subsys/testsrv建立起啟動文件
action "Starting testservice:" 開機啟動
}
stop (){
rm touch /var/lock/subsys/testsrv 刪除啟動文件
action "Stopping testservice:"
}
status(){ 判斷狀態(tài)
if [ -f /var/lock/subsys/testsrv ] ;then
echo "testservice is running..." 如果這個文件存在就認為服務啟動打印測試服務在運行 加上-f即使這個文件不存在也不會報錯
else
echo "testservice is stopped"此文件不存在就停止
fi
}
case $1 in參數(shù)$1如果是這下面那個參數(shù)就執(zhí)行哪個操作
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "Usage : /etc/init.d/testservice {start|stop|status|restart}"
Esac 如果是其他的就打印這些
最后加到服務列表里開機自動啟動:
實際上是在/etc/rc.d里面生成軟鏈接
Chkconfig --add testservice加入到服務列表里
但是加進去之后再七種模式里面全都是off 因為在chkconfig里面我們寫的是—
修改一下:
Chkconfig testservice on(直接2-5模式下都開啟)
軟鏈接建立成功
1.3.服務管理:
service 命令:手動管理服務
service 服務 start|stop|restart
service --status-all
/etc/rc.d/rc 控制服務腳本的開機自動運行 :
for srv in /etc/rc.d/rcN.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rcN.d/S*; do
$srv start
Done
說明:rc N --> 意味著讀取/etc/rc.d/rcN.d/
K: K##:##運行次序;數(shù)字越小,越先運行;數(shù)字越小的服務,通常為依賴到別的服務
S: S##:##運行次序;數(shù)字越小,越先運行;數(shù)字越小的服務,通常為被依賴到的服務
配置服務開機啟動
chkconfifig命令
ntsysv命令
chkconfifig 命令管理服務
#查看服務在所有級別的啟動或關閉設定情形:
chkconfig [--list] [name]
#添加服務
SysV的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)
#!/bin/bash
chkconfig: LLLL nn nn #LLLL 表示初始在哪個級別下啟動,-表示都不啟動
description : 描述信息
chkconfig --add name
#刪除服務
chkconfig --del name
#修改指定的運行級別
chkconfig [--level levels] name <on|off|reset>
說明:--level LLLL: 指定要設置的級別;省略時表示2345
特殊故障:某個服務沒起來 導致重啟起不來
在啟動界面輸a 1進入單用戶界面 將起不來的服務臨時關閉
就可以進入3模式或者5模式了 ,進去之后再進去排錯
完成要比完美更重要
1.3.4.4 非獨立服務
服務分為獨立服務和非獨立服務
瞬態(tài)(Transient)服務被超級守護進程 xinetd 進程所管理,
依賴于xinetd的服務也稱為非獨立服務
進入的請求首先被xinetd代理作為值班人員
xinted可以幫我們監(jiān)控服務,在有人訪問的時候提醒開啟,實際上工作的還是詳細服務。可以節(jié)省資源。
想把有人訪問的服務喚醒
要在配置文件中用交互式方法把off改成o把disable=yes改成no即可:
/etc/xinetd.conf
/etc/xinetd.d/<service>
或者用用chkconfifig控制非獨立服務開機啟動 (實際上也是把yes改成no)
示例:chkconfifig telent on
在centos系列剛裝上的服務不會立即啟動,默認需要手動啟動
而Ubuntu上會默認把裝上的服務啟動
1.3.4.5 開機啟動文件 rc.local
rc.local比較特殊,排在99以及別的服務都在init。d下,他就是單獨的rc.Local,在他下面只有2-5模式,如果一個服務想開機就會啟動
一是寫配置文件格式
二是扔到rc.local里面,只要扔到這個文件里開機就會啟動
只要扔到這個文件,讓系統(tǒng)能找的到路徑,加過執(zhí)行權限 開機就會啟動
腳本不需要寫config以及描述 參數(shù)之類的 開機就可以啟動
缺點是放在rc.local里面是不能用service控制的
默認找的路徑是/etc/init.d目錄下的腳本
在centos6上rc。Local默認是有執(zhí)行權限的,在7上沒有
/etc/rc.d/rc.local
注意:正常級別下,最后啟動一個服務S99loca l沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向 了/etc/rc.d/rc.local腳本
不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置 于/etc/rc.d/rc.local文件中
/etc/rc.d/rc.local在指定運行級別腳本后運行
私人訂制linux
一個完整的linux從啟動到用戶登錄用到的部件有:
加電自檢
Grub (stage1,1.5,2三個階段)
內(nèi)核文件
輔助的rmdisk文件
加載系統(tǒng)中第一個進程,默認是init進程(讀取etc的initab文件,rc sys初始化等等腳本)
或者準備個bash
實驗具體步驟如下:
1)分區(qū)并創(chuàng)建文件系統(tǒng)
在centos6上準備一塊新硬盤,
分兩個必要的分區(qū)#分兩個必要的分區(qū),
/dev/sdb1對應/boot /dev/sdb2對應根 /
一個給boot 一個給根用
echo -e 'n\np\n1\n\n+1G\nw\n' | fdisk /dev/sdb (非交互式方法n創(chuàng)建分區(qū)\np回車加p接受默認的主分區(qū)\n1回車加1回車第一個分區(qū)默認值 \n回車然后回車加1G分1個g的空間,然后\nw回車w存盤退出)
[root@centos6 ~]#echo -e 'n\np\n2\n\n\n\nw\n' | fdisk /dev/sdb
用ext4進行格式化
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2 對文件系統(tǒng)進行格式化 之后準備數(shù)據(jù)
2)掛載boot
#子目錄必須為boot
mkdir /mnt/boot
對應的是mount /dev/sdb1 /mnt/boot
3)安裝grub
[root@centos6 ~]#grub-install --root-directory=/mnt/ /dev/sdb
(默認是放在/dev/sdb /boot,但是我們希望存到mnt/boot,所以需要加上--root-directory對應的是mnt/boot/grub)
4)準備內(nèi)核和initramfs文件
cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/vmlinuz
cp /boot/initramfs-2.6.32-754.el6.x86_64.img /mnt/boot/initramfs.img
建立grub.conf
[root@centos6 ~]#vim /mnt/boot/grub/grub.conf
default=0
timeout=6
title wang linux 自定義
root (hd0,0) 根的位置
kernel /vmlinuz root=/dev/sda2(雖然放到sdb上但是內(nèi)核路徑路徑要寫到sda上,因為sdb將來要拆下來裝到別的電腦上,在別的電腦上這塊硬盤就是第一塊硬盤,所以啟動的時候需要寫sda,為了以后用不對應當前)
selinux=0 init=/bin/bash 啟動的時候不是使用init,使用的是bash作為第一個進程,用這種方式把selinux禁用了
initrd /initramfs.img
[root@centos6 ~]#tree /mnt/boot
/mnt/boot
5)準備根下面相關程序和庫
[root@centos6 ~]#mkdir /mnt/sysroot 建個文件夾
[root@centos6 ~]#mount /dev/sdb2 /mnt/sysroot 把分區(qū)掛上去
[root@centos6 ~]#mkdir –pv
/mnt/sysroot/{boot,dev,sys,proc,etc,lib,lib64,bin,sbin,tmp,var,usr,opt,home,root
,mnt,media}
#復制bash等命令和相關庫文件,如:
bash,ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid,tree,fdisk
[root@centos6 ~]#
mkdir /mnt/sysroot/{dev,proc,etc,sys,lib,home,root}
#準備網(wǎng)卡驅(qū)動
[root@centos6 ~]#ethtool -i eth0
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version:
bus-info: 0000:02:01.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
[root@centos6 ~]#modinfo -n e1000
/lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
#cp/lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/
[root@centos6 ~]#chroot /mnt/sysroot
6)準備新的虛擬機
將前一虛擬機sdb硬盤對應的vmdk文件增加進去,刪除原有磁盤,開機啟動
2/proc 目錄和內(nèi)核參數(shù)管理
在linux啟動之后會做一些內(nèi)核參數(shù)的優(yōu)化,主要集中在/proc目錄下,process進程
一些是跟進程有關一些是跟內(nèi)核參數(shù)設置有關
在/proc/sys sys是內(nèi)存中的信息,目錄下有和內(nèi)核有關的諸多參數(shù)
存不住 臨時生效 也可以使用sysctl -w path.to.parameter=VALUE
命令臨時生效 但是這種寫法就需要吧/換成.來寫:兩種方法
如果想永久保存需要在這些配置文件中書寫:
如果放在一個配置文件里比較臃腫,可以根據(jù)不同需要放在標紅的兩個文件中
/etc/sysctl.conf總配置文件
etc/sysctl.d/*.conf (比較推薦的寫法)
/run/sysctl.d/*.conf
/
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf
常用內(nèi)核參數(shù):可以放在上面的總配置文件或者conf里面寫可以(注意/要寫成.的形式)
一般情況下下次重啟生效,需要立即生效 如果寫到總配置文件里不用加文件名,如果寫到子配置文件需要加上文件名
使用sysctl -p 加上該文件(指重讀),如:
cat /proc/sys/net/ipv4/icmp_echo_ignore_all(控制讓對方是否能ping通我)
0表示可以ping通 改成1 就不可以了
net.ipv4.ip_forward=1
net.ipv4.ip_nonlocal_bind = 0(socket即ip地址加tcp/udp的端口號,標識處網(wǎng)絡中唯一的地址)默認為0沒有打開,=1之后是打開
vm.drop_caches 釋放緩沖區(qū)
fs.file-max = 1020000 系統(tǒng)中最大打開的個數(shù)(iPv4存在的個數(shù)2^32次方,每個ip有65536個端口,即如果不考慮帶寬,服務器可以支持并發(fā)量2^32*65536個用戶訪問,
實際上單臺主機遠遠達不到,需要進行優(yōu)化
Apache可以接受10k
Nginx可以支持50k
Lvs百萬
Haproxy10萬)
net.ipv4.icmp_echo_ignore_all =0 代表能ping通 1代表不能
Ulimit -a可以查看記錄了每個進程最多打開的文件個數(shù),
以及內(nèi)核TCP參數(shù)優(yōu)化
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 2000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_orphans = 16384
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
使用sysctl -a可以查看當前生效的各種內(nèi)核參數(shù)
3 /sys 目錄
/sys目錄:
使用sysfs文件系統(tǒng),為用戶使用的偽文件系統(tǒng),輸出內(nèi)核識別出的各硬件設備的相關屬性信息,也有內(nèi)
核對硬件特性的設定信息;有些參數(shù)是可以修改的,用于調(diào)整硬件工作特性
udev通過此路徑下輸出的信息動態(tài)為各設備創(chuàng)建所需要設備文件,udev是運行用戶空間程序
專用工具:udevadmin, hotplug
udev為設備創(chuàng)建設備文件時,會讀取其事先定義好的規(guī)則文件,一般在/etc/udev/rules.d
及/usr/lib/udev/rules.d目錄下
4 內(nèi)核模塊管理和編譯
kernel:內(nèi)核核心,一般為bzImage,通常在/boot目錄下
名稱為 vmlinuz-VERSION-RELEASE
kernel object:內(nèi)核對象,一般不是必須有必須用的文件一般放置于 子文件
/lib/modules/VERSION-RELEASE/ (內(nèi)核版本號)
分門別類放到不同文件
4.1 內(nèi)核版本
運行中的內(nèi)核:
uname命令:
uname - print system information
uname [OPTION]...
-n: 顯示節(jié)點名稱
-r: 顯示VERSION-RELEASE
-a:顯示所有信息
4.2 內(nèi)核模塊命令
lsmod命令:
顯示由核心已經(jīng)裝載的內(nèi)核模塊
顯示的內(nèi)容來自于: /proc/modules文件
[root@centos8 ~]#lsmod
模塊名稱 大小 使用次數(shù) 被哪些模塊依賴
Module Size Used by
uas 28672 0
usb_storage 73728 1 uas
nls_utf8 16384 0
isofs 45056 0
#
modinfo命令:
功能:管理內(nèi)核模塊
配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf
顯示模塊的詳細描述信息
modinfo [ -k kernel ] [ modulename|filename... ]
常用選項
-n:只顯示模塊文件路徑
-p:顯示模塊參數(shù)
-a:作者
-d:描述
裝載或卸載內(nèi)核模塊
modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]
會自動解決依賴性,但是模塊必須讓modprobe找到
modprobe [ -r ] modulename…
Rmmod+模塊 刪除模塊
Insmod +文件路徑 需要先用modinfo - n +模塊
加載模塊
4.3.1.3 內(nèi)核編譯安裝實現(xiàn)
使用別人編譯安裝好的(在課件9.4.3.3.2有升級最新內(nèi)核,利用elrepo源在centos7安裝新版內(nèi)核)
想使用最新內(nèi)核 需要手動編譯安裝,但是一般很少編譯,因為最新的不一定能和生產(chǎn)環(huán)境匹配,需要做大量測試,升級新內(nèi)核一般是當前版本出現(xiàn)重大bug或者需要用到一些新功能,比如舊版本沒有容器功能docker
編譯安裝內(nèi)核準備:
(1) 準備好開發(fā)環(huán)境
(2) 獲取目標主機上硬件設備的相關信息
(3) 獲取目標主機系統(tǒng)功能的相關信息,例如:需要啟用相應的文件系統(tǒng)
(4) 獲取內(nèi)核源代碼包, www.kernel.org
實驗:編譯安裝最新內(nèi)核版本,并且讓新內(nèi)核支持ntfs
在windows里面可以用convert命令把fs系統(tǒng)轉(zhuǎn)化為ntfs系統(tǒng)
借助于系統(tǒng)自帶的編譯參數(shù):放在 ls /boot/下
有個config文件,定義了哪些參數(shù)啟用,哪些不啟用,啟用的是放在vmlinuz內(nèi)核文件中還是放在
/lib/modules中,我們用config文件作為模板在他的的基礎上進行微調(diào)
vim /boot/config-4.18.0-147.el8.x86_64
每一個都代表內(nèi)核的一個功能
y代表集成在內(nèi)核文件vmlinuz中
m代表集成在lib/modules模塊文件中
Config ACPI xxx is not set 代表不啟用,比如ntfs
4.3.1.2 開發(fā)環(huán)境相關包
先裝 依賴包:gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel
4.3.1.3 內(nèi)核編譯安裝實現(xiàn)
下載源碼文件
準備文本配置文件/boot/config-`uname -r`
- make menuconfig:配置內(nèi)核選項 ,相當于傳統(tǒng)編譯的./configure
內(nèi)核的編譯不需要指定路徑,參數(shù)啟用我們拿config文件進行配置
2.make [-j #] 合在一起編譯或者用以下兩步實現(xiàn):
:
1)make -j bzImage 編譯內(nèi)核文件vmlinuz
2)make -j modules 編譯模塊 /lib/modules
2.安裝模塊:需要分開安裝make modules_install
3.安裝內(nèi)核相關文件:make install
安裝bzImage為 /boot/vmlinuz-VERSION-RELEASE
編譯安裝內(nèi)核實戰(zhàn)案例:下載編譯最新內(nèi)核以及開啟ntfs
[root@centos8 ~]#yum -y install gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel bc perl
[root@centos8 ~]#tar xvf linux-5.6.12.tar.xz -C /usr/local/src (習慣性解到src目錄)
[root@centos8 ~]#cd /usr/local/src
[root@centos8 src]#cd linux-5.6.12/
[root@centos8 linux-5.6.12]#cp /boot/config- 4.18.0-147.el8.x86_64 .config (把文件復制到當前目錄下)
[root@centos8 linux-5.6.12]#vim .config
#修改下面兩行,CentOS7無需修改
# CONFIG_MODULE_SIG =y注釋掉
CONFIG_SYSTEM_TRUSTED_KEYS="" 刪掉引號里面的內(nèi)容
[root@centos8 linux5.6.12]#make help
[root@centos8 linux5.6.12]#make menuconfig (加載界面進入菜單,找到FILE system 回車進入
找到DOS/FAT/NT 回車進入 找到NTFS file system 用空格選做M,生成一個文件想用加載不想用可以不加載,下面兩項也可以選中,然后exit,再次exit回到第一個界面
找到General setup修改內(nèi)核后面的后綴,進入Local version
手動添加想加的后綴 如yanglinux-6.6.6
再次exit,然后yes保存)
[root@centos8 linux5.6.12]#time make -j 2 進入編譯
#或者兩步實現(xiàn):make -j 2 bzImage ; make -j 2 modules
[root@centos8 linux]#pwd
/usr/local/src/linux
[root@centos8 linux]#du -sh .
15G .
[root@centos8 linux]#make modules_install
[root@centos8 linux]#ls /lib/modules
4.18.0-147.el8.x86_64 5.6.12-wanglinux-6.6.6
[root@centos8 linux]#du -sh /lib/modules/5.6.12-wanglinux-6.6.6/
3.5G /lib/modules/5.6.12-wanglinux-6.6.6/
[root@centos8 linux]#make install
[root@centos8 linux]#ls /boot
config-4.18.0-147.el8.x86_64
efi
grub2
initramfs-0-rescue-5b85fc7444b240a992c42ce2a9f65db5.img
initramfs-4.18.0-147.el8.x86_64.img
initramfs-4.18.0-147.el8.x86_64kdump.img
initramfs-5.6.12-wanglinux-6.6.6.img
loader
lost+found
System.map
System.map-4.18.0-147.el8.x86_64
System.map-5.6.12-wanglinux-6.6.6
[root@centos8 ~]#ls /boot/loader/entries/
5b85fc7444b240a992c42ce2a9f65db5-0-rescue.conf
5b85fc7444b240a992c42ce2a9f65db5-4.18.0-147.el8.x86_64.conf
5b85fc7444b240a992c42ce2a9f65db5-5.6.12-wanglinux-6.6.6.conf
[root@centos8~]#cat/boot/loader/entries/5b85fc7444b240a992c42ce2a9f65db5-
5.6.12-wanglinux-6.6.6.conf
title CentOS Linux (5.6.12-wanglinux-6.6.6) 8 (Core)
version 5.6.12-wanglinux-6.6.6
linux /vmlinuz-5.6.12-wanglinux-6.6.6
initrd /initramfs-5.6.12-wanglinux-6.6.6.img $tuned_initrd
options $kernelopts $tuned_params
id centos-20200513060531-5.6.12-wanglinux-6.6.6
grub_users $grub_users
grub_arg --unrestricted
grub_class kernel
[root@centos8 ~]#reboot
[root@centos8 ~]#uname -r
5.6.12-wanglinux-6.6.6
......
編輯grub的配置文件
Centos6往后的版本grub信息放到/boot/grub2里面了,centos6的grub。Conf文件變成了grub。Cfg文件,而且內(nèi)容很多有182行,已經(jīng)不推薦大家手寫,自動生成
4.3.1.4 內(nèi)核編譯說明
1. 配置內(nèi)核選項
支持“更新”模式進行配置:make help
(a) make config:基于命令行以遍歷的方式配置內(nèi)核中可配置的每個選項,大量使用直接敲命令
(b) make menuconfig:基于curses圖形的文本窗口界面,修改少量配置使用 搜索替代
(c) make gconfig:基于GTK (GNOME)環(huán)境窗口界面 默認帶的是GNome庫
(d) make xconfig:基于QT(KDE)環(huán)境的窗口界面
支持“全新配置”模式進行配置 (自定義)
(a) make defconfig:基于內(nèi)核為目標平臺提供的“默認”配置進行配置
(b) make allyesconfig: 所有選項均回答為“yes“
(c) make allnoconfifig: 所有選項均回答為“no‘’
2. 編譯內(nèi)核
全編譯:
make [-j #]
編譯內(nèi)核的一部分功能:
(a) 只編譯某子目錄中的相關代碼
cd /usr/src/linux; make dir/
交叉編譯一般用不到
Busybox :
定制小型的Linux操作系統(tǒng):linux內(nèi)核+busybox
Busy可以配個docker使用,在centos8上可以安裝docker
實際上此處安裝的docker是假docker 其實是padman
busybox的使用有三種寫法:
1.busybox后直接跟命令,如 ./busybox ls
2.直接將busybox重命名,如 cp busybox tar,但是用一百個工具需要拷貝一百次,很麻煩
3.創(chuàng)建符號鏈接,如 ./ln -s busybox rm 需要寫相對路徑,推薦使用
但是也是很麻煩,
busybox的安裝
3以上方法中,第三種方法最方便,但為busybox中每個命令都創(chuàng)建一個軟鏈接,相當費事,但是busybox提供自動方法:busybox編譯成功后,執(zhí)行make install,則會產(chǎn)生一個_install目錄,其中包含了busybox
及每個命令的軟鏈接 ,可以把busybox拷貝到其他主機上,如果不妨到path變量里就需要寫路徑或者放進U盤攜帶
編譯Busybox
5.3 busybox編譯安裝
busybox 的編譯過程與Linux內(nèi)核的編譯類似
在centos7上:
[root@centos7 ~]#yum -y install gcc gcc-c++ glibc glibc-devel make pcre pcre
devel openssl openssl-devel systemd-devel zlib-devel glibc-static ncurses-devel
[root@centos7 ~]#wget https://busybox.net/downloads/busybox-1.31.1.tar.bz2
[root@centos7 ~]#tar xvf busybox-1.31.1.tar.bz2
[root@centos7 ~]#cd busybox-1.31.1/
[root@centos7 busybox-1.31.1]#make menuconfig #按下面選擇,把busybox編譯也靜態(tài)二進制,把程序和二進制文件放在一起、不用共享庫:Settings -->Build Options -->[*] Build static binary (no shared
libs)
[root@centos7 busybox-1.31.1]#make #如果出錯,執(zhí)行make clean后,重新執(zhí)行上面命令
[root@centos7 busybox-1.31.1]#ls
[root@centos7 busybox-1.31.1]#make install
[root@centos7 busybox-1.31.1]#pwd
/root/busybox-1.31.1
[root@centos7 busybox-1.31.1]#ls
applets debianutils loginutils
qemu_multiarch_testing
applets_sh docs mailutils README
arch e2fsprogs Makefile runit
archival editors Makefile.custom scripts
AUTHORS examples Makefile.flags selinux
busybox findutils Makefile.help shellbusybox.links include make_single_applets.sh
size_single_applets.sh
busybox_unstripped init miscutils sysklogd
busybox_unstripped.map _install modutils testsuite
busybox_unstripped.out INSTALL networking TODO
Config.in klibc-utils NOFORK_NOEXEC.lst TODO_unicode
configs libbb NOFORK_NOEXEC.sh util-linux
console-tools libpwdgrp printutils
coreutils LICENSE procps
[root@centos7 busybox-1.31.1]#ll busybox -h
-rwxr-xr-x 1 root root 2.6M May 13 14:46 busybox
[root@centos7 busybox-1.31.1]scp busybox 10.0.0.88:/data/
可以拷貝到其他主機上使用
[root@centos7 busybox-1.31.1]#ls _install/
bin linuxrc sbin usr
[root@centos7 busybox-1.31.1]#ls _install/bin
arch dd grep login netstat rmdir tar
ash df gunzip ls nice rpm
touch
base64 dmesg gzip lsattr nuke run-parts true
busybox dnsdomainname hostname lzop pidof scriptreplay
umount
cat dumpkmap hush makemime ping sed
uname
chattr echo ionice mkdir ping6 setarch
usleep
chgrp ed iostat mknod pipe_progress setpriv vi
chmod egrep ipcalc mktemp printenv setserial
watch
chown false kbd_mode more ps sh zcat
conspy fatattr kill mount pwd sleep
cp fdflush link mountpoint reformime stat
cpio fgrep linux32 mpstat resume stty
cttyhack fsync linux64 mt rev su
date getopt ln mv rm sync
[root@centos7 busybox-1.31.1]#find _install/ -type l |wc -l
396
[root@centos7 busybox-1.31.1]#du -sh _install/
2.6M _install/
[root@centos7 busybox-1.31.1]#mkdir /mnt/sysroot/
[root@centos7 busybox-1.31.1]#cp -a _install/* /mnt/sysroot/
6 systemd
6.1 systemd 特性
Centos5以前使用sysv 程序必須順序啟動
Centos6使用upstart 有依賴關系的順序,沒有依賴關系的可以順序啟動
Centos7使用systemd可以并行啟動,表面上并行啟動實際上可能沒有啟動,有需要才啟動,centos6以后的版本都會自動解決依賴性,安裝或者刪除依賴包,自動啟動依賴服務
使用systemctl 命令管理,systemctl命令固定不變,不可擴展,非由systemd啟動的服務, systemctl無法與之通信和控制,可以替代xinted,監(jiān)聽端口的是systemd
系統(tǒng)引導時實現(xiàn)服務并行啟動
按需啟動守護進程
自動化的服務依賴關系管理
同時采用socket式與D-Bus總線式激活服務
socket與服務程序分離 ,service對應的是二進制進程,socket對應的是端口號ip地址
向后兼容sysv init腳本
使用systemctl 命令管理,systemctl命令固定不變,不可擴展,非由systemd啟動的服務,
systemctl無法與之通信和控制
系統(tǒng)狀態(tài)快照
systemd核心概念:unit資源 :
unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統(tǒng)服務、監(jiān)聽
socket、保存的系統(tǒng)快照以及其它與init相關的信息
#查看unit類型
[root@centos8 ~]#systemctl -t help
service unit: 文件擴展名為.service, 用于定義系統(tǒng)服務
Socket unit: .socket, 定義進程間通信用的socket文件,也可在系統(tǒng)啟動時,延遲啟動服務,實現(xiàn) 按需啟動
Target unit: 文件擴展名為.target,用于模擬實現(xiàn)運行級別 紅色表示常用
Device unit: .device, 用于定義內(nèi)核識別的設備
Mount unit: .mount, 定義文件系統(tǒng)掛載點
Snapshot unit: .snapshot, 管理系統(tǒng)快照
Swap unit: .swap, 用于標識swap設備
Automount unit: .automount,文件系統(tǒng)的自動掛載點
Path unit: .path,用于定義文件系統(tǒng)中的一個文件或目錄使用,常用于當文件系統(tǒng)變化時,延遲激
活服務,如:spool 目錄
Unit的配置文件:
/usr/lib/systemd/system:每個服務最主要的啟動腳本設置,類似于之前的/etc/init.d/ 在centos7上/lib跟/usr/lib是同一個,是軟鏈接的關系
/lib/systemd/system: ubutun的對應目錄
/run/systemd/system:系統(tǒng)執(zhí)行過程中所產(chǎn)生的服務腳本,比上面目錄優(yōu)先運行
一般不關注
/etc/systemd/system:管理員建立的執(zhí)行腳本,類似于/etc/rcN.d/Sxx的功能,比上面目錄優(yōu)先運行,也是命令自動生成的,不需要手動修改
systemctl管理系統(tǒng)服務service unit
跟centos6相比好處在于 命令是把服務service是放在后面的,可以同時啟動多個服務,啟動成功無提示,只有失敗才會提示,且就算把ssh服務停了,但是處于連接中的ssh服務不會突然斷掉
而centos6是放在中間,啟動成功有提示
systemctl COMMAND name.service
#啟動:相當于service name start
systemctl start name.service
#停止:相當于service name stop
systemctl stop name.service
#重啟:相當于service name restart
systemctl restart name.service
#查看狀態(tài):相當于service name status
systemctl status name.service
#禁止自動和手動啟動:
systemctl mask name.service 在centos7.8上新增的mask功能
手動無法啟用,可以有效避免誤啟動,只有使用下面取消禁止的命令才可以啟動
#取消禁止
systemctl unmask name.service
#查看某服務當前激活與否的狀態(tài):
systemctl is-active name.service
是active,否inactive
查看所有已經(jīng)激活的服務:
systemctl list-units --type|-t service
#查看所有服務:
systemctl list-units --type service --all|-a
#設定某服務開機自啟,相當于chkconfig name on
systemctl enable name.service
#設定某服務開機禁止啟動:相當于chkconfig name off
systemctl disable name.service
#查看所有服務的開機自啟狀態(tài),相當于chkconfig --list
systemctl list-unit-files --type service
服務狀態(tài)
#用來列出該服務在哪些運行級別下啟用和禁用:chkconfig –list name
ls /etc/systemd/system/*.wants/name.service
#查看服務是否開機自啟:
systemctl is-enabled name.service
是enable。否disable
#列出失敗的服務
systemctl --failed --type=service
#開機并立即啟動或停止
systemctl enable --now postfix =systemctl enable postfix,加上start立即開啟且開機開啟
systemctl disable --now postfix 立即關閉且開機不啟動
#查看服務的依賴關系:
systemctl list-dependencies name.service
#殺掉進程:
systemctl kill unitname
6.3 service unit文件格式
在centos7以及以后的版本,如果自己寫個軟件編譯安裝一個腳本,對應的服務是在service文件,而不是initab腳本,如果編譯安裝之后系統(tǒng)沒有提供service文件需要我們自己去寫
Service文件在cd /lib/systemd/system路徑下
以atd.service為例,里面就寫了atd服務相關的文件一共三項文件格式如下:
1)Unit:單元,寫的是unit描述信息
以及after依賴關系,在這些資源之后運行的,也就是說想使用atd。Service需要先準備好這些資源
修改配置文件之后需要使用systemctl daemon-reload命令同步,
2) Service或者socket和資源有關,EXECSTart這一項本質(zhì)上就是我們執(zhí)行systemctl start atd.service時執(zhí)行的命令,$OPTS這個變量定義的路徑就是在EnviomentFile這一項的路徑里面,即/etc/sysconfig/atd里面
IGnoresigpipe是是否支持信號
3)Install是加載到系統(tǒng)中是否生效,如果沒有install說明只是扔到磁盤里面不起作用
Wantby是弱依賴 ,即被這些服務所依賴,這些資源想啟動就要先啟動atd
unit 格式說明:
以 “#” 開頭的行后面的內(nèi)容會被認為是注釋
相關布爾值,1、yes、on、true 都是開啟,0、no、offff、false 都是關閉
時間單位默認是秒,所以要用毫秒(ms)分鐘(m)等須顯式說明
service unit fifile文件通常由三部分組成:
[Unit]:定義與Unit類型無關的通用選項;用于提供unit的描述信息、unit行為及依賴關系等
[Service]:與特定類型相關的專用選項;此處為Service類型
[Install]:定義由“systemctl enable”以及"systemctl disable“命令在實現(xiàn)服務啟用或禁用時用到
的一些選項
Unit段的常用選項:
Description:描述信息
After:定義unit的啟動次序,表示當前unit應該晚于哪些unit啟動,其功能與Before相反
Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit也無法激活
Wants:依賴到的其它units,弱依賴
Conflflicts:定義units間的沖突關
Service段的常用選項:
Type:定義影響ExecStart及相關參數(shù)的功能的unit進程啟動類型
simple:默認值,這個daemon主要由ExecStart接的指令串來啟動,啟動后常駐于內(nèi)存中
forking:由ExecStart啟動的程序透過spawns延伸出其他子程序來作為此daemon的主要服
務。原生父程序在啟動結束后就會終止
oneshot:與simple類似,不過這個程序在工作完畢后就結束了,不會常駐在內(nèi)存中
dbus:與simple類似,但這個daemon必須要在取得一個D-Bus的名稱后,才會繼續(xù)運作.因
此通常也要同時設定BusNname= 才行
notify:在啟動完成后會發(fā)送一個通知消息。還需要配合 NotifyAccess 來讓 Systemd 接收消
息
idle:與simple類似,要執(zhí)行這個daemon必須要所有的工作都順利執(zhí)行完畢后才會執(zhí)行。這
類的daemon通常是開機到最后才執(zhí)行即可的服務
EnvironmentFile:環(huán)境配置文件
ExecStart:指明啟動unit要運行命令或腳本的絕對路徑
ExecStartPre: ExecStart前運行
ExecStartPost: ExecStart后運行
ExecStop:指明停止unit要運行的命令或腳本
Restart:當設定Restart=1 時,則當次daemon服務意外終止后,會再次自動啟動此服務
PrivateTmp:設定為yes時,會在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/
目錄
Install段的常用選項:
Alias:別名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依賴,強依賴
WantedBy:被哪些units所依賴,弱依賴
Also:安裝本服務的時候還要安裝別的相關服務
注意:對于新創(chuàng)建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而后可以選擇 重啟
systemctl daemon-reload
而在Ubuntu上如果想開機自啟的服務需要手動寫service文件
或者自己創(chuàng)建類似于cenots的rc.local文件
在/lib/systemd/system/rc.local.service路徑里
雖然寫了rc.local路徑,但是在Ubuntu里是沒有rc.local文件的
Ubuntu里面存在rc.local.service服務但是進行啟動會失敗
因為配置文件中缺少了INSTALL以及缺少了rc.local文件
可以vim編輯一個rc.Local文件以及加上執(zhí)行權限
以及在配置文件中增加INTSALL
范例:Ubuntu實現(xiàn)程序進程開機程序自啟
root@ubuntu1804 ~]#ll /lib/systemd/system/rc.local.service
lrwxrwxrwx 1 root root 16 Dec 12 2018 /lib/systemd/system/rc.local.service ->
rc-local.service
[root@ubuntu1804 ~]#grep -v "^#" /lib/systemd/system/rc.local.service
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
[root@ubuntu1804 ~]#vim /etc/rc.local
[root@ubuntu1804 ~]#cat /etc/rc.local
#!/bin/bash
echo -e '\E[31;1mstarting test service\E[0m'
sleep 10
[root@ubuntu1804 ~]#chmod +x /etc/rc.local
[root@ubuntu1804 ~]#reboot
6.4 運行級別
target units:相當于CentOS 6之前的runlevel ,unit配置文件:.target
某個target就代表某個資源的集合,某個服務是否啟動時可以單獨指定的
打破了以前runlevel之前七種模式的局限性
ls /usr/lib/systemd/system/*.target
systemctl list-unit-files --type target --all
和運行級別對應關系
0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
列出某個target涵蓋的資源查看依賴性
systemctl list-dependencies graphical.target
級別切換:相當于 init N 在centos7上推薦用這個命令切換
systemctl isolate name.target
進入默認target
System default
注意:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切換(修改文件需執(zhí)行systemctl
daemon-reload才能生效)
獲取默認運行級別: 相當于查看 /etc/inittab
systemctl set-default name.target
范例:
[root@centos8 ~]#systemctl set-default multi-user.target
[root@centos8 ~]#ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 Nov 7 19:32 /etc/systemd/system/default.target ->
/lib/systemd/system/multi-user.target
切換至緊急救援模式:
systemctl rescue
切換至emergency模式:
systemctl emergency
說明:rescue.target 比emergency 支持更多的功能,例如日志等
傳統(tǒng)命令init,poweroffff,halt,reboot都成為 systemctl的軟鏈接
#關機
systemctl halt、systemctl poweroff
#重啟:
systemctl reboot
#掛起:
systemctl suspend
#休眠:
systemctl hibernate
#休眠并掛起:
systemctl hybrid-sleep
范例:禁用ctrl+alt+delete 重啟快捷鍵
[root@centos8 ~]#ls -l /lib/systemd/system/ctrl-alt-del.target
lrwxrwxrwx. 1 root root 13 May 23 2019 /lib/systemd/system/ctrl-alt-del.target
-> reboot.target
[root@centos8 ~]#systemctl mask ctrl-alt-del.target
Created symlink /etc/systemd/system/ctrl-alt-del.target → /dev/null.
[root@centos8 ~]#init q (等于sytemctl daemon-reload命令,重新加載)
[root@centos8 ~]#systemctl daemon-reload
6.5 CentOS 7之后版本引導順序
1. UEFi或BIOS初始化,運行POST開機自檢
2. 選擇啟動設備
3. 引導裝載程序, centos7是grub2,加載裝載程序的配置文件:
/etc/grub.d/
/etc/default/grub
/boot/grub2/grub.cfg
4. 加載initramfs驅(qū)動模塊
5. 加載內(nèi)核選項
6. 內(nèi)核初始化,centos7使用systemd代替init
7. 執(zhí)行initrd.target所有單元,包括掛載/etc/fstab
8. 從initramfs根文件系統(tǒng)切換到磁盤根目錄
9. systemd執(zhí)行默認target配置,配置文件/etc/systemd/system/default.target
10. systemd執(zhí)行sysinit.target初始化系統(tǒng)及basic.target準備操作系統(tǒng)
11. systemd啟動multi-user.target下的本機與服務器服務
12. systemd執(zhí)行multi-user.target下的/etc/rc.d/rc.local
13. Systemd執(zhí)行multi-user.target下的getty.target及登錄服務
14. systemd執(zhí)行graphical需要的服務
通過systemd-analyze 工具可以了解啟動的詳細過程
systemd-analyzeplot >boot.xml(隨便起個文件名)傳到windows里
systemd-analyze blame 字符界面,不是很直觀
6.6 設置內(nèi)核參數(shù)
設置內(nèi)核參數(shù),只影響當次啟動
啟動時,到啟動菜單,按e鍵,找到在linux 開頭的行后添加systemd.unit=desired.target
比如:systemd.unit=emergency.target 或 systemd.unit=rescue.target
6.7 破解 CentOS 7和8的 root 密碼
方法一:
啟動時任意鍵暫停啟動
按e鍵進入編輯模式
將光標移動linux 開始的行,添加內(nèi)核參數(shù)rd.break
按ctrl-x啟動
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
#如果SELinux是啟用的,才需要執(zhí)行下面操作,如查沒有啟動,不需要執(zhí)行
touch /.autorelabel
exit
reboot
方法二:
啟動時任意鍵暫停啟動
按e鍵進入編輯模式
將光標移動linux 開始的行,改為rw init=/sysroot/bin/sh
按ctrl-x啟動
chroot /sysroot
passwd root
#如果SELinux是啟用的,才需要執(zhí)行下面操作,如查沒有啟動,不需要執(zhí)行
touch /.autorelabel
exit
reboot

浙公網(wǎng)安備 33010602011771號