## 8.3 打包指令: tar
前一小節談到的指令大多僅能針對單一文件來進行壓縮,雖然 gzip, bzip2, xz 也能夠針對目錄來進行壓縮,不過, 這兩個指令對目錄的壓縮指的是“將目錄內的所有文件 "分別" 進行壓縮”的動作!而不像在 Windows 的系統,可以使用類似 [WinRAR](http://www.rar.com.tw/) 這一類的壓縮軟件來將好多數據“包成一個文件”的樣式。
這種將多個文件或目錄包成一個大文件的指令功能,我們可以稱呼他是一種“打包指令”啦! 那 Linux 有沒有這種打包指令呢?是有的!那就是鼎鼎大名的 tar 這個玩意兒了! tar 可以將多個目錄或文件打包成一個大文件,同時還可以通過 gzip/bzip2/xz 的支持,將該文件同時進行壓縮! 更有趣的是,由于 tar 的使用太廣泛了,目前 Windows 的 WinRAR 也支持 .tar.gz 文件名的解壓縮呢! 很不錯吧!所以下面我們就來玩一玩這個咚咚!
### 8.3.1 tar
tar 的選項與參數非常的多!我們只講幾個常用的選項,更多選項您可以自行 man tar 查詢啰!
```
[dmtsai@study ~]$ tar [-z|-j|-J] [cv] [-f 待創建的新文件名] filename... <==打包與壓縮
[dmtsai@study ~]$ tar [-z|-j|-J] [tv] [-f 既有的 tar文件名] <==察看文件名
[dmtsai@study ~]$ tar [-z|-j|-J] [xv] [-f 既有的 tar文件名] [-C 目錄] <==解壓縮
選項與參數:
-c :創建打包文件,可搭配 -v 來察看過程中被打包的文件名(filename)
-t :察看打包文件的內容含有哪些文件名,重點在察看“文件名”就是了;
-x :解打包或解壓縮的功能,可以搭配 -C (大寫) 在特定目錄解開
特別留意的是, -c, -t, -x 不可同時出現在一串命令行中。
-z :通過 gzip 的支持進行壓縮/解壓縮:此時文件名最好為 *.tar.gz
-j :通過 bzip2 的支持進行壓縮/解壓縮:此時文件名最好為 *.tar.bz2
-J :通過 xz 的支持進行壓縮/解壓縮:此時文件名最好為 *.tar.xz
特別留意, -z, -j, -J 不可以同時出現在一串命令行中
-v :在壓縮/解壓縮的過程中,將正在處理的文件名顯示出來!
-f filename:-f 后面要立刻接要被處理的文件名!建議 -f 單獨寫一個選項啰!(比較不會忘記)
-C 目錄 :這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項。
其他后續練習會使用到的選項介紹:
-p(小寫) :保留備份數據的原本權限與屬性,常用于備份(-c)重要的配置文件
-P(大寫) :保留絕對路徑,亦即允許備份數據中含有根目錄存在之意;
--exclude=FILE:在壓縮的過程中,不要將 FILE 打包!
```
其實最簡單的使用 tar 就只要記憶下面的方式即可:
* 壓 縮:tar -j<u>c</u>v -f filename.tar.bz2 要被壓縮的文件或目錄名稱
* 查 詢:tar -j<u>t</u>v -f filename.tar.bz2
* 解壓縮:tar -j<u>x</u>v -f filename.tar.bz2 -C 欲解壓縮的目錄
那個 filename.tar.bz2 是我們自己取的文件名,tar 并不會主動的產生創建的文件名喔!我們要自訂啦! 所以擴展名就顯的很重要了!如果不加 [-z|-j|-J] 的話,文件名最好取為 *.tar 即可。如果是 -j 選項,代表有 bzip2 的支持,因此文件名最好就取為 *.tar.bz2 ,因為 bzip2 會產生 .bz2 的擴展名之故! 至于如果是加上了 -z 的 gzip 的支持,那文件名最好取為 *.tar.gz 喔!了解乎?
另外,由于“ -f filename ”是緊接在一起的,過去很多文章常會寫成“-jcvf filename”,這樣是對的, 但由于選項的順序理論上是可以變換的,所以很多讀者會誤認為“-jvfc filename”也可以~事實上這樣會導致產生的文件名變成 c ! 因為 -fc 嘛!所以啰,建議您在學習 tar 時,將“ -f filename ”與其他選項獨立出來,會比較不容易發生問題。
閑話少說,讓我們來測試幾個常用的 tar 方法吧!
* 使用 tar 加入 -z, -j 或 -J 的參數備份 /etc/ 目錄
有事沒事備份一下 /etc 這個目錄是件好事!備份 /etc 最簡單的方法就是使用 tar 啰!讓我們來玩玩先:
```
[dmtsai@study ~]$ su - # 因為備份 /etc 需要 root 的權限,否則會出現一堆錯誤
[root@study ~]# time tar -zpcv -f /root/etc.tar.gz /etc
tar: Removing leading `/' from member names <==注意這個警告訊息
/etc/
....(中間省略)....
/etc/hostname
/etc/aliases.db
real 0m0.799s # 多了 time 會顯示程序運行的時間!看 real 就好了!花去了 0.799s
user 0m0.767s
sys 0m0.046s
# 由于加上 -v 這個選項,因此正在作用中的文件名就會顯示在屏幕上。
# 如果你可以翻到第一頁,會發現出現上面的錯誤訊息!下面會講解。
# 至于 -p 的選項,重點在于“保留原本文件的權限與屬性”之意。
[root@study ~]# time tar -jpcv -f /root/etc.tar.bz2 /etc
....(前面省略)....
real 0m1.913s
user 0m1.881s
sys 0m0.038s
[root@study ~]# time tar -Jpcv -f /root/etc.tar.xz /etc
....(前面省略)....
real 0m9.023s
user 0m8.984s
sys 0m0.086s
# 顯示的訊息會跟上面一模一樣啰!不過時間會花比較多!使用了 -J 時,會花更多時間
[root@study ~]# ll /root/etc*
-rw-r--r--. 1 root root 6721809 Jul 1 00:16 /root/etc.tar.bz2
-rw-r--r--. 1 root root 7758826 Jul 1 00:14 /root/etc.tar.gz
-rw-r--r--. 1 root root 5511500 Jul 1 00:16 /root/etc.tar.xz
[root@study ~]# du -sm /etc
28 /etc # 實際目錄約占有 28MB 的意思!
```
壓縮比越好當然要花費的運算時間越多!我們從上面可以看到,雖然使用 gzip 的速度相當快,總時間花費不到 1 秒鐘,但是壓縮率最糟糕! 如果使用 xz 的話,雖然壓縮比最佳!不過竟然花了 9 秒鐘的時間耶!這還僅是備份 28MBytes 的 /etc 而已,如果備份的數據是很大容量的, 那你真的要考慮時間成本才行!
至于加上“ -p ”這個選項的原因是為了保存原本文件的權限與屬性!我們曾在[第六章的 cp 指令介紹](../Text/index.html#cp)時談到權限與文件類型(例如鏈接文件)對復制的不同影響。 同樣的,在備份重要的系統數據時,這些原本文件的權限需要做完整的備份比較好。此時 -p 這個選項就派的上用場了。 接下來讓我們看看打包文件內有什么數據存在?
* 查閱 tar 文件的數據內容 (可察看文件名),與備份文件名有否根目錄的意義
要察看由 tar 所創建的打包文件內部的文件名非常的簡單!可以這樣做:
```
[root@study ~]# tar -jtv -f /root/etc.tar.bz2
....(前面省略)....
-rw-r--r-- root/root 131 2015-05-25 17:48 etc/locale.conf
-rw-r--r-- root/root 19 2015-05-04 17:56 etc/hostname
-rw-r--r-- root/root 12288 2015-05-04 17:59 etc/aliases.db
```
如果加上 -v 這個選項時,詳細的文件權限/屬性都會被列出來!如果只是想要知道文件名而已, 那么就將 -v 拿掉即可。從上面的數據我們可以發現一件很有趣的事情,那就是每個文件名都沒了根目錄了!這也是上一個練習中出現的那個警告訊息“tar: Removing leading `/' from member names(移除了文件名開頭的 `/' )”所告知的情況!
那為什么要拿掉根目錄呢?主要是為了安全!我們使用 tar 備份的數據可能會需要解壓縮回來使用, 在 tar 所記錄的文件名 (就是我們剛剛使用 tar -jtvf 所察看到的文件名) 那就是解壓縮后的實際文件名。 如果拿掉了根目錄,假設你將備份數據在 /tmp 解開,那么解壓縮的文件名就會變成“/tmp/<u>etc/xxx</u>”。 但“如果沒有拿掉根目錄,解壓縮后的文件名就會是絕對路徑, 亦即解壓縮后的數據一定會被放置到 <u>/etc/xxx</u> 去!”如此一來,你的原本的 /etc/ 下面的數據, 就會被備份數據所覆蓋過去了!

**Tips** 你會說:“既然是備份數據,那么還原回來也沒有什么問題吧?”想像一個狀況,你備份的數據是兩年前的舊版 CentOS 6.x, 你只是想要了解一下過去的備份內容究竟有哪些數據而已,結果一解開該文件,卻發現你目前新版的 CentOS 7.x 下面的 /etc 被舊版的備份數據覆蓋了!此時你該如何是好?大概除了哭哭你也不能做啥事吧?所以啰,當然是拿掉根目錄比較安全一些的。
如果你確定你就是需要備份根目錄到 tar 的文件中,那可以使用 -P (大寫) 這個選項,請看下面的例子分析:
```
范例:將文件名中的(根)目錄也備份下來,并察看一下備份文件的內容文件名
[root@study ~]# tar -jp<u>P</u>cv -f /root/etc.and.root.tar.bz2 /etc
[root@study ~]# tar -jtf /root/etc.and.root.tar.bz2
/etc/locale.conf
/etc/hostname
/etc/aliases.db
# 這次查閱文件名不含 -v 選項,所以僅有文件名而已!沒有詳細屬性/權限等參數。
```
有發現不同點了吧?如果加上 -P 選項,那么文件名內的根目錄就會存在喔!不過,鳥哥個人建議,還是不要加上 -P 這個選項來備份! 畢竟很多時候,我們備份是為了要未來追蹤問題用的,倒不一定需要還原回原本的系統中! 所以拿掉根目錄后,備份數據的應用會比較有彈性!也比較安全呢!
* 將備份的數據解壓縮,并考慮特定目錄的解壓縮動作 (-C 選項的應用)
那如果想要解打包呢?很簡單的動作就是直接進行解打包嘛!
```
[root@study ~]# tar -jxv -f /root/etc.tar.bz2
[root@study ~]# ll
....(前面省略)....
drwxr-xr-x. 131 root root 8192 Jun 26 22:14 etc
....(后面省略)....
```
此時該打包文件會在“本目錄下進行解壓縮”的動作! 所以,你等一下就會在主文件夾下面發現一個名為 etc 的目錄啰!所以啰,如果你想要將該文件在 /tmp 下面解開, 可以 cd /tmp 后,再下達上述的指令即可。不過,這樣好像很麻煩呢~有沒有更簡單的方法可以“指定欲解開的目錄”呢? 有的,可以使用 -C 這個選項喔!舉例來說:
```
[root@study ~]# tar -jxv -f /root/etc.tar.bz2 -C /tmp
[root@study ~]# ll /tmp
....(前面省略)....
drwxr-xr-x. 131 root root 8192 Jun 26 22:14 etc
....(后面省略)....
```
這樣一來,你就能夠將該文件在不同的目錄解開啰!鳥哥個人是認為,這個 -C 的選項務必要記憶一下的! 好了,處理完畢后,請記得將這兩個目錄刪除一下呢!
```
[root@study ~]# rm -rf /root/etc /tmp/etc
```
再次強調,這個“ rm -rf ”是很危險的指令!下達時請務必要確認一下后面接的文件名。我們要刪除的是 /root/etc 與 /tmp/etc, 您可不要將 /etc/ 刪除掉了!系統會死掉的~ ^_^
* 僅解開單一文件的方法
剛剛上頭我們解壓縮都是將整個打包文件的內容全部解開!想像一個情況,如果我只想要解開打包文件內的其中一個文件而已, 那該如何做呢?很簡單的,你只要使用 -jtv 找到你要的文件名,然后將該文件名解開即可。 我們用下面的例子來說明一下:
```
# 1\. 先找到我們要的文件名,假設解開 shadow 文件好了:
[root@study ~]# tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
---------- root/root 721 2015-06-17 00:20 etc/gshadow
---------- root/root 1183 2015-06-17 00:20 etc/shadow-
---------- root/root 1210 2015-06-17 00:20 etc/shadow <==這是我們要的!
---------- root/root 707 2015-06-17 00:20 etc/gshadow-
# 先搜尋重要的文件名!其中那個 grep 是“擷取”關鍵字的功能!我們會在第三篇說明!
# 這里您先有個概念即可!那個管線 | 配合 grep 可以擷取關鍵字的意思!
# 2\. 將該文件解開!語法與實際作法如下:
[root@study ~]# tar -jxv -f 打包檔.tar.bz2 待解開文件名
[root@study ~]# tar -jxv -f /root/etc.tar.bz2 etc/shadow
etc/shadow
[root@study ~]# ll etc
total 4
----------. 1 root root 1210 Jun 17 00:20 shadow
# 很有趣!此時只會解開一個文件而已!不過,重點是那個文件名!你要找到正確的文件名。
# 在本例中,你不能寫成 /etc/shadow !因為記錄在 etc.tar.bz2 內的并沒有 / 之故!
```

**Tips** 在這個練習之前,你可能要先將前面練習所產生的 /root/etc 刪除才行!不然 /root/etc/shadow 會重復存在,而其他的前面實驗的文件也會存在, 那就看不出什么鬼~
* 打包某目錄,但不含該目錄下的某些文件之作法
假設我們想要打包 /etc/ /root 這幾個重要的目錄,但卻不想要打包 /root/etc* 開頭的文件,因為該文件都是剛剛我們才創建的備份文件嘛! 而且假設這個新的打包文件要放置成為 /root/system.tar.bz2 ,當然這個文件自己不要打包自己 (因為這個文件放置在 /root 下面啊!),此時我們可以通過 --exclude 的幫忙! 那個 exclude 就是不包含的意思!所以你可以這樣做:
```
[root@study ~]# tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* \
> --exclude=/root/system.tar.bz2 /etc /root
```
上面的指令是一整列的~其實你可以打成:“tar -jcv -f /root/system.tar.bz2 --exclude=/root/etc* --exclude=/root/system.tar.bz2 /etc /root”,如果想要兩行輸入時,最后面加上反斜線 (\) 并立刻按下 [enter] , 就能夠到第二行繼續輸入了。這個指令下達的方式我們會在第三章再仔細說明。 通過這個 --exclude="file" 的動作,我們可以將幾個特殊的文件或目錄移除在打包之列,讓打包的動作變的更簡便喔!^_^
* 僅備份比某個時刻還要新的文件
某些情況下你會想要備份新的文件而已,并不想要備份舊文件!此時 --newer-mtime 這個選項就粉重要啦! 其實有兩個選項啦,一個是“ --newer ”另一個就是“ --newer-mtime ”,這兩個選項有何不同呢? 我們在 [第六章的 touch](../Text/index.html#touch) 介紹中談到過三種不同的時間參數, 當使用 --newer 時,表示后續的日期包含“ mtime 與 ctime ”,而 --newer-mtime 則僅是 mtime 而已! 這樣知道了吧! ^_^ 。那就讓我們來嘗試處理一下啰!
```
# 1\. 先由 [find](../Text/index.html#find) 找出比 /etc/passwd 還要新的文件
[root@study ~]# find /etc -newer /etc/passwd
....(過程省略)....
# 此時會顯示出比 /etc/passwd 這個文件的 mtime 還要新的文件名,
# 這個結果在每部主機都不相同!您先自行查閱自己的主機即可,不會跟鳥哥一樣!
[root@study ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd
# 2\. 好了,那么使用 tar 來進行打包吧!日期為上面看到的 2015/06/17
[root@study ~]# tar -jcv -f /root/etc.newer.then.passwd.tar.bz2 \
> --newer-mtime="2015/06/17" /etc/*
tar: Option --newer-mtime: Treating date `2015/06/17' as 2015-06-17 00:00:00
tar: Removing leading `/' from member names
/etc/abrt/
....(中間省略)....
/etc/alsa/
/etc/yum.repos.d/
....(中間省略)....
tar: /etc/yum.repos.d/CentOS-fasttrack.repo: file is unchanged; not dumped
# 最后行顯示的是“沒有被備份的”,亦即 not dumped 的意思!
# 3\. 顯示出文件即可
[root@study ~]# tar -jtv -f /root/etc.newer.then.passwd.tar.bz2 | grep -v '/$'
# 通過這個指令可以調用出 tar.bz2 內的結尾非 / 的文件名!就是我們要的啦!
```
現在你知道這個指令的好用了吧!甚至可以進行差異文件的記錄與備份呢~ 這樣子的備份就會顯的更容易啰!你可以這樣想像,如果我在一個月前才進行過一次完整的數據備份, 那么這個月想要備份時,當然可以僅備份上個月進行備份的那個時間點之后的更新的文件即可! 為什么呢?因為原本的文件已經有備份了嘛!干嘛還要進行一次?只要備份新數據即可。這樣可以降低備份的容量啊!
* 基本名稱: tarfile, tarball ?
另外值得一提的是,tar 打包出來的文件有沒有進行壓縮所得到文件稱呼不同喔! 如果僅是打包而已,就是“ tar -cv -f file.tar ”而已,這個文件我們稱呼為 tarfile 。 如果還有進行壓縮的支持,例如“ tar -jcv -f file.tar.bz2 ”時,我們就稱呼為 tarball (tar 球?)!這只是一個基本的稱謂而已,不過很多書籍與網絡都會使用到這個 tarball 的名稱!所以得要跟您介紹介紹。
此外,tar 除了可以將數據打包成為文件之外,還能夠將文件打包到某些特別的設備去,舉例來說, 磁帶機 (tape) 就是一個常見的例子。磁帶機由于是一次性讀取/寫入的設備,因此我們不能夠使用類似 cp 等指令來復制的! 那如果想要將 /home, /root, /etc 備份到磁帶機 (/dev/st0) 時,就可以使用:“tar -cv -f /dev/st0 /home /root /etc”,很簡單容易吧! 磁帶機用在備份 (尤其是企業應用) 是很常見的工作喔!
* 特殊應用:利用管線命令與數據流
在 tar 的使用中,有一種方式最特殊,那就是通過標準輸入輸出的數據流重導向(standard input/standard output), 以及管線命令 (pipe) 的方式,將待處理的文件一邊打包一邊解壓縮到目標目錄去。 關于數據流重導向與管線命令更詳細的數據我們會在[第十章 bash](../Text/index.html) 再跟大家介紹, 下面先來看一個例子吧!
```
# 1\. 將 /etc 整個目錄一邊打包一邊在 /tmp 解開
[root@study ~]# cd /tmp
[root@study tmp]# tar -cvf - /etc | tar -xvf -
# 這個動作有點像是 cp -r /etc /tmp 啦~依舊是有其有用途的!
# 要注意的地方在于輸出文件變成 - 而輸入文件也變成 - ,又有一個 | 存在~
# 這分別代表 standard output, standard input 與管線命令啦!
# 簡單的想法中,你可以將 - 想成是在內存中的一個設備(緩沖區)。
# 更詳細的數據流與管線命令,請翻到 [bash](../Text/index.html) 章節啰!
```
在上面的例子中,我們想要“將 /etc 下面的數據直接 copy 到目前所在的路徑,也就是 /tmp 下面”,但是又覺得使用 cp -r 有點麻煩,那么就直接以這個打包的方式來打包,其中,指令里面的 - 就是表示那個被打包的文件啦! 由于我們不想要讓中間文件存在,所以就以這一個方式來進行復制的行為啦!
* 例題:系統備份范例
系統上有非常多的重要目錄需要進行備份,而且其實我們也不建議你將備份數據放置到 /root 目錄下! 假設目前你已經知道重要的目錄有下面這幾個:
* /etc/ (配置文件)
* /home/ (使用者的主文件夾)
* /var/spool/mail/ (系統中,所有帳號的郵件信箱)
* /var/spool/cron/ (所有帳號的工作排成配置文件)
* /root (系統管理員的主文件夾)
然后我們也知道,由于[第七章](../Text/index.html#loop)曾經做過的練習的關系, /home/loop* 不需要備份,而且 /root 下面的壓縮文件也不需要備份,另外假設你要將備份的數據放置到 /backups ,并且該目錄僅有 root 有權限進入! 此外,每次備份的文件名都希望不相同,例如使用:backup-system-20150701.tar.bz2 之類的文件名來處理。 那你該如何處理這個備份數據呢?(請先動手作看看,再來察看一下下面的參考解答!)
```
# 1\. 先處理要放置備份數據的目錄與權限:
[root@study ~]# mkdir /backups
[root@study ~]# chmod 700 /backups
[root@study ~]# ll -d /backups
drwx------. 2 root root 6 Jul 1 17:25 /backups
# 2\. 假設今天是 2015/07/01 ,則創建備份的方式如下:
[root@study ~]# tar -jcv -f /backups/backup-system-20150701.tar.bz2 \
> --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* \
> /etc /home /var/spool/mail /var/spool/cron /root
....(過程省略)....
[root@study ~]# ll -h /backups/
-rw-r--r--. 1 root root 21M Jul 1 17:26 backup-system-20150701.tar.bz2
```
* 解壓縮后的 SELinux 課題
如果,鳥哥是說如果,如果因為某些緣故,所以你的系統必須要以備份的數據來回填到原本的系統中,那么得要特別注意復原后的系統的 SELinux 問題! 尤其是在系統文件上面!例如 /etc 下面的文件群。SELinux 是比較特別的細部權限設置,相關的介紹我們會在 16 章好好的介紹一下。 在這里,你只要先知道,SELinux 的權限問題“可能會讓你的系統無法存取某些配置文件內容,導致影響到系統的正常使用權”。
這兩天 (2015/07) 接到一個網友的 email,他說他使用鳥哥介紹的方法通過 tar 去備份了 /etc 的數據,然后嘗試在另一部系統上面復原回來。 復原倒是沒問題,但是復原完畢之后,無論如何就是無法正常的登陸系統!明明使用單人維護模式去操作系統時,看起來一切正常~但就是無法順利登陸。 其實這個問題倒是很常見!大部分原因就是因為 /etc/shadow 這個密碼文件的 SELinux 類型在還原時被更改了!導致系統的登陸程序無法順利的存取它, 才造成無法登陸的窘境。
那如何處理呢?簡單的處理方式有這幾個:
* 通過各種可行的救援方式登陸系統,然后修改 /etc/selinux/config 文件,將 SELinux 改成 permissive 模式,重新開機后系統就正常了;
* 在第一次復原系統后,不要立即重新開機!先使用 restorecon -Rv /etc 自動修復一下 SELinux 的類型即可。
* 通過各種可行的方式登陸系統,創建 /.autorelabel 文件,重新開機后系統會自動修復 SELinux 的類型,并且又會再次重新開機,之后就正常了!
鳥哥個人是比較偏好第 2 個方法,不過如果忘記了該步驟就重新開機呢?那鳥哥比較偏向使用第 3 個方案來處理,這樣就能夠解決復原后的 SELinux 問題啰! 至于更詳細的 SELinux ,我們得要講完程序 (process) 之后,你才會有比較清楚的認知,因此還請慢慢學習,到第 16 章你就知道問題點了! ^_^
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀