[TOC]
# Linux系統啟動過程
我們來一起看CentOS7的啟動過程、重要文件和修改啟動級別。
## 啟動過程
以下截圖為CentOS7啟動過程。

## Systemd
CentOS7使用到了Systemd,在CentOS早期版本都使用的是Init進程,關于Init進程啟動有兩個缺點:
* Init是串行啟動,所以啟動時間較長
* 啟動腳本較為復雜
而Systemd就是為解決這些問題,它的設計初衷就是為系統啟動和管理提供一套完整解決方案。Systemd 的優點是功能強大,使用方便,缺點是體系龐大(以下截圖來源于網絡)。

Systemctl是Systemd的主要命令,用于管理系統。它的常用語法如下:
```
# systemctl start [name.service]
# systemctl stop [name.service]
# systemctl restart [name.service]
# systemctl reload [name.service]
$ systemctl status [name.service]
# systemctl is-active [name.service]
$ systemctl list-units --type service --all
```
*注:在Linux系統早期我們可以通過Service命令來管理一些常用的程序生命周期,在CentOS7后推薦用Systemctl來管理程序的生命周期,當然Service命令還是可以使用的。*
我們通過修改系統狀態的生命周期,來看一下sytemctl命令的用法:
```
# 重啟系統
[djangowang@localhost ~]# systemctl reboot
# 關閉系統,切斷電源
[djangowang@localhost ~]# systemctl poweroff
# 關閉系統
[djangowang@localhost ~]# systemctl halt
# 休眠
[djangowang@localhost ~]# systemctl hibernate
# 讓系統進入交互式休眠狀態
[djangowang@localhost ~]# systemctl hybrid-sleep
# 啟動進入救援狀態(單用戶狀態)
[djangowang@localhost ~]# systemctl rescue
```
重啟系統和關機的幾重方式:
* 重啟系統:systemctl reboot、reboot、init 6
* 關機:systemctl halt、halt、init 0
## 重要文件介紹
啟動過程Systemd會調用軟鏈接 /etc/systemd/system/default.target ,來最終確認啟動級別。
```
[djangowang@localhost ~]# ls /lib/systemd/system/*.target
/lib/systemd/system/anaconda.target
/lib/systemd/system/runlevel0.target
/lib/systemd/system/basic.target
...
```
可以看到Runlevel開頭的Target文件,對應著CentOS6的啟動級別,不過一樣是軟鏈接,指向了同目錄下的其他文件。
* 0 ==> runlevel0.target, poweroff.target ( 系統停機維護狀態)
* 1 ==> runlevel1.target, rescue.target (單用戶工作狀態)
* 2 ==> runlevel2.target, multi-user.target (多用戶狀態,沒有NFS)
* 3 ==> runlevel3.target, multi-user.target (多用戶態,有NFS)
* 4 ==> runlevel4.target, multi-user.target (系統保留)
* 5 ==> runlevel5.target, graphical.target (圖形界面)
* 6 ==> runlevel6.target, reboot.target (重啟系統)
## 修改啟動級別
在CentOS6中啟動級別需要修改/etc/inittab文件,到CentOS7修改啟動級別就變為以下兩種方式:
* 通過Systemctl命令來修改 (推薦)
* 修改系統鏈接文件
**Systemctl命令修改**
關于Systemctl命令的使用方式如下。
1.查看當前啟動級別。
```
[djangowang@localhost ~]# systemctl get-default
multi-user.target
```
2.修改啟動級別為圖形。
```
[djangowang@localhost ~]# systemctl set-default?graphical.target
```
在CentOS7.8系統,設置圖形啟動要提前進行安裝,安裝圖形包的方式如下:
```
[djangowang@localhost ~]# yum groupinstall "GNOME Desktop" "Graphical Administration Tools"
```
3.恢復啟動級別為多用戶。
```
[djangowang@localhost ~]# systemctl set-default?multi-user.target
```
**修改系統鏈接文件**
Systemctl最終也是修改的/lib/systemd/system/ctrl-alt-del.target文件。我們也可以通過修改此軟連接達到修改啟動級別的目的。
1.查看默認鏈接文件的指向。
```
[djangowang@localhost ~]# ls -al /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 Apr 21 2016 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
```
2.默認指向了多用戶啟動,將多用戶啟動改為圖形啟動,修改方式如下:
```
[djangowang@localhost ~]# ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target
```
In命令用于修改文件的軟連接,它的兩個參數含義:
*\-f 強制執行
*\-s 軟鏈接指向
## 將腳本添加啟動項
我們來介紹一下如何通過Systemctl命令來啟動自己的程序。譬如有這樣一個腳本/data1/test.sh的腳本,將這個腳本添加到系統啟動項中,進入/etc/systemd/system/目錄,創建test.service文件內容如下:
```
[Unit]
Description=test
After=
[Service]
ExecStart=/data1/test.sh
TimeoutStartSec=0
TimeoutStopSec=30
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
```
切記test.service文件中不能包含中文,如果包含中文會導致你的系統啟動異常。關于test.service參數:
* Description # 文件描述
* After # 后置腳本
* ExecStart=/data1/test.sh??? # 啟動時執行程序路徑
* ExecStop= # 關閉時執行程序路徑
* TimeoutStartSec=0 # 等待啟動的時間
* TimeoutStopSec=30 # 等待關閉的超時時間
* RemainAfterExit=yes # 當該服務的所有進程全部退出之后, 是否依然將此服務視為活動(active)狀態
* WantedBy=multi-user.target # 在某個級別下啟動,當前是多用戶狀態啟動
創建test.sh測試腳本,并以死循環方式運行,內容如下(記得程序要給chmod u+x 權限)。
```
#!/bin/bash
while :
do
sleep 2
echo "test" >> /tmp/log
done
```
將以上腳本加入到啟動項。
```
[djangowang@localhost ~]# systemctl enable /etc/systemd/system/test.service
```
確定是否加載成功。
```
[djangowang@localhost ~]# systemctl list-unit-files | grep test.service
test.service enable
```
關于返回狀態,這里一共四種:
* enabled:已建立啟動鏈接
* disabled:沒建立啟動鏈接
* static:該配置文件沒有`[Install]`部分(無法執行),只能作為其他配置文件的依賴
* masked:該配置文件被禁止建立啟動鏈接
如果馬上執行此程序,可以通過以下命令實現。
```
[djangowang@localhost ~]# systemctl start test.service
```
# 系統管理命令
在介紹目錄結構時,我們曾介紹過Linux系統命令,分別保存在/bin/和/sbin/目錄下,其中/sbin更多是系統管理員使用的命令,我們可以通過“whereis+命令”方式查看,系統命令存放的目錄位置。在學完本節后您會發現,passwd命令在修改密碼時,最終會把修改后的結果寫入 /etc/shadow 文件 ,useradd命令創建用戶后的信息,分別寫入 /etc/passwd 和 /etc/group文件中,還有netstat命令最終讀取的是 /proc/net/unix 文件內的信息,并通過sscanf函數對文件內容進行解析格式化后輸出,方便我們閱讀。在掌握這些系統命令的同時,最好還要更深入了解他的工作原理和作用的文件,方便我們后續做自動化運維時通過自己寫的程序,來批量控制成百上千臺Linux服務器。 接下來我們將介紹系統管理時的一些常用命令。
## groupadd命令
groupadd命令為系統增加組名,此命令會把增加的組名寫入/etc/group文件中,groupadd命令的常用參數:
* -g GID # 自行設定 GID 的值
1.創建guest1群組,并設定GID為77。
```
[djangowang@localhost ~]# groupadd -g 77 guest1
```
2.groupdel命令為系統刪除組,此命令會把/etc/group文件中的組名清除。
```
[djangowang@localhost ~ ]# groupdel guest1
```
## chown命令
chown命令用來更改某個目錄或文件的用戶名和用戶組,chown命令的常用參數:
* -R # 遞歸修改
```
[djangowang@localhost ~ ]# chown user:group text.txt
[djangowang@localhost ~ ]# chown -R user:group /data1/myPrivate/*
```
## useradd命令
useradd命令為系統增加一個用戶,useradd命令的常用參數:
* -u # 直接設置一個 UID
* -g?? # 直接設置一個 GID (此 GID 必須已經存在于 /etc/group 當中)
* -d?? # 直接將它的家目錄,指向已經存在的目錄(系統不會再默認創建)
* -M?? # 不建立家目錄
* -s?? # 定義其使用的Shell
1.創建一個名為guest1的系統用戶。
```
[djangowang@localhost ~ ]# useradd guest1
```
2.創建guest2用戶,指定UIN、GID和Bash。
```
[djangowang@localhost ~ ]# useradd -u 720 -g 100 -s /bin/bash guest2??
```
3.刪除guest1用戶。
```
[djangowang@localhost ~ ]# userdel guest1
```
*注:userdel命令刪除用戶在系統注冊的信息后,宿主目錄保留了用戶數據,系統并不會刪除。*
## passwd命令
passwd命令有兩個常用功能,分別為修改用戶的密碼,設置新賬號的密碼,passwd命令的常用參數:
* -d # 刪除密碼
* -f # 強迫用戶下次登錄時必須修改口令
* -w # 密碼要到期提前警告的天數
* -l # 停止賬號使用
* -i # 密碼過期后多少天停用賬戶
* -S # 顯示用戶密碼相關信息
* -- stdin # 將密碼通過管道從標準輸入中設置
1.創建一個臨時用戶guest1,并設置它的密碼。
```
[djangowang@localhost ~ ]# passwd guest1
Changing password for user guest1
New password:???? # 輸入密碼
Retype new password: # 再次輸入密碼
passwd: all authentication tokens updated successfully # 修改密碼成功
```
2.如果不希望使用交互式Shell,可以使用以下方式來修改密碼。
```
[djangowang@localhost ~ ]# echo "123456" | passwd --stdin root
```
3.通過chpasswd命令來批量用戶的密碼。譬如我們先創建一個user.txt文本文件,文件內容格式(username:password) ,內容如下:
```
guest1:abc123
guest2:dfasdf
```
將以上文件內容通過重定向命令,指向chpasswd命令,如下:
```
[djangowang@localhost ~ ]# chpasswd < user.txt
```
這樣就可以同時修改兩個用戶的密碼了。
## su命令
su命令切換系統用戶。它可以從普通用戶切換為管理員用戶(root),也可以從普通用戶切換任意系統其它用戶。
```
[djangowang@localhost ~ ]$ su
Password:? # 輸入 root 的密碼
[djangowang@localhost ~ ]#????? # 身份變成 root
[djangowang@localhost ~ ]# su -? # 加載 root 用戶的環境變量
[djangowang@localhost ~ ]# su guest1? # 將 root 的身份改為 guest1 ,且不需要輸入密碼
[djangowang@localhost ~ ]$ # 身份變為普通用戶
```
Linux系統在終端界面下,通過兩種符號來區分用戶的權限,這兩個符號分別為:
* \# 管理員權限
* $ 普通賬號權限
## w命令
w命令查看當前登錄的用戶。當系統中存在異常登錄的用戶,說明有可能系統被入侵,需要加固我們的系統安全,強制踢掉異常登錄的用戶,踢掉用戶可以使用kill命令。
```
[djangowang@localhost ~ ]#?w
00:17:54 up 188 days, 23:28, 1 user, load average: 0.12, 0.16, 0.17
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
djangowang pts/0 58.155.233.6 00:17 0.00s 0.02s 0.00s w
```
## top 命令
top命令(display Linux processes)動態的查看當前系統狀態,包括CPU、內存等主要的信息。

**進入與退出**
關于top命令的使用與退出,如下。
```
[djangowang@localhost ~]# top
```
通過“ctrl+c ”快捷鍵或小寫字母q退出。
**top命令輸出第一部分**
* 第一行,系統啟動天數,登錄用戶數和load average(系統負載)
* 第二行,Tasks: 29 total (進程總數 )、1 running (正在運行的進程數) 、28 sleeping (睡眠的進程數 )、0 stopped (停止的進程數 )、0 zombie (僵尸進程數)
* 第三行,Cpu(s): 0.3% us (用戶空間占用CPU百分比) 、1.0% sy (內核空間占用CPU百分比 )、0.0% ni (用戶進程空間內改變過優先級的進程占用CPU百分比) 、98.7% id (空閑CPU百分比) 、0.0% wa (等待輸入輸出的CPU時間百分比) 、0.0% hi (硬中斷占比)、0.0% si (軟中斷占比)
* 第三行,Mem: 191272k total (物理內存總量) 、173656k used (使用的物理內存總量) 、17616k free (空閑內存總量 )、22052k buff/cache (Buffer用來緩存尚未寫入磁盤的內容,Cache(Page Cache)用于從磁盤讀取的內容 )
* 第四行,Swap: 192772k total (交換區總量) 、0k used (使用的交換區總量)、192772k free (空閑交換區總量)。
**top命令輸出第二、三部分**
* PID 進程Id
* USER 進程所有者的用戶名
* %CPU CPU時間占用的百分比
* TIME+ 進程使用的CPU時間總計,單位1/100秒
* COMMAND 命令名/命令行
**其他參數**
進程信息區統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。
| 列名 | 含義 |
| --- | --- |
| PPID | 父進程id |
| PR | 優先級 |
| NI | 負值表示高優先級,正值表示低優先級 |
| VIRT | 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES |
| RES | 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA ,CODE 可執行代碼占用的物理內存大小,單位kb ,DATA 可執行代碼以外的部分(數據段+棧)占用的物理內存大小,單位kb |
| SHR | 共享內存大小,單位kb |
**案例**
1. 輸入TOP命令后,再輸入1,查看邏輯CPU的個數
2. “top -u root”,查看用戶為root的動態進程信息
3. “top -p 1233”,查看指定PID的動態進程信息
4. “top -c”, 查看命令的完成路徑
5. “top -m" 切換顯示內存信息
6. 輸入TOP命令后,再次輸入大寫字母E,替換內存與swap的顯示單位,單位Mib
7. 輸入TOP命令后,再次輸入小寫字母e, 替換VIRT、RES和SHR的顯示單位,單位m
8. 輸入TOP命令后,再次輸入小寫字母f,添加更多列選項。
## ps命令
ps (ps - report a snapshot of the current processes)命令查看系統進程命令。ps命令的常用參數:
* -e # 顯示所有進程,環境變量
* -f # 全格式
* -u # 顯示指定用戶的進程
* -l # 顯示自己的Bash相關的進程
* -o # 顯示指定字段
1.ps命令的案例。
```
[djangowang@localhost ~ ]# ps –efl
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 68272 ep_pol 2020 ? 00:22:28 /usr/lib/systemd/systemd --system --deserialize 22
1 S root 2 0 0 80 0 - 0 kthrea 2020 ? 00:00:05 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 2020 ? 00:06:54 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 2020 ? 00:00:00 [kworker/0:0H]
...
```
返回解釋:
* F 代表這個程序的旗標 (flag), 4 代表使用者為 super user(管理員用戶)
* S 代表這個程序的狀態 (STAT)
* UID 程序被該 UID 所擁有
* PID 程序進程ID
* PPID 父程序的ID
* C CPU 使用的資源百分比
* PRI Priority (優先執行序) 的縮寫
* NI Nice 值,進程的優先級
* ADDR kernel function,一般就是 "-"
* SZ 使用掉的內存大小
* WCHAN 程序是否正在運行中,若為 - 表示正在運行中
* TTY 登入者的終端機位置
* TIME 使用掉的 CPU 時間
* CMD 所下達的指令為何
2.顯示進程的指定字段,其中字段含義如下
* pid # 進程Id
* comm # 進程名
* user # 進程用戶
* lstart # 啟動時間
* etime # 運行時間
以下為執行命令。
```
[djangowang@localhost ~ ]#?ps -eo pid,comm,user,lstart,etime
16776 kworker/0:2 root Tue Mar 16 21:24:01 2021 01:25:18
17465 kworker/0:0 root Tue Mar 16 21:29:02 2021 01:20:17
22886 kworker/u4:1 root Sun Mar 7 13:05:01 2021 9-09:44:18
...
```
3.關于nice值,當服務器資源比較緊張的時候,可以通過調整優先級來優先處理某個進程的請求。nice 優先級由 -20~19這個范圍來表示優先級大小,數值越小,優先級越高,使用renice命令來修改它,如renice -20 1460 ,來將1460這個進程的優先級調整為-20。
*注:負載不高時可以使用top命令或ps命令查看系統負載,但負載高時一定要用ps命令,因為top命令也需要CPU大量計算,在系統負責高時加重系統的負擔。*
## kill命令
kill命令主要用于“殺”進程,它的工作原理是給進程發信號,讓其結束自己,最終怎么處理這個信號要看接收信號的進程本身和系統內核。kill命令的常用參數:
* -l # 查看信號列表
* HUP # 殺掉進程并重啟進程
* -9 # 強制殺進程
1.查看進程,查殺進程、強制查殺進程,和殺死并重啟進程。
```
[djangowang@localhost ~ ]# ps –ef
UID PID PPID C STIME TTY TIME CMD
root 154 7 0 Jun10 ? 00:00:00 [pdflush]
[djangowang@localhost ~ ]# kill 154
```
2.查看當前登錄的用戶,發現異常用戶后,將異常用戶剔除。
```
[djangowang@localhost ~ ]# w
21:51:32 up 23:50, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 116.77.73.251 21:51 4.00s 0.01s 0.00s w
root pts/1 106.53.60.21 21:51 4.00s 0.01s 0.01s -bash
```
譬如,剔除來自IP:106.53.60.21的用戶。查到它的進程ID,并殺掉這個進程。
```
[djangowang@localhost ~ ]# ps -ef | grep pts/1
root 12911 1674 0 21:51 ? 00:00:00 sshd: root@pts/1
[root@VM-0-3-centos ~]# kill -9 12911
```
這時異常登錄的用戶會斷線。
3.關于kill的常見應用場景。
* 進程處于IO等待中,這個時候屬于信號屏蔽階段,對于Kill發送過來的信號,自然不會做出反應,要判斷這種情況,可以通過命令 ps aux|grep pid 查看進程狀態,如果是D狀態,則屬于這種情況。這個情況下,一旦IO得到滿足了,再次發Kill就可以干掉進程,否則只能重啟服務器。
* CPU達到100%了,按CPU負載進行從高到底排序命令ps aux --sort=-pcpu,優先殺掉高負載的進程,否則進程得不到必須的CPU的處理,整個機器會慢慢的卡死或工作異常。
* 僵尸進程是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵尸進程。我們可以通過命令 ps aux | grep z 進程狀態查到它,并將它殺掉。
## free命令
free (Display amount of free and used memory in the system)內存查看命令。free命令常用參數:
* -m # 用 M顯示內存的使用情況
* -i # 顯示Inode信息
我們來查看一下當前系統內存與Swap的情況。
```
[djangowang@localhost ~]# free -m
total used free shared buff/cache available
Mem: 992 385 63 0 544 459
Swap: 0 0 0
```
返回解釋:
* total:表示物理內存總量
* used:內存的使用量
* free:未被分配的內存
* shared:共享內存
* buffers/cache:Buffer用來緩存尚未寫入磁盤的內容,Cache(Page Cache)用于從磁盤讀取的內容,此功能主要用于提高系統的性能
* available :是應用程序認為可用內存數量,available = free + buffer + cache
## df命令
df (report file system disk space usage)查看磁盤大小命令 。df命令的常用參數:
* -h # 可讀性較好的方式顯示
* -i # 顯示Inode的信息
```
[djangowang@localhost ~]# df -h
文件系統 容量 已用 可用 已用率% 掛載點
devtmpfs 487M 0 487M 0% /dev
tmpfs 497M 24K 497M 1% /dev/shm
tmpfs 497M 424K 496M 1% /run
tmpfs 497M 0 497M 0% /sys/fs/cgroup
/dev/vda1 50G 18G 29G 39% /
tmpfs 100M 0 100M 0% /run/user/0
```
*注:掛載點的可用率是一個重要的指標,通常監控服務器的磁盤,此值一個重點的監控項*
## ifconfig命令
Ifocnfig命令查看當前系統網卡的IP地址。還可以通過此命令對網卡的狀態進行管理。
```
[djangowang@localhost ~ ]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0A:EB:23:8B:90
inet addr:192.168.102.131 Bcast:192.168.102.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2409578 errors:0 dropped:0 overruns:0 frame:0
TX packets:965998 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:840272734 (801.3 MiB) TX bytes:918115554 (875.5 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2307728 errors:0 dropped:0 overruns:0 frame:0
TX packets:2307728 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:161369570 (153.8 MiB) TX bytes:161369570 (153.8 MiB)
```
以下為Ifconfig命令的輸出解釋:
* eth0表示:以太網卡零
* inet addr:192.168.102.131本機的IP地址
* Bcast:192.168.102.255 本機的廣播地址,用于同時發信息給網絡上的其它地址
* Mask:255.255.255.0 本機淹碼,本機與網絡其他機器進行通信時,判斷是否在同一網內
* RX bytes:840272734 (801.3 MiB) RX接收數據大小
* TX bytes:918115554 (875.5 MiB) TX發送數據大小
* MTU:每個數據包的最大傳輸單元位(MAXimum Transmission Unit)用來控制數據包大小,默認是1500
1.Ifconfig除用于查看本機的IP地址以外,可以修改本機的IP地址(主要用在局域網場景)。
```
[djangowang@localhost ~ ]# ifconfig eth0:0 192.168.102.10 netmask 25.255.255.0
eth0 Link encap:Ethernet HWaddr 00:0A:EB:23:8B:90
inet addr:192.168.102.10 Bcast:192.168.102.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2409578 errors:0 dropped:0 overruns:0 frame:0
TX packets:965998 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:840272734 (801.3 MiB) TX bytes:918115554 (875.5 MiB)
```
2.Ifconfig命令關閉和開啟網卡。Down關閉Eth0網卡,Up開啟Eth0網卡。
```
[djangowang@localhost ~ ]# ifconfig eth0 down
[djangowang@localhost ~ ]# ifconfig eth0 up
```
## netstat命令
Netstat命令查看本機網絡的狀態和路由,Netstat命令的常用參數:
* \-n # 不做名字解釋
* \-l # 列出有在 Listen (監聽) 的服務狀態
* \-t # 顯示TCP相關選項
* \-r # 查看本機路由
1.查看本機監聽的TCP端口。
```
[djangowang@localhost ~ ]# netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
```
2.查看本機路由。
```
[djangowang@localhost ~ ]# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 0.0.0.0 255.255.224.0 U 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 0 0 0 eth0
```
*注:以上命令的結果與rounte -n 命令的結果一致*
## lsof命令
lsof命令查看連接狀態。lsof命令的常用參數:
* -i # 接端口,查看端口的連接狀態
查看80端口是由哪個程序監聽的。
```
[djangowang@localhost ~ ]# netstat –an | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 :::80 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
...
[djangowang@localhost ~ ]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
httpd 28126 root 3u IPv6 87902392 TCP *:http (LISTEN)
httpd 28141 www 3u IPv6 87902392 TCP *:http (LISTEN)
httpd 28142 www 3u IPv6 87902392 TCP *:http (LISTEN)
...
```
## 檢索命令
Locate命令用于快速檢索文件,它和Find命令的區別,Find實時檢索磁盤上的文件,Locate是檢索的存在數據庫中的索引,所以速度要比Find命令快很多,但確實檢索并非實時數據。Locate命令的使用方式:
```
[djangowang@localhost ~ ]# updatedb && locate *.conf
```
它的工作原理,Updatedb命令是將當前磁盤上的數據做一個索引更新到本地數據庫中,接著使用Locate命令來檢索索引中的文件。
# 特殊符號
Linux除了系統命令外還有一些常用的符號命令。在Linux哲學中你會發現它的設計初衷,并不是把所有的功能設計的大而全,而是小而精,譬如ls并不能滿足我們所有的需求,但是我們可以通過“管道”拼接其它命令的方式來實現我們想要的功能。當你真正掌握Linux后,你可以想一下是否有什么功能是Linux不能完成的,貌似是沒有,所以希望讀者在學習Linux過程中,還能適當了解命令和操作系統開發的背景和它背后設計的哲學。
## 管道命令
管道“|”主要用于串聯命令的輸入和輸出。前一個命令的輸出作為第二個命令的輸入。
```
[djangowang@localhost ~]# cat /etc/passwd | cut -d: -f1 > log
````
多個管道,將字符串進行切割并將大寫轉為小寫。
```
[djangowang@localhost ~]# echo "Hello World : Hello Linux" | cut -d : -f1 | tr [:upper:] [:lower:]
hello world
```
## && 和 || 符號的使用
作為Linux系統管理員要學會“偷懶”,能一行實現的任務就避免通過多行多個命令來實現。在 Linux中就有這樣一對命令用來“偷懶” ,其中“&& ”表示前一個命令執行成功,再執行后一個命令,其中命令與命令之間,可以通過“&&”無限延續下去。“||”和“&&”正好相反,表示前一個命令執行失敗,再執行第二個命令。
1.“&&”符號案例。
```
[djangowang@localhost ~]# ls && mv * /tmp
```
*注:還可以使用“;”來將兩個命令放到一行,“;”與 “&&” 相比,前者只起到將多個命令放入一行執行,語法上不會報錯*
2.“||” 符號案例。
```
[djangowang@localhost ~]# ls || echo "empty"
```
## 重定向
在Linux中重定向是非常實用的功能。譬如,將某個命令的輸出重定向文件中,間隔一段時間后再次重定向,對比兩次命令輸出的差別。
| 命令 | 解釋 |
| --- | --- |
| command > file | 將輸出重定向到 file |
| command < file | 將file中內容重定向給命令 |
| command >> file | 將輸出以追加的方式重定向到 file |
| command > file 2>&1 | 標準錯誤輸出 重定向到 標準輸出 |
| command > /dev/null | 將數據重定向到空洞 |
| > filename | 清空文件 |
三個比較常見的文件描述符。
| 文件描述符 | 縮寫 | 描述 |
| --- | --- | --- |
| 0 | STDIN | 標準輸入 |
| 1 | STDOUT | 標準輸出 |
| 2 | STDERR | 標準錯誤輸出 |
1.ls查看test文件,其中test文件并不存在會報錯,如何將錯誤的信息追加到log日志文件,這里我們就可以使用文件描述符“2”。
```
[djangowang@localhost ~]# ls test > log
ls: cannot access tt: No such file or directory
[djangowang@localhost ~]# ls test 2> log
```
2.將passwd文件內容重定向給wc命令。
```
[djangowang@localhost ~]# wc < /etc/passwd
37 72 1878
```
3.清空文件內容。
```
[djangowang@localhost ~]# > test
```
## 后臺運行相關命令
我們在管理服務器時通常需要把一些腳本放置在后臺運行或從后臺調出到前臺運行等,這時就需要使用到“&”放置后臺命令、nohup命令、jobs命令、fg命令放置后臺運行、bg調用前臺運行和ctrl + z快捷鍵等。在測試這些命令前,我們先編寫測試程序腳本 test.sh,內容如下:
```
#!/bin/bash
while :
do
echo "this is test"
sleep 2
done
```
接下來我們介紹以下6個案例的使用方法:
* & 將程序放到后臺
* nohup 將程序放到后臺,同時將標準輸出和標準錯誤寫入當前目錄下的nohup.out文件
* jobs查看后臺命令列表
* bg將后臺停止的命令,轉為執行狀態
* fg將后臺的進程,調到前臺執行
* ctrl + z快捷鍵,暫定某后程序的執行
1. 將程序放到后臺運行。
```
[djangowang@localhost ~]# sh test.sh >> log &
```
將任務放到后臺 ,即使關閉Shell退出當前Session依然繼續運行,但標準輸出和標準錯誤信息會丟失。
2.nohup命令將程序放到后臺運行。
```
[djangowang@localhost ~]# nohup sh test.sh >> log &
```
將任務放到后臺,關閉標準輸入,前臺不再接收任何輸入,重定向標準輸出和標準錯誤到當前目錄下的nohup.out文件,即使關閉Shell退出當前Session依然繼續運行。
3.jobs命令,查看當前后臺的命令列表。
```
[djangowang@localhost ~]# jobs
[1] Stopped sh test.sh >> log
[2]- Stopped sh test.sh >> log
[3]+ Stopped sh test.sh >> log
[4] Running nohup sh test.sh >> log &
[5] Running nohup sh test.sh >> log &
[6] Running nohup sh test.sh >> log &
```
4.bg命令將后臺暫停的命令變為繼續執行。 通過jobs命令返回的內容,執行bg %1 ,其中“%”是一個固定格式后接jobs返回的列表狀態為Stopped的,將暫停的狀態改為已執行。
```
[djangowang@localhost ~]# bg %1
[1] Stopped sh test.sh >> log
[2]- Stopped sh test.sh >> log
[3]+ Stopped sh test.sh >> log
[4] Running nohup sh test.sh >> log &
[5] Running nohup sh test.sh >> log &
[6] Running nohup sh test.sh >> log &
```
5.fg命令將放置后臺命令調到前臺執行。
```
[djangowang@localhost ~]# fg %1
[1] Stopped sh test.sh >> log
```
6. ctrl + z快捷鍵,可以將一個正在前臺執行的命令放到后臺,并且暫停。
## 創建多個文件
通過“{}”符號可以一次創建多個文件或目錄,可以按規則也可以自定義。
```
[djangowang@localhost ~]# touch {a,b,c,d,f} && ls
a b c d f
```
# 認識系統重要的文件
## 認識 /etc/passwd 文件與/etc/shadow文件
這兩個文件,主要用于存放系統的用戶與密碼。
**/etc/passwd文件**
使用vim命令打開passwd文件,文件每一行都代表一個用戶,切記不要輕易修改本文件,如果一定要修改需要提前進行備份。Linux系統管理員養成一個修改或刪除文件前,做提前備份的習慣也是非常重要的。
```
# vim /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...
```
上面是系統預設的幾個用戶,是系統在使用的。我們先來看一下root 這個系統管理員用戶,你可以明顯的看出來,每一行使用“:”分隔開,共有七個列,分別是 :
* 用戶名稱:如root就是預設的系統管理員的用戶名稱
* 密碼:早期的Unix系統的密碼,是放在這個文字的,不過由于這樣一來很容易造成數據的被竊取,所以后來就將數據給它改放到 /etc/shadow 中了
* UID:系統用戶的ID。其中0為管理員用戶權限,1-1000 為系統保留,1000以上為用戶主動創建的ID
* GID:用戶的組ID,這個與 /etc/group文件有關,其實 /etc/group文件與 /etc/passwd 差不多,存放組關系和組關系的屬性
* 家目錄:用戶的家目錄也可以稱為宿主目錄,以上面為例, root的家目錄在 /root ,所以當 root 登入之后,馬上在的所在就是 /root
* Shell :系統解析Shell的解析器,默認為/bin/bash。如果不希望用戶登錄可以寫 /bin/nologin 這一條
**/etc/shadow文件**
由于/etc/passwd文件并不安全,所以后來發展出將密碼移動到 /etc/shadow 這個文件中。首先讓我們看一下這個文件的內容。
```
[djangowang@localhost ~]# cat /etc/shadow
root:$1$t4Orj6cl$vHdMadf134adf22vvRrQWU0:18388:0:99999:7:::
bin:*:16659:0:99999:7:::
daemon:*:16659:0:99999:7:::
adm:*:16659:0:99999:7:::
lp:*:16659:0:99999:7:::
...
```
同 /etc/passwd 文件一樣,文件中每行代表一個用戶,同樣使用 “:” 作為分隔符,不同之處在于,每行用戶信息被劃分為 9 個字段。每個字段的含義如下:
* 用戶名
* 加密密碼
* 最后一次修改時間
* 最小修改時間間隔
* 密碼有效期
* 密碼需要變更前的警告天數
* 密碼過期后的寬限時間
* 用戶的密碼失效時間
* 保留字段
## 認識/etc/login.defs 文件
/etc/login.defs文件,主要定義了用戶登錄和用戶設置的一些基本信息,用于提升我們系統的安全性。
| 設置項目 | 含義 |
| --- | --- |
| PASS\_MAX\_DAYS 99999 | 密碼有效期,99999是自1970年1月1日起密碼有效的天數,相當于 273 年,可理解為密碼始終有效 |
| PASS\_MIN\_DAYS 0 | 表示自上次修改密碼以來,最少隔多少天后用戶才能再次修改密碼,默認值是 0 |
| PASS\_WARN\_AGE 7 | 指定在密碼到期前多少天,系統就開始通過用戶密碼即將到期,默認為 7 天 |
| UID\_MIN 1000 | 指定UID從1000開始 |
| UID\_MAX 60000 | 指定最大的UID為60000 |
| GID\_MIN 1000 | 指定GID為1000開始 |
| GID\_MAX 60000 | 用戶GID最大為60000 |
| CREATE\_HOME yes | 指定在創建用戶時,是否同時創建用戶主目錄,yes表示創建,no則不創建,默認是yes |
| UMASK 077 | 用戶主目錄的權限默認設置為 077 |
| USERGROUPS\_ENAB yes | 指定刪除用戶的時候是否同時刪除用戶組,準備地說,這里指的是刪除用戶的初始組,此項的默認值為 yes |
| ENCRYPT\_METHOD SHA512 | 指定用戶密碼采用的加密規則,默認采用 SHA512,這是新的密碼加密模式,原先的 Linux 只能用 DES 或 MD5 加密 |
# 定時任務
在Linux中定時任務是非常常用的工具之一,如系統定時備份、恢復、監控采集和系統維護等場景都需要使用到它。通常在Linux中有三種定時任務分別:
* 一次性的任務,用“at”
* 周期性任務,用“crond”
* 異步的定時任務調度器,用“anacrontab”
本節主要介紹一次性任務和周期性任務兩種最常用的應用場景。
## 一次性的任務
一次性任務我們通常用“at”命令來完成,譬如以下案例。
```
[djangowang@localhost ~]# at 17:45
at> ls /etc/* > /tmp/djangowang.log
at> <EOT>
```
其中17:45為執行的時間,ls為執行的命令,“<EOT>”為結束符,通過快捷鍵“ctrl + d” 退出。通過at-l查看當前一次性的任務隊列。
```
[djangowang@localhost ~]# at -l
4 Mon Feb 22 17:45:00 2021 a root
```
## 多次有周期性任務
Crond定時計劃任務,我們可以將一些例行的工作交給系統執行,譬如每天的數據備份這時我們就需要用到Crond它的常用命令是Crontab,Crontab的基本操作:
* crontab -u # 設定某個用戶的cron服務
* crontab -l # 列出某個用戶cron服務的詳細內容
* crontab -r # 刪除某個用戶的cron服務
* crontab -e # 編輯某個用戶的cron服務
* crontab -i # 打印提示,輸入yes等確認信息
我們執行( crontab -e )調出任務列表,其中任務列表的格式如下(或查看cat /etc/crontab文件 ):
```
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
定時任務的每段為:分,時,日,月,周,用戶,命令
第1列表示分鐘1~59 每分鐘用\*或者 \*/1表示
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6(0表示星期天)
第6列要運行的命令
\*:表示任意時間都,實際上就是“每”的意思。可以代表00-23小時或者00-12每月或者00-59分
\-:表示區間,是一個范圍,00 17-19 * * * cmd,就是每天17,18,19點的整點執行命令
,:是分割時段,30 3,19,21 * * * cmd,就是每天凌晨3和晚上19,21點的半點時刻執行命令
/n:表示分割,可以看成除法,*/5 * * * * cmd,每隔五分鐘執行一次
```
關于crond的配置文件,它分別在幾個地方如/var/spool/cron/用戶名,/etc/crontab和/etc/cron.d/\*。
## 定時任務案例
1. 每兩分鐘執行一次( command )命令。
```
*/2 * * * command
```
2.每晚的21:30重啟Apache。
```
30 21 * * * /usr/local/etc/rc.d/httpd restart
```
## 關于定時任務的常用文件
在/etc目下有這些文件:
* cron.d/ # 系統crontab存放目錄
* cron.deny # 文件中的用戶不能使用cron
* cron.hourly/ # 小時存放
* cron.daily/ # 天存放
* cron.monthly/ # 月存放
* cron.weekly/ # 周存放
在 /var/spool/cron/下還有,按用戶存放的crontab。
# 系統備份
作為一個合格的運維工程師,平日工作中最重要的就是備份數據,除備份數據外還要養成以下比較好的習慣:
* 登錄盡量不使用root(管理員)賬號
* 修改配置文件前要對配置文件提前備份副本
* 刪除文件前,可以先將文件移動到指定的刪除目錄,等過一定的時間如1天后再刪除
在Linux打包和壓縮的命令工具有tar、zip、gzip和bzip2等,讀者如果了解他們可以根據自己情況選擇不同的打包和壓縮工具,這里筆者推薦使用tar命令來對系統進行備份與恢復。tar命令使用分為兩種分別為打包和壓縮,關于tar命令的參數:
* -c 將多個文件或目錄進行打包
* -A 追加 tar 文件到歸檔文件
* -f 包名 指定包的文件名。包的擴展名是用來給管理員識別格式的,所以一定要正確指定擴展名
* -v 顯示打包文件過程
* -z 壓縮
* -C 指定解壓目錄
## tar 打包文件
譬如我備份/etc/目錄下的*.conf文件。可以使用以下命令,先將 \*.conf復制到/tmp/bakup目錄中。
```
[djangowang@localhost ~]# find /etc/ -name "*.conf" -exec cp {} /tmp/bakup \;
```
將/tmp/bakup目錄進行打包,命令如下:
```
[djangowang@localhost ~]# tar -cvf bakup.2021.10.1.tar /tmp/bakup
```
打包并不是把文件壓縮,只是將目錄中的文件打包成一個文件包,方便備份。將備份的解包:
```
[djangowang@localhost ~]# tar -xvf bakup.2021.10.1.tar -C /tmp/bakup
```
## tar 壓縮文件
將/tmp/bakup目錄進行壓縮備份。
```
[djangowang@localhost ~]# tar -cvzf bakup.2021.10.1.tar.gz /tmp/bakup
```
和打包相比,這里會進行壓縮,適合備份的文件比較多的場景,特別是比較大的文本文件非常適合這種方式,但與打包相比壓縮會有一定延遲(延遲時間和文件大小相關),但與打包相比優勢是最終存儲大小要比打包方式小很多,節約我們更多磁盤空間。
```
[djangowang@localhost ~]# tar -xvzf bakup.2021.10.1.tar.gz -C /tmp/bakup
```
# 軟件安裝
在Linux的世界中有著不同的發行版本,不同的發行版本安裝軟件方式也不一樣。在CentOS7中,常見的三種安裝方式:
* yum網絡安裝
* 本地安裝rpm
* 源碼安裝
## yum安裝軟件
yum( Yellow dog Updater, Modified)是 Fedora 、RedHat和SUSE發行版本 中的 Shell前端軟件包管理軟件,它可以方便的從互聯網下載軟件,并自己解決軟件之間的依賴問題。以安裝Nginx為例,我們直接可以執行以下命令。
```
[djangowang@localhost ~]# yum install nginx
```
關于yum命令的主要參數:
* 列出所有可更新的軟件清單命令:yum check-update
* 更新所有軟件命令:yum update
* 僅安裝指定的軟件命令:yum install <package_name>
* 僅更新指定的軟件命令:yum update <package_name>
* 列出所有可安裝的軟件清單命令:yum list
* 刪除軟件包命令:yum remove <package_name>
* 查找軟件包命令:yum search <keyword>
## RPM 安裝軟件
rpm命令用于安裝本地以*.rpm結尾的包軟件。譬如在本地安裝Nginx.rpm。通常這種情況是服務器與互聯網不通,如校園內網、公司內網等,我們通過從公網下載RPM文件后,通過U盤將數據轉到內網服務器并安裝。
```
[djangowang@localhost ~]# rpm -ivh nginx.rpm
```
查看本機安裝Nginx的版本。
```
[djangowang@localhost ~]# rpm -qa | grep nginx
```
關于rpm命令常用的參數如下:
* -a # 查詢所有軟件包。
* -e # 刪除指定軟件包
* -i # 顯示軟件包信息
* -l # 列表顯示已經安裝的軟件包
* -q # 使用詢問模式,當遇到任何問題時,rpm指令會先詢問用戶
* -v # 顯示指令執行過程
* -vv # 詳細顯示指令執行過程,便于排錯
* -h # 顯示安裝的進度
## 源碼安裝
我們需要對軟件進行一些定制,如開關某些核心功能,以達到安全和性能的一個平衡,這些我們都需要通過源碼編譯來安裝軟件。我們以安裝Openssh軟件包為例。 首先下載軟件包:
```
[djangowang@localhost ~]# wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz
```
解壓縮后進入目錄進行配置、編譯和安裝三步:
```
[djangowang@localhost ~]# cd openssl-1.1.1
[djangowang@localhost ~]# ./config shared zlib 配置
[djangowang@localhost ~]# make 編譯
[djangowang@localhost ~]# make install 安裝
```
在CentOS7.8中會報“fatal error: zlib.h: no such file or directory ”錯誤,解決方法。
```
[djangowang@localhost ~]# wget http://www.zlib.net/zlib-1.2.11.tar.gz
[djangowang@localhost ~]# tar zxvf zlib-1.2.11.tar.gz
[djangowang@localhost ~]# cd zlib-1.2.11
[djangowang@localhost ~]# ./configure
[djangowang@localhost ~]# make test
[djangowang@localhost ~]# make install
```
接著構建共享庫。
```
[djangowang@localhost ~]# make clean
[djangowang@localhost ~]# ./configure --shared
[djangowang@localhost ~]# make test
[djangowang@localhost ~]# make install
[djangowang@localhost ~]# cp zutil.h /usr/local/include
[djangowang@localhost ~]# cp zutil.c /usr/local/include
```
其中配置是指軟件安裝目錄、開啟的功能和參數等,編譯(make)是指將C語言代碼編譯成可執行文件,安裝(make install)是指將代碼安裝到系統的指定目錄中。根據軟件的不同,安裝后還要經過一些配置如下:
```
[djangowang@localhost ~]# mv /usr/bin/openssl /usr/bin/openssl.bak
[djangowang@localhost ~]# mv /usr/include/openssl /usr/include/openssl.bak
[djangowang@localhost ~]# find / -name openssl
[djangowang@localhost ~]# ln -s /usr/local/bin/openssl /usr/bin/openssl
[djangowang@localhost ~]# ln -s /usr/local/include/openssl /usr/include/openssl
[djangowang@localhost ~]# echo "/usr/local/lib64/" >> /etc/ld.so.conf
[djangowang@localhost ~]# ldconfig
[djangowang@localhost ~]# openssl version -a
```
最后驗證軟件是否安裝成功,執行“openssl version”命令。
# 磁盤管理
我們在搭建一臺Linux服務器或購買一臺云服務器后,隨著時間的推移數據的增長,這時我們的磁盤容量就會成為瓶頸,所以要增加新的數據盤來擴容。
## 云服務器磁盤管理
在云服務器管理硬盤分為三步:
* 創建云硬盤 & 掛載
* 查看云硬盤 & 格式化
* Mount云硬盤到指定目錄
**創建云硬盤 & 掛載**
購買的云服務器與云硬盤必須在同一個可用區,購買后需要在云控制臺上進行掛載。
**查看云硬盤 & 格式化**
在云控制臺掛載硬盤后,相當于我們在真實的物理場景將新買的硬盤插入主機。 接著我們執行fdisk就可以查看到這塊云硬盤,以下為fdisk命令的參數:
* -l # 列表顯示信息的硬盤信息
```
[djangowang@localhost ~]# fdisk -l
Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009ac89
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 20971486 10484719+ 83 Linux
Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
```
我們可以看到/dev/vda是原始的云硬盤,/dev/vdb為新增的云硬盤,我們將/dev/vdb格式化成ext4分區格式。
```
[djangowang@localhost ~]# mkfs.ext4 /dev/vdb
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
```
在Linux中有兩種命令來格式化硬盤,分別為:
* mkfs.ext4 /dev/vdb(推薦)
* mkfs -t ext4 /dev/vdb
兩種命令的底層工作原理是一樣的,推薦第一種,因為它更加簡潔。
**掛載云硬盤到指定目錄**
首先創建/data1/目錄,接著將/dev/vdb掛載到新的目錄。
1.創建掛載的目錄。
```
[djangowang@localhost ~]# mkdir /data1
```
2.將磁盤掛載到創建的目錄上。
```
[djangowang@localhost ~]# mount /dev/vdb /data1
```
3.掛載后可以通過df -h命令或lsblk命令,查看最終的掛載狀態。這里需要注意,當服務器重啟后,通過以上方法掛載后的磁盤會消失,所以我們需要將/dev/vdb掛載的方式,寫入/etc/fstab文件中,系統重啟后會自動讀取/etc/fstab文件內容,并將其內容掛載到系統上。關于/etc/fstab文件格式如下。
```
[djangowang@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Mar 7 06:38:37 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=4b499d76-769a-40a0-93dc-4a31a59add28 / ext4 defaults 1 1
uuid 掛載目錄 掛載分區格式 defaults 1 1
```
在/etc/fstab中的uuid,可以通過blkid命令查看。
```
[djangowang@localhost ~]# blkid
/dev/sr0: UUID="2021-02-23-11-23-13-00" LABEL="config-2" TYPE="iso9660"
/dev/vda1: UUID="4b499d76-769a-40a0-93dc-4a31a59add28" TYPE="ext4"
/dev/vdb: UUID="839fd6ce-69fb-460d-9227-84ac5f1df6f8" TYPE="ext4" # 將本行信息追加到/etc/fstab中
```
將/dev/vdb的相關信息,寫入/etc/fstab文件中,具體如下。
```
[djangowang@localhost ~]# cat /etc/fstab
UUID=839fd6ce-69fb-460d-9227-84ac5f1df6f8 /data1 ext4 defaults 1 1
```
*注:修改/etc/fstab文件屬于高危的操作,有可能會影響系統的正常啟動,所以修改前建議備份此文件后再修改,當出現異常可以用系統單用戶模式或VNC登錄系統解決。*
# 本章小結
在這一章我們首先學習了Linux啟動過程、啟動過程讓我們了解了Linux啟動過程中的細節和原理,介紹啟動過程中調用的一些重要文件;然后我們學習了系統管理員常用的系統命令和參數,除了這些系統命令外還有一些符號類的命令,我們經常說系統管理員要學會"偷懶",能用一行命令完成的事情絕對不要用兩行或多行;接著我們又學習了/etc目錄一些比較重要的文件,這些可以讓我們更加深入的掌握Linux的原理;我們還學習了Linux的軟件安裝,常見安裝軟件的三種方式網絡安裝、本地安裝和源碼安裝;定時計劃任務也是Linux非常重要的知識點之一,結合我們后學學習Shell編程可以讓Linux定期為我們執行一些例行的任務減少人為干預;接著我們學習了磁盤管理,當我們購買或使用服務器時,隨著時間的推移,數據的增長磁盤不夠用,我們就需要增加新的磁盤,這節介紹了如何去增加一塊磁盤的操作過程;最后也是作為系統管理員最終要的任務就是備份數據,我們介紹備份數據和還原數據的過程,掌握這些可以讓我們后續成為一個合格的系統管理員。下一章我們繼續學習高級Linux系統管理和本章不同的是,本章要求讀者必須掌握,下一章要求讀者適當掌握,因為本章更多介紹的是如何管理一臺服務器所必備的知識,下章更多是作為系統管理員管理更多服務器時,所需要了解到的知識。
# 習題
1.如何進入單用戶模式?
2.top命令和ps命令的區別是? 什么場景下更適合用ps命令?
3.find命令與locate命令的區別是?
4.如何查看本機是否安裝了Nginx軟件包?
5.將/etc/下的文件,每天10點備份到/data1/目錄下,備份名的格式backup.年月日.tar.gz。