1. 程式人生 > >Linux學習筆記19——XFS 檔案系統的備份與還原、光碟寫入工具、其他常見的壓縮與備份工具

Linux學習筆記19——XFS 檔案系統的備份與還原、光碟寫入工具、其他常見的壓縮與備份工具

一、XFS 檔案系統的備份與還原

使用 tar 通常是針對目錄樹系統來進行備份的工作,那麼如果想要針對整個檔案系統來進行備份與還原呢?由於 CentOS 7 已經使用 XFS 檔案系統作為預設值,所以那個好用的 xfsdump與 xfsrestore 兩個工具對 CentOS 7 來說,就是挺重要的工具軟體了。下面就讓我們來談一談這個指令的用法吧!

1,XFS 檔案系統備份 xfsdump

其實 xfsdump 的功能頗強!他除了可以進行檔案系統的完整備份 (full backup) 之外,還可以進行累積備份 (Incremental backup) 喔! 啥是累積備份呢?這麼說好了,假設你的/home 是獨立的一個檔案系統,那你在第一次使用 xfsdump 進行完整備份後,等過一段時間的檔案系統自然執行後, 你再進行第二次 xfsdump 時,就可以選擇累積備份了!此時新備份的資料只會記錄與第一次完整備份所有差異的檔案而已。 看不懂嗎?沒關係!我們用一張簡圖來說明。

如上圖所示,上方的“實時檔案系統”是一直隨著時間而變化的資料,例如在 /home 裡面的檔案資料會一直變化一樣。 而下面的方塊則是 xfsdump 備份起來的資料,第一次備份一定是完整備份,完整備份在 xfsdump 當中被定義為 level 0 喔!等到第二次備份時,/home 檔案系統內的資料已經與 level 0 不一樣了,而 level 1 僅只是比較目前的檔案系統與 level 0 之間的差異後,備份有變化過的檔案而已。至於 level 2 則是與 level 1 進行比較啦!這樣瞭解呼?至於各個 level 的紀錄檔則放置於 /var/lib/xfsdump/inventory 中。

另外,使用 xfsdump 時,請注意下面的限制喔:

xfsdump 不支援沒有掛載的檔案系統備份!所以只能備份已掛載的!

xfsdump 必須使用 root 的許可權才能操作 (涉及檔案系統的關係)

xfsdump 只能備份 XFS 檔案系統啊!

xfsdump 備份下來的資料 (檔案或儲存媒體) 只能讓 xfsrestore 解析

xfsdump 是通過檔案系統的 UUID 來分辨各個備份檔案的,因此不能備份兩個具有相同UUID 的檔案系統喔!

xfsdump 的選項雖然非常的繁複,不過如果只是想要簡單的操作時,您只要記得下面的幾個選項就很夠用了!

[[email protected] ~]# xfsdump [-L S_label] [-M M_label] [-l #] [-f 備份檔案] 待備份資料

[[email protected] ~]# xfsdump -I

選項與引數:

-L :xfsdump 會紀錄每次備份的 session 標頭,這裡可以填寫針對此檔案系統的簡易說明

-M :xfsdump 可以紀錄儲存媒體的標頭,這裡可以填寫此媒體的簡易說明

-l :是 L 的小寫,就是指定等級~有 0~9 共 10 個等級喔! (預設為 0,即完整備份)

-f :有點類似 tar 啦!後面接產生的檔案,亦可接例如 /dev/st0 裝置檔名或其他一般檔案檔名等

-I :從 /var/lib/xfsdump/inventory 列出目前備份的資訊狀態

特別注意, xfsdump 預設僅支援檔案系統的備份,並不支援特定目錄的備份~所以你不能用xfsdump 去備份 /etc ! 因為 /etc 從來就不是一個獨立的檔案系統!注意!注意!

用 xfsdump 備份完整的檔案系統

現在就讓我們來做幾個範例吧!假設你跟鳥哥一樣有將 /boot 分割槽出自己的檔案系統,要整個檔案系統備份可以這樣作:

# 1\. 先確定 /boot 是獨立的檔案系統喔!

[[email protected] ~]# df -h /boot

Filesystem Size Used Avail Use% Mounted on

/dev/vda2 1014M 131M 884M 13% /boot # 掛載 /boot 的是 /dev/vda 裝置!

# 看!確實是獨立的檔案系統喔! /boot 是掛載點!

# 2\. 將完整備份的檔名記錄成為 /srv/boot.dump :

[[email protected] ~]# xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot

xfsdump -l 0 -L boot_all -M boot_all -f /srv/boot.dump /boot

xfsdump: using file dump (drive_simple) strategy

xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control

xfsdump: level 0 dump of study.centos.vbird:/boot # 開始備份本機/boot系統

xfsdump: dump date: Wed Jul 1 18:43:04 2015 # 備份的時間

xfsdump: session id: 418b563f-26fa-4c9b-98b7-6f57ea0163b1 # 這次dump的ID

xfsdump: session label: "boot_all" # 簡單給予一個名字記憶

xfsdump: ino map phase 1: constructing initial dump list # 開始備份程式

xfsdump: ino map phase 2: skipping (no pruning necessary)

xfsdump: ino map phase 3: skipping (only one dump stream)

xfsdump: ino map construction complete

xfsdump: estimated dump size: 103188992 Bytes

xfsdump: creating dump session media file 0 (media 0, file 0)

xfsdump: dumping ino map

xfsdump: dumping directories

xfsdump: dumping non-directory files

xfsdump: ending media file

xfsdump: media file size 102872168 Bytes

xfsdump: dump size (non-dir files) : 102637296 Bytes

xfsdump: dump complete: 1 seconds elapsed

xfsdump: Dump Summary:

xfsdump: stream 0 /srv/boot.dump OK (success)

xfsdump: Dump Status: SUCCESS

# 在指令的下達方面,你也可以不加 -L 及 -M 的,只是那就會進入互動模式,要求你 enter!

# 而執行 xfsdump 的過程中會出現如上的一些訊息,您可以自行仔細的觀察!

[[email protected] ~]# ll /srv/boot.dump

-rw-r--r--. 1 root root 102872168 Jul 1 18:43 /srv/boot.dump

[[email protected] ~]# ll /var/lib/xfsdump/inventory

-rw-r--r--. 1 root root 5080 Jul 1 18:43 506425d2-396a-433d-9968-9b200db0c17c.StObj

-rw-r--r--. 1 root root 312 Jul 1 18:43 94ac5f77-cb8a-495e-a65b-2ef7442b837c.InvIndex

-rw-r--r--. 1 root root 576 Jul 1 18:43 fstab

# 使用了 xfsdump 之後才會有上述 /var/lib/xfsdump/inventory 內的檔案產生喔!

這樣很簡單的就建立起來 /srv/boot.dump 檔案,該檔案將整個 /boot/ 檔案系統都備份下來了! 並且將備份的相關資訊 (檔案系統/時間/session ID等等) 寫入/var/lib/xfsdump/inventory 中,準備讓下次備份時可以作為一個參考依據。 現在讓我們來進行一個測試,檢檢視看能否真的建立 level 1 的備份呢?

用 xfsdump 進行累積備份 (Incremental backups)

你一定得要進行過完整備份後 (-l 0) 才能夠繼續有其他累積備份 (-l 1~9) 的能耐!所以,請確定上面的實做已經完成! 接下來讓我們來搞一搞累積備份功能吧!

# 0\. 看一下有沒有任何檔案系統被 xfsdump 過的資料?

[[email protected] ~]# xfsdump -I

file system 0:

fs id: 94ac5f77-cb8a-495e-a65b-2ef7442b837c

session 0:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

time: Wed Jul 1 18:43:04 2015

session label: "boot_all"

session id: 418b563f-26fa-4c9b-98b7-6f57ea0163b1

level: 0

resumed: NO

subtree: NO

streams: 1

stream 0:

pathname: /srv/boot.dump

start: ino 132 offset 0

end: ino 2138243 offset 0

interrupted: NO

media files: 1

media file 0:

mfile index: 0

mfile type: data

mfile size: 102872168

mfile start: ino 132 offset 0

mfile end: ino 2138243 offset 0

media label: "boot_all"

media id: a6168ea6-1ca8-44c1-8d88-95c863202eab

xfsdump: Dump Status: SUCCESS

# 我們可以看到目前僅有一個 session 0 的備份資料而已!而且是 level 0 喔!

# 1\. 先惡搞一下,建立一個大約 10 MB 的檔案在 /boot 內:

[[email protected] ~]# dd if=/dev/zero of=/boot/testing.img bs=1M count=10

10+0 records in

10+0 records out

10485760 Bytes (10 MB) copied, 0.166128 seconds, 63.1 MB/s

# 2\. 開始建立差異備份檔案,此時我們使用 level 1 吧:

[[email protected] ~]# xfsdump -l 1 -L boot_2 -M boot_2 -f /srv/boot.dump1 /boot

....(中間省略)....

[[email protected] ~]# ll /srv/boot*

-rw-r--r--. 1 root root 102872168 Jul 1 18:43 /srv/boot.dump

-rw-r--r--. 1 root root 10510952 Jul 1 18:46 /srv/boot.dump1

# 看看檔案大小,豈不是就是剛剛我們所建立的那個大檔案的容量嗎? ^_^

# 3\. 最後再看一下是否有記錄 level 1 備份的時間點呢?

[[email protected] ~]# xfsdump -I

file system 0:

fs id: 94ac5f77-cb8a-495e-a65b-2ef7442b837c

session 0:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

....(中間省略)....

session 1:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

time: Wed Jul 1 18:46:21 2015

session label: "boot_2"

session id: c71d1d41-b3bb-48ee-bed6-d77c939c5ee8

level: 1

resumed: NO

subtree: NO

streams: 1

stream 0:

pathname: /srv/boot.dump1

start: ino 455518 offset 0

....(下面省略)

通過這個簡單的方式,我們就能夠僅備份差異檔案的部分囉!

2,XFS 檔案系統還原 xfsrestore

備份檔案就是在急用時可以回覆系統的重要資料,所以有備份當然就得要學學如何復原了!xfsdump 的復原使用的是 xfsrestore 這個指令!這個指令的選項也非常的多~您可以自行man xfsrestore 瞧瞧! 鳥哥在這裡僅作個簡單的介紹囉!

[[email protected] ~]# xfsrestore -I <==用來察看備份檔案資料

[[email protected] ~]# xfsrestore [-f 備份檔案] [-L S_label] [-s] 待復原目錄 <==單一檔案全系統復原

[[email protected] ~]# xfsrestore [-f 備份檔案] -r 待復原目錄 <==通過累積備份檔案來複原系統

[[email protected] ~]# xfsrestore [-f 備份檔案] -i 待復原目錄 <==進入互動模式

選項與引數:

-I :跟 xfsdump 相同的輸出!可查詢備份資料,包括 Label 名稱與備份時間等

-f :後面接的就是備份檔案!企業界很有可能會接 /dev/st0 等磁帶機!我們這裡接檔名!

-L :就是 Session 的 Label name 喔!可用 -I 查詢到的資料,在這個選項後輸入!

-s :需要接某特定目錄,亦即僅復原某一個檔案或目錄之意!

-r :如果是用檔案來儲存備份資料,那這個就不需要使用。如果是一個磁帶內有多個檔案,

需要這東西來達成累積復原

-i :進入互動模式,進階管理員使用的!一般我們不太需要操作它!

用 xfsrestore 觀察 xfsdump 後的備份資料內容

要找出 xfsdump 的內容就使用 xfsrestore -I 來查閱即可!不需要加任何引數!因為 xfsdump與 xfsrestore 都會到 /var/lib/xfsdump/inventory/ 裡面去撈資料來顯示的!因此兩者輸出是相同的!

[[email protected] ~]# xfsrestore -I

file system 0:

fs id: 94ac5f77-cb8a-495e-a65b-2ef7442b837c

session 0:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

time: Wed Jul 1 18:43:04 2015

session label: "boot_all"

session id: 418b563f-26fa-4c9b-98b7-6f57ea0163b1

level: 0

pathname: /srv/boot.dump

mfile size: 102872168

media label: "boot_all"

session 1:

mount point: study.centos.vbird:/boot

device: study.centos.vbird:/dev/vda2

time: Wed Jul 1 18:46:21 2015

session label: "boot_2"

session id: c71d1d41-b3bb-48ee-bed6-d77c939c5ee8

level: 1

pathname: /srv/boot.dump1

mfile size: 10510952

media label: "boot_2"

xfsrestore: Restore Status: SUCCESS

# 鳥哥已經將不重要的專案刪除了,所以上面的輸出是經過經簡化的結果!

# 我們可以看到這個檔案系統是 /boot 載點,然後有兩個備份,一個 level 0 一個 level 1。

# 也看到這兩個備份的資料他的內容大小!更重要的,就是那個 session label 喔!

這個查詢重點是找出到底哪個檔案是哪個掛載點?而該備份檔案又是什麼 level 等等的!接下來,讓我們實做一下從備份還原系統吧!

簡單復原 level 0 的檔案系統

先來處理一個簡單的任務,就是將 /boot 整個復原到最原本的狀態~你該如何處理?其實很簡單,我們只要知道想要被複原的那個檔案, 以及該檔案的 session label name,就可以復原啦!我們從上面的觀察已經知道 level 0 的 session label 是“boot_all”囉!那整個流程是這樣:

# 1\. 直接將資料給它覆蓋回去即可!

[[email protected] ~]# xfsrestore -f /srv/boot.dump -L boot_all /boot

xfsrestore: using file dump (drive_simple) strategy

xfsrestore: version 3.1.4 (dump format 3.0) - type ^C for status and control

xfsrestore: using online session inventory

xfsrestore: searching media for directory dump

xfsrestore: examining media file 0

xfsrestore: reading directories

xfsrestore: 8 directories and 327 entries processed

xfsrestore: directory post-processing

xfsrestore: restoring non-directory files

xfsrestore: restore complete: 1 seconds elapsed

xfsrestore: Restore Summary:

xfsrestore: stream 0 /srv/boot.dump OK (success) # 是否是正確的檔案啊?

xfsrestore: Restore Status: SUCCESS

# 2\. 將備份資料在 /tmp/boot 下面解開!

[[email protected] ~]# mkdir /tmp/boot

[[email protected] ~]# xfsrestore -f /srv/boot.dump -L boot_all /tmp/boot

[[email protected] ~]# du -sm /boot /tmp/boot

109 /boot

99 /tmp/boot

# 咦!兩者怎麼大小不一致呢?沒關係!我們來檢檢視看!

[[email protected] ~]# diff -r /boot /tmp/boot

Only in /boot: testing.img

# 看吧!原來是 /boot 我們有增加過一個檔案啦!

因為原本 /boot 裡面的東西我們沒有刪除,直接復原的結果就是:“同名的檔案會被覆蓋,其他系統內新的檔案會被保留”喔!所以, 那個 /boot/testing.img 就會一直在裡頭~如果備份的目的地是新的位置,當然就只有原本備份的資料而已啊!那個 diff -r 可以比較兩個目錄內的檔案差異! 通過該指令我們可以找到兩個目錄的差異處!

# 3\. 僅復原備份檔案內的 grub2 到 /tmp/boot2/ 裡頭去!

[[email protected] ~]# mkdir /tmp/boot2

[[email protected] ~]# xfsrestore -f /srv/boot.dump -L boot_all -s grub2 /tmp/boot2

如果只想要復原某一個目錄或檔案的話,直接加上“ -s 目錄 ”這個選項與引數即可!相當簡單好用!

復原累積備份資料

其實復原累積備份與復原單一檔案系統相似耶!如果備份資料是由 level 0 -> level 1 -> level2... 去進行的, 當然復原就得要相同的流程來複原!因此當我們復原了 level 0 之後,接下來當然就要復原 level 1 到系統內啊! 我們可以前一個案例復原 /tmp/boot 的情況來繼續往下處理:

# 繼續復原 level 1 到 /tmp/boot 當中!

[[email protected] ~]# xfsrestore -f /srv/boot.dump1 /tmp/boot

僅還原部分檔案的 xfsrestore 互動模式

剛剛的 -s 可以接部份資料來還原,但是...如果我就根本不知道備份檔案裡面有啥檔案,那該如何選擇啊?用猜的喔? 又如果要復原的檔案數量太多時,用 -s 似乎也是笨笨的~那怎辦?有沒有比較好的方式呢?有的,就通過 -i 這個互動介面吧! 舉例來說,我們想要知道 level 0的備份資料裡面有哪些東西,然後再少量的還原回來的話!

# 1\. 先進入備份檔案內,準備找出需要備份的檔名資料,同時預計還原到 /tmp/boot3 當中!

[[email protected] ~]# mkdir /tmp/boot3

[[email protected] ~]# xfsrestore -f /srv/boot.dump -i /tmp/boot3

========================== subtree selection dialog ==========================

the following commands are available:

pwd

ls [ <path> ]

cd [ <path> ]

add [ <path> ] # 可以加入復原檔案列表中

delete [ <path> ] # 從復原列表拿掉檔名!並非刪除喔!

extract # 開始復原動作!

quit

help

-> ls

455517 initramfs-3.10.0-229.el7.x86_64kdump.img

138 initramfs-3.10.0-229.el7.x86_64.img

141 initrd-plymouth.img

140 vmlinuz-0-rescue-309eb890d09f440681f596543d95ec7a

139 initramfs-0-rescue-309eb890d09f440681f596543d95ec7a.img

137 vmlinuz-3.10.0-229.el7.x86_64

136 symvers-3.10.0-229.el7.x86_64.gz

135 config-3.10.0-229.el7.x86_64

134 System.map-3.10.0-229.el7.x86_64

133 .vmlinuz-3.10.0-229.el7.x86_64.hmac

1048704 grub2/

131 grub/

-> add grub

-> add grub2

-> add config-3.10.0-229.el7.x86_64

-> extract

[[email protected] ~]# ls -l /tmp/boot3

-rw-r--r--. 1 root root 123838 Mar 6 19:45 config-3.10.0-229.el7.x86_64

drwxr-xr-x. 2 root root 26 May 4 17:52 grub

drwxr-xr-x. 6 root root 104 Jun 25 00:02 grub2

# 就只會有 3 個檔名被複原,當然,如果檔名是目錄,那下面的子檔案當然也會被還原回來的!

事實上,這個 -i 是很有幫助的一個專案!可以從備份檔案裡面找出你所需要的資料來複原!相當有趣!當然啦, 如果你已經知道檔名,使用 -s 不需要進入備份檔案就能夠處理掉這部份了!

二、光碟寫入工具

事實上,企業還是挺愛用磁帶來進行備份的,容量高、儲存時限長、挺耐摔等等,至於以前很熱門的 DVD/CD 等,則因為儲存速度慢、 容量沒有大幅度提升,所以目前除了行政部門為了“歸檔”而需要的工作之外,這個咚咚的存在性已經被 U盤所取代了。 你可能會談到說,不是還有藍光嘛?但這傢伙目前主要應用還是在多媒體影音方面,如果要大容量的儲存,個人建議,還是使用 USB 外接式硬碟, 一顆好幾個 TB 給你用,不是更爽嘛?所以,鳥哥是認為,DVD/CD 雖然還是有存在的價值 (例如前面講的歸檔),不過,越來越少人使用了。

雖然很少使用,不過,某些特別的情況下,沒有這東西又不行~因此,我們還是來介紹一下建立光碟映象檔案以及燒錄軟體吧! 否則,偶而需要用到時,找不到軟體資料還挺傷腦筋的!文字模式的燒錄行為要怎麼處理呢?通常的作法是這樣的:

先將所需要備份的資料建立成為一個映象檔案(iso),利用 mkisofs 指令來處理;

將該映象檔案燒錄至光碟或 DVD 當中,利用 cdrecord 指令來處理。

下面我們就分別來談談這兩個指令的用法吧!

1,mkisofs:建立映象檔案

燒錄可開機與不可開機的光碟,使用的方法不太一樣喔 !

製作一般資料光碟映象檔案

我們從 FTP 站捉下來的 Linux 映象檔案 (不管是 CD 還是 DVD) 都得要繼續燒錄成為實體的光碟/DVD 後, 才能夠進一步的使用,包括安裝或更新你的 Linux 啦!同樣的道理,你想要利用燒錄機將你的資料燒錄到 DVD 時, 也得要先將你的資料包成一個映象檔案,這樣才能夠寫入DVD片中。而將你的資料包成一個映象檔案的方式就通過 mkisofs 這個指令即可。mkisofs 的使用方式如下:

[[email protected] ~]# mkisofs [-o 映象檔案] [-Jrv] [-V vol] [-m file] 待備份檔案... \

> -graft-point isodir=systemdir ...

選項與引數:

-o :後面接你想要產生的那個映象檔案檔名。

-J :產生較相容於 windows 機器的檔名結構,可增加檔名長度到 64 個 unicode 字元

-r :通過 Rock Ridge 產生支援 Unix/Linux 的檔案資料,可記錄較多的資訊(如 UID/GID等) ;

-v :顯示建立 ISO檔案的過程

-V vol :建立 Volume,有點像 Windows 在檔案資源管理器內看到的 CD title 的東西

-m file :-m 為排除檔案 (exclude) 的意思,後面的檔案不備份到映象檔案中,也能使用 * 萬用字元喔

-graft-point:graft有轉嫁或移植的意思,相關資料在下面文章內說明。

其實 mkisofs 有非常多好用的選項可以選擇,不過如果我們只是想要製作“資料光碟”時,上述的選項也就夠用了。 光碟的格式一般稱為 iso9660 ,這種格式一般僅支援舊版的 DOS 檔名,亦即檔名只能以 8.3 (檔名8個字元,副檔名3個字元) 的方式存在。如果加上 -r 的選項之後,那麼檔案資訊能夠被記錄的比較完整,可包括UID/GID與許可權等等! 所以,記得加這個 -r 的選項。

此外,一般預設的情況下,所有要被加到映象檔案中的檔案都會被放置到映象檔案中的根目錄, 如此一來可能會造成燒錄後的檔案分類不易的情況。所以,你可以使用 -graft-point 這個選項,當你使用這個選項之後, 可以利用如下的方法來定義位於映象檔案中的目錄,例如:

映象檔案中的目錄所在=實際 Linux 檔案系統的目錄所在

/movies/=/srv/movies/ (在 Linux 的 /srv/movies 內的檔案,加至映象檔案中的 /movies/目錄)

/linux/etc=/etc (將 Linux 中的 /etc/ 內的所有資料備份到映象檔案中的 /linux/etc/ 目錄中)

我們通過一個簡單的範例來說明一下吧。如果你想要將 /root, /home, /etc 等目錄內的資料通通燒錄起來的話, 先得要處理一下映象檔案,我們先不使用 -graft-point 的選項來處理這個映象檔案試看看:

[[email protected] ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc

I: -input-charset not specified, using utf-8 (detected in locale settings)

genisoimage 1.1.11 (Linux)

Scanning /root

.....(中間省略).....

Scanning /etc/scl/prefixes

Using SYSTE000.;1 for /system-release-cpe (system-release) # 被改名子了!

Using CENTO000.;1 for /centos-release-upstream (centos-release) # 被改名子了!

Using CRONT000.;1 for /crontab (crontab)

genisoimage: Error: '/etc/crontab' and '/root/crontab' have the same Rock Ridge name 'crontab'.

Unable to sort directory # 檔名不可一樣啊!

NOTE: multiple source directories have been specified and merged into the root

of the filesystem. Check your program arguments. genisoimage is not tar.

# 看到沒?因為檔名一模一樣,所以就不給你建立 ISO 檔了啦!

# 請先刪除 /root/crontab 這個檔案,然後再重複執行一次 mkisofs 吧!

[[email protected] ~]# rm /root/crontab

[[email protected] ~]# mkisofs -r -v -o /tmp/system.img /root /home /etc

.....(前面省略).....

83.91% done, estimate finish Thu Jul 2 18:48:04 2015

92.29% done, estimate finish Thu Jul 2 18:48:04 2015

Total translation table size: 0

Total rockridge attributes Bytes: 600251

Total directory Bytes: 2150400

Path table size(Bytes): 12598

Done with: The File(s) Block(s) 58329

Writing: Ending Padblock Start Block 59449

Done with: Ending Padblock Block(s) 150

Max brk space used 548000

59599 extents written (116 MB)

[[email protected] ~]# ll -h /tmp/system.img

-rw-r--r--. 1 root root 117M Jul 2 18:48 /tmp/system.img

[[email protected] ~]# mount -o loop /tmp/system.img /mnt

[[email protected] ~]# df -h /mnt

Filesystem Size Used Avail Use% Mounted on

/dev/loop0 117M 117M 0 100% /mnt

[[email protected] ~]# ls /mnt

abrt festival mail.rc rsyncd.conf

adjtime filesystems makedumpfile.conf.sample rsyslog.conf

alex firewalld man_db.conf rsyslog.d

# 看吧!一堆資料都放置在一起!包括有的沒有的目錄與檔案等等!

[[email protected] ~]# umount /mnt

# 測試完畢要記得解除安裝!

由上面的範例我們可以看到,三個目錄 (/root, /home, /etc) 的資料通通放置到了映象檔案的最頂層目錄中! 真是不方便~尤其由於 /root/etc 的存在,導致那個 /etc 的資料似乎沒有被包含進來的樣子!真不合理~ 此時我們可以使用 -graft-point 來處理囉!

[[email protected] ~]# mkisofs -r -V 'linux_file' -o /tmp/system.img \

> -m /root/etc -graft-point /root=/root /home=/home /etc=/etc

[[email protected] ~]# ll -h /tmp/system.img

-rw-r--r--. 1 root root 92M Jul 2 19:00 /tmp/system.img

# 上面的指令會建立一個大檔案,其中 -graft-point 後面接的就是我們要備份的資料。

# 必須要注意的是那個等號的兩邊,等號左邊是在映象檔案內的目錄,右側則是實際的資料。

[[email protected] ~]# mount -o loop /tmp/system.img /mnt

[[email protected] ~]# ll /mnt

dr-xr-xr-x. 131 root root 34816 Jun 26 22:14 etc

dr-xr-xr-x. 5 root root 2048 Jun 17 00:20 home

dr-xr-xr-x. 8 root root 4096 Jul 2 18:48 root

# 瞧!資料是分門別類的在各個目錄中喔這樣瞭解乎?最後將資料解除安裝一下:

[[email protected] ~]# umount /mnt

如果你想要將實際的資料直接倒進 ISO 檔中,那就得要使用這個 -graft-point 來處理處理比較妥當!不然沒有分第一層目錄, 後面的資料管理實在是很麻煩。如果你是有自己要製作的資料內容,其實最簡單的方法,就是將所有的資料預先處理到某一個目錄中, 再燒錄該目錄即可!例如上述的 /etc, /root, /home 先全部複製到 /srv/cdrom 當中,然後跑到 /srv/cdrom 當中, 再使用類似“ mkisofs -r -v -o /tmp/system.img . ”的方式來處理即可!這樣也比較單純~

製作/修改可開機光碟影象擋

在鳥哥的研究室中,學生常被要求要製作“一鍵安裝”的安裝光碟!也就是說,得要修改原版的光碟映象檔案,改成可以自動載入某些程式的流程, 讓這片光碟放入主機光碟機後,只要開機利用光碟片來開機,那就直接安裝系統,不再需要詢問管理員一些有的沒有的!等於是自動化處理啦! 那些流程比較麻煩,因為得要知道 kickstart 的相關技術等,那個我們先不談,這裡要談的是,那如何讓這片光碟的內容被修改之後, 還可以燒錄成為可開機的模樣呢?

因為鳥哥這部測試機的容量比較小,又僅是測試而已啊,因此鳥哥選擇 CentOS-7-x86_64-Minimal-1503-01.iso 這個最小安裝光碟映象檔案來測試給各位瞧瞧! 假設你已經到崑山科大http://ftp.ksu.edu.tw/FTP/CentOS/7/isos/x86_64/ 取得了最小安裝的 Image 檔,而且放在/home 下面~之後我們要將裡頭的資料進行修改,假設新的映象檔案目錄放置於 /srv/newcd裡面,那你應該要這樣做:

# 1\. 先觀察一下這片光盤裡面有啥東西?是否是我們需要的光碟系統!

[[email protected] ~]# isoinfo -d -i /home/CentOS-7-x86_64-Minimal-1503-01.iso

CD-ROM is in ISO 9660 format

System id: LINUX

Volume id: CentOS 7 x86_64

Volume set id:

Publisher id:

Data preparer id:

Application id: GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR (C) 1993 E.YOUNGDALE (C) ...

Copyright File id:

.....(中間省略).....

Eltorito defaultboot header:

Bootid 88 (bootable)

Boot media 0 (No Emulation Boot)

Load segment 0

Sys type 0

Nsect 4

# 2\. 開始掛載這片光碟到 /mnt ,並且將所有資料完整複製到 /srv/newcd 目錄去喔

[[email protected] ~]# mount /home/CentOS-7-x86_64-Minimal-1503-01.iso /mnt

[roo[email protected] ~]# mkdir /srv/newcd

[[email protected] ~]# rsync -a /mnt/ /srv/newcd

[[email protected] ~]# ll /srv/newcd/

-rw-r--r--. 1 root root 16 Apr 1 07:11 CentOS_BuildTag

drwxr-xr-x. 3 root root 33 Mar 28 06:34 EFI

-rw-r--r--. 1 root root 215 Mar 28 06:36 EULA

-rw-r--r--. 1 root root 18009 Mar 28 06:36 GPL

drwxr-xr-x. 3 root root 54 Mar 28 06:34 images

drwxr-xr-x. 2 root root 4096 Mar 28 06:34 isolinux

drwxr-xr-x. 2 root root 41 Mar 28 06:34 LiveOS

drwxr-xr-x. 2 root root 20480 Apr 1 07:11 Packages

drwxr-xr-x. 2 root root 4096 Apr 1 07:11 repodata

-rw-r--r--. 1 root root 1690 Mar 28 06:36 RPM-GPG-KEY-CentOS-7

-rw-r--r--. 1 root root 1690 Mar 28 06:36 RPM-GPG-KEY-CentOS-Testing-7

-r--r--r--. 1 root root 2883 Apr 1 07:15 TRANS.TBL

# rsync 可以完整的複製所有的許可權屬性等資料,也能夠進行映象處理!相當好用的指令喔!

# 這裡先了解一下即可。現在 newcd/ 目錄內已經是完整的映象檔案內容!

# 3\. 假設已經處理完畢你在 /srv/newcd 裡面所要進行的各項修改行為,準備建立 ISO 檔!

[[email protected] ~]# ll /srv/newcd/isolinux/

-r--r--r--. 1 root root 2048 Apr 1 07:15 boot.cat # 開機的型號資料等等

-rw-r--r--. 1 root root 84 Mar 28 06:34 boot.msg

-rw-r--r--. 1 root root 281 Mar 28 06:34 grub.conf

-rw-r--r--. 1 root root 35745476 Mar 28 06:31 initrd.img

-rw-r--r--. 1 root root 24576 Mar 28 06:38 isolinux.bin # 相當於開機管理程式

-rw-r--r--. 1 root root 3032 Mar 28 06:34 isolinux.cfg

-rw-r--r--. 1 root root 176500 Sep 11 2014 memtest

-rw-r--r--. 1 root root 186 Jul 2 2014 splash.png

-r--r--r--. 1 root root 2438 Apr 1 07:15 TRANS.TBL

-rw-r--r--. 1 root root 33997348 Mar 28 06:33 upgrade.img

-rw-r--r--. 1 root root 153104 Mar 6 13:46 vesamenu.c32

-rwxr-xr-x. 1 root root 5029136 Mar 6 19:45 vmlinuz # Linux 核心檔案

[[email protected] ~]# cd /srv/newcd

[[email protected] newcd]# mkisofs -o /custom.iso -b isolinux/isolinux.bin -c isolinux/boot.cat \

> -no-emul-boot -V 'CentOS 7 x86_64' -boot-load-size 4 -boot-info-table -R -J -v -T .

此時你就有一個 /custom.img 的檔案存在,可以將該光碟燒錄出來囉!就這麼簡單!

2,cdrecord:光碟燒錄工具

新版的 CentOS 7 使用的是 wodim 這個文字介面指令來進行燒錄的行為。不過為了相容於舊版的 cdrecord 這個指令, 因此 wodim 也有連結到 cdrecord 就是了!因此,你還是可以使用cdrecord 這個指令。不過,鳥哥建議還是改用 wodim 比較乾脆! 這個指令常見的選項有下面數個:

[[email protected] ~]# wodim --devices dev=/dev/sr0... <==查詢燒錄機的 BUS 位置

[[email protected] ~]# wodim -v dev=/dev/sr0 blank=[fast|all] <==抹除重複讀寫片

[[email protected] ~]# wodim -v dev=/dev/sr0 -format <==格式化DVD+RW

[[email protected] ~]# wodim -v dev=/dev/sr0 [可用選項功能] file.iso

選項與引數:

--devices :用在掃瞄磁碟匯流排並找出可用的燒錄機,後續的裝置為 ATA 介面

-v :在 cdrecord 執行的過程中,顯示過程而已。

dev=/dev/sr0 :可以找出此光碟機的 bus 位址,非常重要!

blank=[fast|all]:blank 為抹除可重複寫入的CD/DVD-RW,使用fast較快,all較完整

-format :對光碟片進行格式化,但是僅針對 DVD+RW 這種格式的 DVD 而已;

[可用選項功能] 主要是寫入 CD/DVD 時可使用的選項,常見的選項包括有:

-data :指定後面的檔案以資料格式寫入,不是以 CD 音軌(-audio)方式寫入!

speed=X :指定燒錄速度,例如CD可用 speed=40 為40倍數,DVD則可用 speed=4 之類

-eject :指定燒錄完畢後自動退出光碟

fs=Ym :指定多少緩衝記憶體,可用在將映象檔案先暫存至緩衝記憶體。預設為 4m,

一般建議可增加到 8m ,不過,還是得視你的燒錄機而定。

針對 DVD 的選項功能:

driveropts=burnfree :開啟 Buffer Underrun Free 模式的寫入功能

-sao :支援 DVD-RW 的格式

偵測你的燒錄機所在位置:

文字模式的燒錄確實是比較麻煩的,因為沒有所見即所得的環境嘛!要燒錄首先就得要找到燒錄機才行! 而由於早期的燒錄機都是使用 SCSI 介面,因此查詢燒錄機的方法就得要配合著 SCSI 介面的認定來處理了。 查詢燒錄機的方式為:

[[email protected] ~]# ll /dev/sr0

brw-rw----+ 1 root cdrom 11, 0 Jun 26 22:14 /dev/sr0 # 一般 Linux 光碟機檔名!

[[email protected] ~]# wodim --devices dev=/dev/sr0

-------------------------------------------------------------------------

0 dev='/dev/sr0' rwrw-- : 'QEMU' 'QEMU DVD-ROM'

-------------------------------------------------------------------------

[[email protected] ~]# wodim --devices dev=/dev/sr0

wodim: Overview of accessible drives (1 found) :

-------------------------------------------------------------------------

0 dev='/dev/sr0' rwrw-- : 'ASUS' 'DRW-24D1ST'

-------------------------------------------------------------------------

# 你可以發現到其實鳥哥做了兩個測試!上面的那部主機系統是虛擬機器,當然光碟機也是模擬的,沒法用。

# 因此在這裡與下面的 wodim 用法,鳥哥只能使用另一部 Demo 機器測試給大家看了!

因為上面那部機器是虛擬機器內的虛擬光碟機 (QEMU DVD-ROM),那個無法塞入真正的光碟片啦!真討厭~所以鳥哥只好找另一部實體 CentOS 7 的主機系統來測試。 因此你可以看到下面那部使用的就是正統的 ASUS 光碟機了!這樣會查閱了嗎?注意喔,一定要有dev=/dev/xxx 那一段,不然系統會告訴你找不到光碟! 這真的是很奇怪!不過,反正我們知道光碟機的檔名為 /dev/sr0 之類的,直接帶入即可。

進行 CD/DVD 的燒錄動作:

好了,那麼現在要如何將 /tmp/system.img 燒錄到 CD/DVD 裡面去呢?因為要節省空間與避免浪費,鳥哥拿之前多買的可重複讀寫的 DVD 四倍數 DVD 片來操作! 因為是可抹除的DVD,因此可能得要在燒錄前先抹除 DVD 片裡面的資料才行喔!

# 0\. 先抹除光碟的原始內容:(非可重複讀寫則可略過此步驟)

[[email protected] ~]# wodim -v dev=/dev/sr0 blank=fast

# 中間會跑出一堆訊息告訴你抹除的進度,而且會有 10 秒鐘的時間等待你的取消!

# 1\. 開始燒錄:

[[email protected] ~]# wodim -v dev=/dev/sr0 speed=4 -dummy -eject /tmp/system.img

....(前面省略)....

Waiting for reader process to fill input buffer ... input buffer ready.

Starting new track at sector: 0

Track 01: 86 of 86 MB written (fifo 100%) [buf 97%] 4.0x. # 這裡有流程時間!

Track 01: Total Bytes read/written: 90937344/90937344 (44403 sectors).

Writing time: 38.337s # 寫入的總時間

Average write speed 1.7x. # 換算下來的寫入時間

Min drive buffer fill was 97%

Fixating...

Fixating time: 120.943s

wodim: fifo had 1433 puts and 1433 gets.

wodim: fifo was 0 times empty and 777 times full, min fill was 89%.

# 因為有加上 -eject 這個選項的緣故,因此燒錄完成後,DVD 會被退出光碟機喔!記得推回去!

# 2\. 燒錄完畢後,測試掛載一下,檢驗內容:

[[email protected] ~]# mount /dev/sr0/mnt

[[email protected] ~]# df -h /mnt

Filesystem Size Used Avail Use% Mounted on

Filesystem Size Used Avail Use% Mounted on

/dev/sr0 87M 87M 0 100% /mnt

[[email protected] ~]# ll /mnt

dr-xr-xr-x. 135 root root 36864 Jun 30 04:00 etc

dr-xr-xr-x. 19 root root 8192 Jul 2 13:16 root

[[email protected] ~]# umount /mnt <==不要忘了解除安裝

基本上,光碟燒錄的指令越來越簡單,雖然有很多的引數可以使用,不過,鳥哥認為,學習上面的語法就很足夠了! 一般來說,如果有燒錄的需求,大多還是使用圖形介面的軟體來處理比較妥當~使用文字介面的燒錄,真的大部分都是燒錄資料光碟較多。 因此,上面的語法已經足夠工程師的使用囉!

如果你的 Linux 是用來做為伺服器之用的話,那麼無時無刻的去想“如何備份重要資料”是相當重要的! 關於備份我們會在第五篇再仔細的談一談,這裡你要會使用這些工具即可!

三、其他常見的壓縮與備份工具

還有一些很好用的工具得要跟大家介紹介紹,尤其是 dd 這個玩意兒呢!

1,dd

我們在第七章當中的特殊 loop 裝置掛載時使用過 dd 這個指令對吧? 不過,這個指令可不只是製作一個檔案而已喔~這個 dd 指令最大的功效,鳥哥認為,應該是在於“備份”啊! 因為dd 可以讀取磁碟裝置的內容(幾乎是直接讀取扇區"sector"),然後將整個裝置備份成一個檔案呢!真的是相當的好用啊~ dd 的用途有很多啦~但是我們僅講一些比較重要的選項,如下:

[[email protected] ~]# dd if="input_file" of="output_file" bs="block_size" count="number"

選項與引數:

if :就是 input file 囉~也可以是裝置喔!

of :就是 output file 喔~也可以是裝置;

bs :規劃的一個 block 的大小,若未指定則預設是 512 Bytes(一個 sector 的大小)

count:多少個 bs 的意思。

範例一:將 /etc/passwd 備份到 /tmp/passwd.back 當中

[[email protected] ~]# dd if=/etc/passwd of=/tmp/passwd.back

4+1 records in

4+1 records out

2092 Bytes (2.1 kB) copied, 0.000111657 s, 18.7 MB/s

[[email protected] ~]# ll /etc/passwd /tmp/passwd.back

-rw-r--r--. 1 root root 2092 Jun 17 00:20 /etc/passwd

-rw-r--r--. 1 root root 2092 Jul 2 23:27 /tmp/passwd.back

# 仔細的看一下,我的 /etc/passwd 檔案大小為 2092 Bytes,因為我沒有設定 bs ,

# 所以預設是 512 Bytes 為一個單位,因此,上面那個 4+1 表示有 4 個完整的 512 Bytes,

# 以及未滿 512 Bytes 的另一個 block 的意思啦!事實上,感覺好像是 cp 這個指令啦~

範例二:將剛剛燒錄的光碟機的內容,再次的備份下來成為影象擋

[[email protected] ~]# dd if=/dev/sr0 of=/tmp/system.iso

177612+0 records in

177612+0 records out

90937344 Bytes (91 MB) copied, 22.111 s, 4.1 MB/s

# 要將資料抓下來用這個方法,如果是要將映象檔案寫入 USB 磁碟,就會變如下一個範例囉!

範例三:假設你的 USB 是 /dev/sda 好了,請將剛剛範例二的 image 燒錄到 USB 磁碟中

[[email protected] ~]# lsblk /dev/sda

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sda 8:0 0 2G 0 disk # 確實是 disk 而且有 2GB 喔!

[[email protected] ~]# dd if=/tmp/system.iso of=/dev/sda

[[email protected] ~]# mount /dev/sda /mnt

[[email protected] ~]# ll /mnt

dr-xr-xr-x. 131 root root 34816 Jun 26 22:14 etc

dr-xr-xr-x. 5 root root 2048 Jun 17 00:20 home

dr-xr-xr-x. 8 root root 4096 Jul 2 18:48 root

# 如果你不想要使用 DVD 來作為開機媒體,那可以將映象檔案使用這個 dd 寫入 USB 磁碟,

# 該磁碟就會變成跟可開機光碟一樣的功能!可以讓你用 USB 來安裝 Linux 喔!速度快很多!

範例四:將你的 /boot 整個檔案系統通過 dd 備份下來

[[email protected] ~]# df -h /boot

Filesystem Size Used Avail Use% Mounted on

/dev/vda2 1014M 149M 866M 15% /boot # 請注意!備份的容量會到 1G 喔!

[[email protected] ~]# dd if=/dev/vda2 of=/tmp/vda2.img

[[email protected] ~]# ll -h /tmp/vda2.img

-rw-r--r--. 1 root root 1.0G Jul 2 23:39 /tmp/vda2.img

# 等於是將整個 /dev/vda2 通通捉下來的意思~所以,檔案大小會跟整顆磁碟的最大量一樣大!

其實使用 dd 來備份是莫可奈何的情況,很笨耶!因為預設 dd 是一個一個扇區去讀/寫的,而且即使沒有用到的扇區也會倍寫入備份檔案中! 因此這個檔案會變得跟原本的磁碟一模一樣大!不像使用 xfsdump 只備份檔案系統中有使用到的部份。不過, dd 就是因為不理會檔案系統, 單純有啥紀錄啥,因此不論該磁碟內的檔案系統你是否認識,它都可以備份、還原的!所以,鳥哥認為,上述的第三個案例是比較重要的學習喔!

例題:你想要將你的 /dev/vda2 進行完整的複製到另一個 partition 上,請使用你的系統上面未分割槽完畢的容量再建立一個與 /dev/vda2 差不多大小的分割槽 (只能比 /dev/vda2 大,不能比他小!),然後將之進行完整的複製 (包括需要複製 boot sector 的區塊)。答:因為我們的 /dev/sda 也是個測試的 USB 磁碟,可以隨意惡搞!我們剛剛也才測試過將光碟映象檔案給它複製進去而已。 現在,請你分割槽 /dev/sda1 出來,然後將 /dev/vda2 完整的拷貝進去/dev/sda1 吧!

# 1\. 先進行分割槽的動作

[[email protected] ~]# fdisk /dev/sda

Command (m for help): n

Partition type:

p primary (0 primary, 0 extended, 4 free)

e extended

Select (default p): p

Partition number (1-4, default 1): 1

First sector (2048-4195455, default 2048): Enter

Using default value 2048

Last sector, +sectors or +size{K,M,G} (2048-4195455, default 4195455): Enter

Using default value 4195455

Partition 1 of type Linux and of size 2 GiB is set

Command (m for help): p

Device Boot Start End Blocks Id System

/dev/sda1 2048 4195455 2096704 83 Linux

Command (m for help): w

[[email protected] ~]# partprobe

# 2\. 不需要格式化,直接進行 sector 表面的複製!

[[email protected] ~]# dd if=/dev/vda2 of=/dev/sda1

2097152+0 records in

2097152+0 records out

1073741824 Bytes (1.1 GB) copied, 71.5395 s, 15.0 MB/s

[[email protected] ~]# xfs_repair -L /dev/sda1 # 一定要先清除一堆 log 才行!

[[email protected] ~]# uuidgen # 下面兩行在給予一個新的 UUID

896c38d1-bcb5-475f-83f1-172ab38c9a0c

[[email protected] ~]# xfs_admin -U 896c38d1-bcb5-475f-83f1-172ab38c9a0c /dev/sda1

# 因為 XFS 檔案系統主要使用 UUID 來分辨檔案系統,但我們使用 dd 複製,連 UUID

# 也都複製成為相同!當然就得要使用上述的 xfs_repair 及 xfs_admin 來修訂一下!

[[email protected] ~]# mount /dev/sda1 /mnt

[[email protected] ~]# df -h /boot /mnt

Filesystem Size Used Avail Use% Mounted on

/dev/vda2 1014M 149M 866M 15% /boot

/dev/sda1 1014M 149M 866M 15% /mnt

# 這兩個玩意兒會“一模一樣”喔!

# 3\. 接下來!讓我們將檔案系統放大吧!!!

[[email protected] ~]# xfs_growfs /mnt

[[email protected] ~]# df -h /boot /mnt

Filesystem Size Used Avail Use% Mounted on

/dev/vda2 1014M 149M 866M 15% /boot

/dev/sda1 2.0G 149M 1.9G 8% /mnt

[[email protected] ~]# umount /mnt

非常有趣的範例吧!新分割槽出來的 partition 不需要經過格式化,因為 dd 可以將原本舊的partition 上面,將 sector 表面的資料整個複製過來! 當然連同 superblock, boot sector, metadata 等等通通也會複製過來!是否很有趣呢?未來你想要建立兩顆一模一樣的磁碟時, 只要下達類似: dd if=/dev/sda of=/dev/sdb ,就能夠讓兩顆磁碟一模一樣,甚至 /dev/sdb 不需要分割槽與格式化, 因為該指令可以將 /dev/sda 內的所有資料,包括 MBR 與 partition table 也複製到 /dev/sdb 說! ^_^

話說,用 dd 來處理這方面的事情真的是很方便,你也不需考慮到啥有的沒的,通通是磁碟表面的複製而已!不過如果真的用在檔案系統上面, 例如上面這個案例,那麼再次掛載時,恐怕得要理解一下每種檔案系統的掛載要求!以上面的案例來說,你就得要先清除 XFS 檔案系統內的 log 之後, 重新給予一個跟原本不一樣的 UUID 後,才能夠順利掛載!同時,為了讓系統繼續利用後續沒有用到的磁碟空間,那個 xfs_growfs 就得要理解一下。 關於 xfs_growfs我們會在後續第十四章繼續強調!這裡先理解即可。

2,cpio

這個指令挺有趣的,因為 cpio 可以備份任何東西,包括裝置裝置檔案。不過 cpio 有個大問題, 那就是 cpio 不會主動的去找檔案來備份!啊!那怎辦?所以囉,一般來說, cpio 得要配合類似 find 等可以找到檔名的指令來告知 cpio 該被備份的資料在哪裡啊! 有點小麻煩啦~因為牽涉到我們在第三篇才會談到的資料流重導向說~ 所以這裡你就先背一下語法,等到第三篇講完你就知道如何使用 cpio 囉!

[[email protected] ~]# cpio -ovcB > [file|device] <==備份

[[email protected] ~]# cpio -ivcdu < [file|device] <==還原

[[email protected] ~]# cpio -ivct < [file|device] <==察看

備份會使用到的選項與引數:

-o :將資料 copy 輸出到檔案或裝置上

-B :讓預設的 Blocks 可以增加至 5120 Bytes ,預設是 512 Bytes !

這樣的好處是可以讓大檔案的儲存速度加快(請參考 i-nodes 的觀念)

還原會使用到的選項與引數:

-i :將資料自檔案或裝置 copy 出來系統當中

-d :自動建立目錄!使用 cpio 所備份的資料內容不見得會在同一層目錄中,因此我們

必須要讓 cpio 在還原時可以建立新目錄,此時就得要 -d 選項的幫助!

-u :自動的將較新的檔案覆蓋較舊的檔案!

-t :需配合 -i 選項,可用在"察看"以 cpio 建立的檔案或裝置的內容

一些可共享的選項與引數:

-v :讓儲存的過程中檔名稱可以在螢幕上顯示

-c :一種較新的 portable format 方式儲存

你應該會發現一件事情,就是上述的選項與指令中怎麼會沒有指定需要備份的資料呢?還有那個大於 (>) 與小於 (<) 符號是怎麼回事啊?因為 cpio 會將資料整個顯示到螢幕上,因此我們可以通過將這些螢幕的資料重新導向 (>) 一個新的檔案! 至於還原呢?就是將備份檔案讀進來 cpio (<) 進行處理之意!我們來進行幾個案例你就知道啥是啥了!

範例:找出 /boot 下面的所有檔案,然後將他備份到 /tmp/boot.cpio 去!

[[email protected] ~]# cd /

[[email protected] /]# find boot -print

boot

boot/grub

boot/grub/splash.xpm.gz

....(以下省略)....

# 通過 find 我們可以找到 boot 下面應該要存在的檔名!包括檔案與目錄!但請千萬不要是絕對路徑!

[[email protected] /]# find boot &#124; cpio -ocvB &gt; /tmp/boot.cpio

[[email protected] /]# ll -h /tmp/boot.cpio

-rw-r--r--. 1 root root 108M Jul 3 00:05 /tmp/boot.cpio

[[email protected] ~]# file /tmp/boot.cpio

/tmp/boot.cpio: ASCII cpio archive (SVR4 with no CRC)

我們使用 find boot 可以找出檔名,然後通過那條管線 (|, 亦即鍵盤上的 shift+\ 的組合),就能將檔名傳給 cpio 來進行處理!最終會得到 /tmp/boot.cpio 那個檔案喔!你可能會覺得奇怪,為啥鳥哥要先轉換目錄到 / 再去找 boot 呢? 為何不能直接找 /boot 呢?這是因為 cpio很笨!它不會理會你給的是絕對路徑還是相對路徑的檔名,所以如果你加上絕對路徑的 / 開頭, 那麼未來解開的時候,它就一定會覆蓋掉原本的 /boot 耶!那就太危險了!這個我們在tar 也稍微講過那個 -P 的選項!!理解吧! 好了,那接下來讓我們來進行解壓縮看看。

範例:將剛剛的檔案給他在 /root/ 目錄下解開

[[email protected] ~]# cd ~

[[email protected] ~]# cpio -idvc &lt; /tmp/boot.cpio

[[email protected] ~]# ll /root/boot

# 你可以自行比較一下 /root/boot 與 /boot 的內容是否一模一樣!

事實上 cpio 可以將系統的資料完整的備份到磁帶機上頭去喔!如果你有磁帶機的話!

備份:find / | cpio -ocvB > /dev/st0

還原:cpio -idvc < /dev/st0

這個 cpio 好像不怎麼好用呦!但是,他可是備份的時候的一項利器呢!因為他可以備份任何的檔案, 包括 /dev 下面的任何裝置檔案!所以他可是相當重要的呢!而由於 cpio 必需要配合其他的程式,例如 find 來建立檔名,所以 cpio 與管線命令及資料流重導向的相關性就相當的重要了!

其實系統裡面已經含有一個使用 cpio 建立的檔案喔!那就是 /boot/initramfs-xxx 這個檔案啦!現在讓我們來將這個檔案解壓縮看看,看你能不能發現該檔案的內容為何?

# 1\. 我們先來看看該檔案是屬於什麼檔案格式,然後再加以處理:

[[email protected] ~]# file /boot/initramfs-3.10.0-229.el7.x86_64.img

/boot/initramfs-3.10.0-229.el7.x86_64.img: ASCII cpio archive (SVR4 with no CRC)

[[email protected] ~]# mkdir /tmp/initramfs

[[email protected] ~]# cd /tmp/initramfs

[[email protected] initramfs]# cpio -idvc &lt; /boot/initramfs-3.10.0-229.el7.x86_64.img

.

kernel

kernel/x86

kernel/x86/microcode

kernel/x86/microcode/GenuineIntel.bin

early_cpio

22 blocks

# 瞧!這樣就將這個檔案解開囉!這樣瞭解乎?

相關推薦

Linux學習筆記19——XFS 檔案系統備份還原光碟寫入工具其他常見壓縮備份工具

一、XFS 檔案系統的備份與還原 使用 tar 通常是針對目錄樹系統來進行備份的工作,那麼如果想要針對整個檔案系統來進行備份與還原呢?由於 CentOS 7 已經使用 XFS 檔案系統作為預設值,所以那個好用的 xfsdump與 xfsrestore 兩個工具對 CentO

Linux學習筆記之文件系統

type 個人 入口 鼠標 動態鏈接庫 資源 功能 系統文件 學習筆記 文件系統→rootfs:根文件系統FHS(Filesystem Hierarchy Standard):文件系統層次化標準一、/boot:系統啟動相關文件,如內核,initrd,以及grub(bootl

Linux學習筆記之1——檔案和目錄管理(硬連線和軟連線)(連結檔,相當於快捷方式)

在這節將要學習linux的連線檔,在之前用"ls -l" 檢視檔案屬性的命令時, 其中第二個屬性是連線數。那麼這個連線數是幹什麼的?這就要理解inode。     先說一下檔案是怎麼儲存的。檔案儲存在硬碟上,硬碟的最小儲存單位叫做"扇區"(Sector),每個扇區儲存512位元

ROS學習筆記(五):ROS檔案系統工具的使用

roswiki地址:http://wiki.ros.org/cn/ROS/Tutorials/NavigatingTheFilesystem rospack rospack允許你獲取軟體包的有關資訊。 該選項可以返回軟體包的路徑資訊。 用法: $ rospa

Linux學習筆記之smb檔案共享

SMB檔案共享服務:SMB協議是建立在NetBIOS協議之上的應用協議,是基於TCP138、139兩個埠的服務,NetBIOS出現之後,Microsoft就使用NetBIOS實現了一個網路檔案/列印服務系統。這個系統基於NetBIOS設定了一套檔案共享協議,Microsoft稱之為SMB(Server Mes

Linux學習(二)檔案系統

一、檔案系統概述 檔案系統主要由3部分構成:與檔案管理相關的軟體、被管理的檔案、實施檔案管理所需的資料結構。 調整檔案系統的幾個步驟: (1)fdisk:在新的儲存裝置(硬碟)上建立分割槽。 (2)mkfs:在分割槽上建立檔案系統。 (3)mount:將該檔案系

Linux學習筆記】獲取檔案屬性 — stat()fstat()lstat()小結

相關文章 Linux是基於檔案的作業系統,一切皆檔案。下面就詳細的整理一下關於Linux檔案屬性的內容。 一、檔案屬性函式 系統提供了3個獲取檔案屬性的函式,分別是:stat()、fstat()、lstat()。 1、函式原型   標頭檔案包含:

Linux學習筆記--locate命令(檔案搜尋命令)

locate,定位的意思,作用是讓使用者可以快速的搜尋系統中是否有指定的檔案。 locate 命令特點: 1) "locate"的速度比"find"快,因為它並不是真的查詢檔案,而是查資料庫。

Linux學習筆記之proc檔案使用篇

在proc 目錄下建立檔案,不得不提到的struct file_operations , 詳細struct 資訊,可以查閱—— [linux kernel] . 本篇主要討論的是以下幾個介面: open int (open) (struct

Linux學習筆記3】Contos7系統沒有ifconfig,route -n功能解決辦法

上期說到第一次開啟Contos7系統遇到的問題,也講到了Contos系統是最小安裝化安裝,沒有像Window那麼多圖形,不僅僅如此,裡面的一些ifconfig,route -n等這些查詢網路的功能命令也會沒有。這是Contos7一些比較新版的系統已經淘汰了。當然

軟體安全學習筆記(5):FAT32檔案系統資料恢復

一、FAT32檔案系統結構 1、引導扇區:描述分割槽大小、簇的大小、FAT表個數與大小、分割槽載入程式等。 2、FAT(檔案分配表)FAT1+FAT2:記錄資料儲存區每一個簇的使用情況,形成每個檔案的簇連結串列 3、資料儲存區: 儲存兩類資料:目錄項、檔案資料 二、幾個概

Linux學習筆記之八】檔案檔案系統壓縮,打包備份

8.2Linux系統常見的壓縮指令   在 Linux 的環境中,壓縮檔案案的副檔名大多是: 『.tar, .tar.gz, .tgz, .gz, .Z, .bz2, *.xz』,為什麼會有這樣的副檔名呢?   這是因為 Linux 支援的壓縮指令非常多,且

Linux學習筆記(4)磁碟分割槽檔案系統命令

    df 檢查檔案系統的磁碟空間佔用情況,引數-a列出全部目錄,引數-h按KB,MB,GB顯示 du   檢車某個目錄或者檔案佔用的磁碟空間,引數-s顯示佔用總空間,引數-sh統計目錄大小 mo

Linux學習筆記15——檔案系統的簡單操作

一、檔案系統的簡單操作 稍微瞭解了檔案系統後,再來我們得要知道如何查詢整體檔案系統的總容量與每個目錄所佔用的容量囉! 此外,前兩章談到的檔案型別中尚未講的很清楚的連結檔案 (Link file) 也會在這一小節當中介紹的。 1 ,磁碟與目錄的容量 現在我們知道磁碟的整體資料是在 supe

Linux學習筆記14——認識 Linux 檔案系統

系統管理員很重要的任務之一就是管理好自己的磁碟檔案系統,每個分割槽不可太大也不能太小, 太大會造成磁碟容量的浪費,太小則會產生檔案無法儲存的困擾。此外,我們在前面幾章談到的檔案許可權與屬性中, 這些許可權與屬性分別記錄在檔案系統的哪個區塊內?這就得要談到 filesystem 中的 inode 與

Linux學習筆記系統中的檔案傳輸

一、scp命令—拷貝 scp是linux中功能最強大的檔案傳輸命令,可以實現從本地到遠端以及遠端到本地的輕鬆檔案傳輸操作。 1、上傳 scp 本地檔案 遠端主機使用者@遠端主機IP:遠端主機目錄

linux基礎(37)--xfs檔案系統備份和恢復--RHEL7.2

1. 準備測試檔案   cp /etc/passwd /sda3   mkdir /sda3/test 2. 互動式備份   備份/sda3,備份後的檔案是/opt/dump   xfsdump -f /opt/dump_sda3 /sda3        需要指定備份標籤

Linux學習筆記Linux檔案系統

Linux檔案系統root      存放root使用者相關檔案home    存放普通使用者的相關檔案bin         存放普通命令檔案的目錄sbin        具有一定權才能使用的命令的目錄mnt        掛載軟碟機,光碟機的地方etc         存

Linux 學習筆記 (二)在檔案系統中跳轉

1. 檔案系統樹結構 windows 分割槽 Windows 情況開始分析,硬碟會被分為多個分割槽(C 盤、D 盤 … ),每個分割槽之上會看到很多資料夾: Linux 分割槽 Linux 中分割槽不叫 C 盤、D 盤了,叫 sda1、sda2 … 但是檔案系

Linux學習筆記(三):系統執行級執行級的切換

查看 用戶操作 回車 water hat ntsysv tde 文件表 config 1.Linux系統與其它的操作系統不同,它設有執行級別。該執行級指定操作系統所處的狀態。Linux系統在不論什麽時候都執行於某個執行級上,且在不同的執行級上執行的程序和服務都不同,所要