基礎知識 linux系統的組成 內核(kerner) 根文件系統(rootfs) 內核提供操作系統的功能,根文件系統包含常用的一些工具,這些工具。這些工具的運行離不開glibc庫文件。 程式:二進位程式文件 庫:庫是函數的集合,用來實現介面調用等功能。程式的運行依賴這些庫文件 Linux內核的功能: ...
基礎知識
linux系統的組成
-
內核(kerner)
-
根文件系統(rootfs)
內核提供操作系統的功能,根文件系統包含常用的一些工具,這些工具。這些工具的運行離不開glibc庫文件。
程式:二進位程式文件
庫:庫是函數的集合,用來實現介面調用等功能。程式的運行依賴這些庫文件
Linux內核的功能:文件系統管理、進程管理、網路管理、驅動程式、記憶體管理等
CentOS 6
CentOS 6 啟動流程: 4步
POST--->MBR--->GRUB--->載入內核
POST:Power-On-Self-Test,加電自檢。由主板的bios程式完成。
bios:basic input output system。基本出入輸出系統
MBR
MBR: 主引導記錄(Master Boot Record)。是硬碟的第一個扇區(0磁軌0扇區),總共有512個位元組,前446個位元組存儲的是bootloader的階段一程式(以二進位的形式存放)
bootloader:是用來啟動(引導)操作系統的一個程式。(安裝操作系統的時候會自動安裝)
bootloader這個程式裡面定義了操作系統(內核)存放的位置等
windows用的bootloader:ntloader,僅用來啟動操作系統的
linux用的bootloader:現在使用的是GRUB,不僅用來啟動操作系統,還有多種功能
#早期版本用的是0.97版本,現在用的是2.02版本
grub的啟動流程:啟動操作系統前載入grub。
階段1:加電自檢完成後,通過bios檢測設備驅動。如果是硬碟啟動就讀取硬碟的第一個扇區(MBR)。並將MBR中的前446位元組(bootloader)載入到記憶體中進行運行 #二進位文件,可以直接訪問的
階段1.5:因為grub的另外一部分是存放在文件系統的/boot目錄下的,但是要想解析這個對應的文件,需要識別這個文件系統。所以需要藉助文件系統的驅動程式。因為MBR的前446位元組存放不下文件系統的驅動,所以文件系統驅動放在了MBR的後續扇區中
階段2:解析載入文件系統對應目錄下grub的配置文件,找到操作系統(linux)。 #非二進位,所以不可以直接訪問,而是一個文件系統。需要文件系統的驅動才能訪問解析到對應的數據
#階段1和1.5都是為了階段2做準備的。
CentOS6 Grub第二階段的存放位置:/boot/grub
grub.conf:grub的關鍵配置文件,裡面定義了內核存放的相關路徑等內容
#配置文件格式
default:表示預設啟動那個內核 #例如default=0表示預設第一個內核作為引導
timeout:在啟動界面停留的時間
hidenmenu:隱藏的啟動菜單,預設看不到的
tiele:啟動界面顯示的菜單項
root(hd#.#):表示boot分區所在的位置,#hd0.0--hd表示硬碟 0.0表示第一塊硬碟的第一個分區
kerner: /PATH/TO/KERNEL_FILE--內核文件所在的位置(/vmlinux表示boot目錄下的vmlinux這個文件) root=UUID=xxxx--表示利用內核,要載入的文件系統的根系統,系統硬碟真正的根(比如/dev/sda1這塊硬碟掛載到根上面 那麼載入的就是這個硬碟)
initrd:系統的一個輔助文件,是一個小型的linux文件系統,內核進入硬碟根的時候會藉助它
bootloader是硬體和操作系統之間的一個媒介。硬體通過bootloader才能找到操作系統。
採用硬碟引導進入救援模式的方法
系統無法啟動使用光碟的方式進入救援模式:
採用光碟啟動(引導),進入rescue模式
#重啟系統出現進度條的時候快速按ESC鍵,然後選擇CD-ROM Dirver,然後選擇Troubleshooting,選擇Rescue a CentOS liux System,然後選擇1繼續,然後切換到/mnt/sysimage這個目錄下操作。因為救援模式預設進入的根不是硬碟系統的根。而是ramdisk里的文件系統,並沒有切換到本機硬碟上的“真正”文件系統
#正常啟動的系統他不會掛載到/mnt/sysimage這個目錄下的
鏈接:http://t.zoukankan.com/duzhaoqi-p-7327525.html
#chroot /mnt/sysimage #切換到真正的根目錄下麵
#grub-install /dev/sda #執行秀姑grub的命令
#sync #將緩存中的信息同步到硬碟
#exit #退出重啟
#exit
Centos6的Grub修複方法
首先需要使用光碟引導進入救援模式
#grub信息被破壞的修複方法
使用grub-install來修複:grub-install --root-directory=DIR /dev/DISK
grub-install 磁碟名稱 #安裝grub到硬碟上,會自動找到整個硬碟的第一個扇區MBR的前446個位元組。
#無法修複grub的階段二所對應的配置文件,需要手動編寫 /boot/grub/grub.conf這個配置文件
Centos6 修複grub的方法:
方法一: #無法修複/etc/grub/grub.conf這個文件
grub-install命令: grub-install 磁碟名稱 #安裝grub到硬碟上,會自動找到整個硬碟的第一個扇區MBR的前446個位元組。
載入內核
grub載入linux內核後,通過內核載入硬碟的根,啟動系統中的第一個進程init。
內核想要進入硬碟的根,需要文件系統驅動。因為根分區有自己的文件系統。
驅動的功能由內核提供,內核的驅動存放位置在/lib目錄下,例如ext4的文件系統驅動:ext4.ko.所以要載入文件系統的驅動就需要進入根的文件系統,顯然不行。
所以內核此時不是從這裡面載入文件系統驅動,而是從GRUB配置文件中的initrd後面指定的文件裡面載入的文件系統。(是一個小型的linux文件系統)
init進程啟動以後就會通過以下順序執行相關的配置文件來設置系統
(1)/etc/inittab配置文件:確定系統使用那個運行模式(runlevel)
CentOS的運行模式有7個,對應數字0--6
0:關機
6:重啟
1:安全模式
3:字元模式
5:圖形界面模式
(2)運行/etc/rc.d/rc.sysinit這個腳本。初始話系統的一些信息。
設置主機名
設置歡迎信息
載入對應的服務配置
設備的掛載
交換空間的準備
系統時鐘等信息
(3)根據對應的運行模式執行對應的文件夾下麵腳本:/etc/rcX.d/xxx
比如運行模式是3:就執行/etc/rc3.d/ 下的腳本。
/etc/rc3.d/下麵的文件都是軟鏈接,指向/sbin/init下麵的腳本。
以K開頭的文件:開機啟動 K##:##運行次序;數字越小,越先運行;
以S開頭的文件:開機不啟動。S: S##:##運行次序;數字越小,越先運行;
CentOS6的服務管理工具
-
service:服務的開啟和關閉
-
chkconfig:服務的開機啟動等
service
service 服務 start|stop|restart
service --status-all
例如:service network start (networkCentOS8棄用了)
chkconfig
chkconfig 服務 on|off
rc.local文件
-
是一個開機啟動文件,不屬於任何運行模式。開機的時候所有的服務腳本都運行完成後才會執行他。
-
CentOS7以及後面的版本想用這個文件的話,需要手動添加可執行許可權才會執行。
-
ubuntu預設沒有這個文件,需要手動創建並更改許可權才可以使用。
/etc/rc.local
/etc/rc.d/rc.local
#/etc/rc.local -> rc.d/rc.local rc.local是 rc.d/rc.local的一個軟連接
正常級別下,最後啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向
了/etc/rc.d/rc.local腳本
想開機時自動運行的命令,可直接放置於/etc/rc.d/rc.local文件中
/etc/rc.d/rc.local在指定運行級彆腳本後運行
CentOS6 啟動流程總結:
1.POST,設備加電自檢(cpu、記憶體、硬碟、io設備等檢查)
2.MBR引導找到GRUB
3.GRUB執行完成後載入內核,內核載入硬碟的根
4.載入系統第一個進程init,並按順序執行以下配置文件和腳本。
/etc/inittab
/etc/rc.d/rc.sysinit
/etc/rcX.d/xxx
5.所有服務啟動完成後執行rc.local這個腳本裡面的內容。
6.終端啟動,登錄相關的配置和驗證。
Linux的/proc和/sys目錄
虛擬文件夾概念:
虛擬的文件夾,因為其數據內容是存放在記憶體中的,不是存放在硬碟中
/proc和/sys都是虛擬的文件夾
/proc
proc是進程(process)的縮寫。這個目錄文件裡面存放的是進程的相關信息,把系統中的進程信息、內核狀態放在proc中,是一個虛擬的文件夾,對應的數據信息是記憶體中的狀態。
/proc/sys
這個目錄文件裡面的信息可以修改,可以通過這些配置來控制內核
sysctl 工具
sysctl:修改系統的內核參數
sysctl修改的參數是臨時生效的,通過編寫配置文件的方式實現持久化生效
#配置文件
/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf #主要存放在這裡面,一般都在這個配置文件裡面編寫設置。
#格式:
和文件中的格式不一樣,使用點(.)來隔開路徑。/proc/sys不用寫, 因為這個配置文件對應就是管理/proc/sys這個文件夾的
#常用參數:
-w 臨時改變某個指定參數的值
-a 顯示所有生效的系統參數
-p 從指定的文件載入系統參數
範例
禁止ping通本機:
[root@centos8 ~]#cat /etc/sysctl.d/test.conf
net.ipv4.icmp_echo_ignore_all=1
[root@centos8 ~]#sysctl -p /etc/sysctl.d/test.conf
清除緩存方法
echo 1|2|3 >/proc/sys/vm/drop_caches
/sys
/sys目錄文件存放的是和硬體有關的一些信息,也是虛擬文件夾,不是真正的硬碟上的文件夾,對應的也是記憶體中的數據。
範例
新添加硬碟的識別
echo "- - -" > /sys/class/scsi_host/hostX/scan #X表示數字,從0開始的
內核模塊管理
內核的組成部分:
-
kernel:內核核心,一般為bzImage,通常在/boot目錄
-
kernel object:內核對象,一般放置於/lib/modules/VERSION-RELEASE/
-
輔助文件:ramdisk
內核版本查看:
uname -r
-r 顯示VERSION-RELEASE
內核模塊命令
-
lsmod
-
modprobe
lsmod:
顯示內核已經裝載的模塊
顯示的內容來自於: /proc/modules文件
範例:
[root@centos8 ~]#lsmod
Module Size Used by
uas 28672 0
usb_storage 73728 1 uas
nls_utf8 16384 0
isofs 45056 0 #顯示:名稱、大小,使用次數,被哪些模塊依賴
modprobe:用於裝載或者卸載內核模塊
裝載:modprobe 模塊名
卸載: modprobe -r 模塊名 # rmmod命令:卸載模塊
systemd服務
從CentOS7開始,就使用systemd服務代替init作為系統啟動的第一個進程。
systemd的特性:
-
服務並行啟動
-
可以按照需要啟動對應守護進行
-
自動管理服務的依賴關係
-
Unit(單元)的概念
-
使用systemctl管理工具
systemd的核心概念Unit(單元)
systemd把服務都籠統稱為Unit(單元),通過配置文件進行標識和配置。
Unit存放的位置:/lib/systemd/system
systemd的Unit類型:
(1)service:類似於Centos6裡面的服務腳本。文件擴招名為.service
(2)target:類似於Centos6裡面的運行級別。文件擴展名為.target
(3)socket:義進程間通信用的socket文件。文件擴展名為.socket
#socket的理解
socket翻譯過來是套接字,原意為插座、插孔。
socket可以理解為:ip地址+埠+協議類型
例如:一臺筆記本電腦(server),一個耳機(client),一個u盤(clinet),一個滑鼠(client),
socket就可以想象成筆記本電腦上的usb介面、音頻介面。
耳機需要連接到電腦聽歌,需要用到音頻介面,u盤需要鏈接電腦拷貝資料,需要用到usb介面。
socket就負責幫助這些外接設備找到筆記本電腦中相對應的驅動以便他們完成自己的工作,反之也是這樣。
socket就是位於兩個層面(傳輸層和應用層)中間的一個參與者,服務於兩方。
http是應用層協議,解決如何包裝數據,TCP/IP協議是傳輸層協議,主要解決數據怎麼在網路中傳輸。
一個網路協議 + 一個ip + 一個埠號,就組成了一個socket
原文鏈接:https://blog.csdn.net/EJEEMT/article/details/90212312
Unit的配置文件
/usr/lib/systemd/system #每個服務最主要的啟動腳本設置,類似於之前的/etc/init.d/
/lib/systemd/system #ubutun的對應目錄
/run/systemd/system #系統執行過程中所產生的服務腳本,比上面目錄優先運行
/etc/systemd/system #管理員建立的執行腳本,類似於/etc/rcN.d/Sxx的功能,比上面目錄優先運行
#/etc/systemd/system:系統管理員和用戶使用
#/usr/lib/systemd/system:發行版打包者使用
systemd的service
service這種unit類型的Unit文件格式
由三部分組成:
-
Unit:定義的是這個單元的相關信息
-
Service:定義的是這個服務的相關信息
-
Install:定義的是服務啟動和關閉的一些選項
Unit段的常用選項
Description:unit的描述信息
After:當前unit在那些unit後面啟動,其功能與Before相反
Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit也無法激活
Wants:依賴到的其它units,弱依賴
Conflicts:定義units間的衝突關係
Service段常用選項
Type:定義啟動類型
EnvironmentFile:環境配置文件
simple:預設值,後臺啟動常駐於記憶體
ExecStart:啟動unit要運行命令或腳本的絕對路徑
ExecStartPre: ExecStart前運行
ExecStartPost: ExecStart後運行
ExecStop:停止unit要運行的命令或腳本
Restart:當設定Restart=1 時,服務意外終止會再次自動啟動
RestartSec: 重啟等待時間,預設100ms
PrivateTmp:設定為yes時,會在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目錄
Install段常用選項
Alias:別名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依賴,強依賴
WantedBy:被哪些units所依賴,弱依賴
Also:安裝本服務的時候還要安裝別的相關服務
daemon-reload
當創建或者更改了硬碟上的unit的相關文件以後,需要使用daemon-reload載入到系統的記憶體中才會生效。
或者重啟系統也能生效
範例: 自定義service的unit文件
[root@centos8 ~]#vim /lib/systemd/system/hello.service
[Unit]
Description=Hello World
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/bin/kill sh
[Install]
WantedBy=multi-user.target
#會在後臺持續輸出 hello word,寫入到了系統日誌中/var/log/meseage
#ubuntu的日誌文件是: /var/log/sys.log
systemd的target
運行級別:不同的運行級別是不同的服務組合而來的結果。
systemd的target就類似於CentOS6的runlevel
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#graphical.target是基於multi-user.target來的
6 ==> runlevel6.target-> reboot.target #
systemd的管理工具
systemctl是systemd單元(unit)的管理工具
格式:systemctl COMMAND unit_name
start|stop|restart|status
mask:禁用服務
umask:取消禁用的服務
enable:設置開機啟動
disable:取消開機啟動
is-active:查看unit是否激活
is-enable:查看unit是否開機啟動
list-units:查看所有的unit
範例
啟動一個服務:
systemctl start unit_name.service #尾碼可以省略不屑
設置服務開機重啟並立馬啟動:
systemctl enable unit_name.service --now
查看系統中類型為service的unit
systemctl list-unit --type service --all
service服務的狀態
loaded Unit配置文件已處理
active(running) 一次或多次持續處理的運行
active(exited) 成功完成一次性的配置
active(waiting) 運行中,等待一個事件
inactive 不運行
enabled 開機啟動
disabled 開機不啟動
static 開機不啟動,但可被另一個啟用的服務激活
indirect 重定向到別處
修改運行級別
-
通過命令的方式修改
-
通過開機啟動的時候修改
#通過systemctl命令切換運行模式:
systemctl isolate name.target #效果等同於:init X
#開機的時候指定內核模式:隻影響當次的啟動
啟動時,到啟動菜單,按e鍵,找到在linux 開頭的行後添加systemd.unit=desired.target
#centos7是linux16開頭
例如:systemd.unit=emergency.target
systemd.unit=rescue.target
CentOS7及後續版本的啟動流程
-
1.POST:系統加電自檢並找到MBR
-
2.MBR引導並載入GRUB
-
3.GRUB引導內核並載入硬碟文件系統上的根系統
-
4.啟動系統的第一個進程systemd進程
-
5.執行systemd對應的unit(target這種類型的)
破解 CentOS 7和8的 root 密碼
方法一:
啟動時任意鍵暫停啟動 #進入內核啟動的界面 畫面停止在啟動菜單上面
按e鍵進入編輯模式
將游標移動linux 開始的行,添加內核參數 rd.break #rd.break暫停正常的啟動,進入臨時的救援模式
#centos7是linux16開頭,這一行就是grub裡面的一行內核參數配置
按ctrl-x啟動
#使用mount命令查看,發現指定的硬碟是掛載到/sysroot這個目錄下的,所以當前的根目錄不是真正硬碟的根。
#但是我們的硬碟又是以為只讀的方式掛載到/sysroot下的,無法修改文件等操作,所以需要重新掛載。
mount –o remount,rw /sysroot
chroot /sysroot #改變根目錄為我們硬碟文件的根目錄
passwd root #輸入密碼
#如果SELinux是啟用的,才需要執行下麵操作,如查沒有啟動,不需要執行
touch /.autorelabel #重新打selinux的標簽
exit
reboot
方法二:
啟動時任意鍵暫停啟動,出現內核啟動的界面
按e鍵進入編輯模式
將游標移動linux 開始的行,改為 rw init=/sysroot/bin/sh
按ctrl-x啟動
chroot /sysroot
passwd root
#如果SELinux是啟用的,才需要執行下麵操作,如查沒有啟動,不需要執行
touch /.autorelabel
exit
reboot
修複 GRUB2的方法
GRUB2:CentOS 7,8及ubuntu1804都使用
GRUB2的主要配置文件:
/boot/grub2/grub.cfg
修複GRUB配置文件的方法:
法一:grub2-mkconfig > /boot/grub2/grub.cfg
法二:grub2-mkconfig -o /boot/grub2/grub.cfg -o:表示他的標準輸出
修複grub:
grub2-install /dev/sda #BIOS環境
grub2-install #UEFI環境