cpio三種操作模式:1、copy-out模式,用於打包備份檔案,會把檔案複製到歸檔包中;2、copy-in模式,用於從歸檔包檔案中恢復檔案,可以從標準輸入讀入歸檔包,將歸檔包中的檔案讀出或者列出歸檔包裡的內容;3、copy-pass模式,用於把檔案從一棵目錄樹複製到另一棵。
本教學操作環境:linux7.3系統、Dell G3電腦。
在linux中,cpio是一種資料備份與恢復工具,用於建立cpio檔案檔案,從檔案檔案中抽取檔案,或者把檔案從一個目錄複製到另外一個目錄。生成的檔案檔案可以是一個磁碟檔案,也可以寫入磁帶等資料流媒介。cpio不僅能夠處理二進位制與ASCII頭資料格式的cpio檔案檔案,也能夠讀寫各種tar格式的檔案檔案。為了保持相容,如果不特別指定,cpio通常仍然建立二進位制頭資料格式的檔案檔案。
cpio類似tar命令,可以將檔案複製打包到cpio或tar格式的歸檔包檔案中,也可以從歸檔包檔案中複製檔案。 歸檔包檔案可以是磁碟上的檔案, 也可以是磁帶等裝置檔案。
從檔案檔案中抽取檔案時,cpio命令能夠自動識別讀取的是哪一種檔案檔案,而且也能讀取在不同的系統中建立的具有不同位元組順序的檔案檔案。
cpio有三種操作模式,如下表所示:
cpio三種操作模式 | |
---|---|
操作模式 | 模式說明 |
copy-out模式 | 該模式用於打包備份檔案。 cpio把檔案複製到歸檔包中。cpio要打包的檔名來自標準輸入,它從標準輸入獲得檔名列表,一行一個。 一般通過管道來將標準輸入重定向到另一個命令的輸出。最常見的方法是使用find命令生成檔名列表,然後通過管道傳送給cpio, 這樣cpio就可以知道要備份的資料來自哪裡。需要在find後面加上-depth選項, 減少因為進入沒有存取許可權的目錄而引起的麻煩。 cpio預設把歸檔包檔案寫到標準輸出,所以需要用重定向符號>或者>>將歸檔包資料輸出重定向到一個檔案中。 |
copy-in模式 | 該模式用於從歸檔包檔案中恢復檔案。 cpio它從標準輸入讀入歸檔包,將歸檔包中的檔案讀出或者列出歸檔包裡的內容。cpio將從歸檔包中讀出的資料寫到標準輸出。 |
copy-pass模式 | cpio把檔案從一棵目錄樹複製到另一棵, 它結合了 copy-in 和 copy-out 的操作, 但不使用歸檔包。 cpio從標準輸入讀取欲複製的檔名列表; 目標目錄作為非選項的命令列引數給出。 |
cpio支援下列的歸檔包格式: binary, old ASCII, new ASCII, crc, HPUX binary, HPUX old ASCII, old tar, 和 POSIX.1 tar。
cpio的某些選項只能用在對應的操作模式上,常用的命令選項格式如下所示:
[root@initroot ~]# cpio -ovcB > [file|device] #備份
[root@initroot ~]# cpio -ivcdu < [file|device] #還原
[root@initroot ~]# cpio -ivct < [file|device] #察看
登入後複製
copy-out模式(備份)用到的選項與引數:
-o :將資料copy輸出到檔案或裝置上
-B :讓預設的Blocks可以增加至5120bytes ,預設是512bytes!這樣的好處是可以讓大檔案的儲存速度加快(請參考 i-nodes 的觀念)
copy-in模式(還原)用到的選項與引數:
-i :將資料自檔案或裝置copy出來系統當中
-d :自動建立目錄!使用cpio所備份的資料內容不見得會在同一層目錄中,因此我們必須要讓cpio在還原時可以建立新目錄,此時就得要-d選項的幫助!
-u :自動的將較新的檔案覆蓋較舊的檔案!
-t :需配合-i選項,可用在"察看"以 cpio 建立的檔案或裝置的內容
通用的選項與引數:
-v :讓儲存的過程中檔名可以在螢幕上顯示
-c :一種較新的portable format方式儲存
cpio從標準輸入讀入資料,將處理過的資料輸出到標準輸出,所以cpio需要配合管道和重定向符號使用。
找出/boot目錄下的所有檔案,備份到/tmp/boot.cpio歸檔包檔案中:
[root@initroot ~]# cd /
[root@initroot /]# find boot -print
boot
boot/grub
boot/grub/gfxblacklist.txt
boot/grub/unicode.pf2
boot/grub/locale
...省略...
登入後複製
find命令可以找出boot目錄下所有的檔案,包括檔案與目錄!注意這裡的boot為相對路徑,而不是絕對路徑!
[root@initroot /]# find boot | cpio -ocvB > /tmp/boot.cpio
[root@initroot /]# ls -lh /tmp/boot.cpio
-rw-r--r-- 1 peter peter 193M Feb 10 15:59 /tmp/boot.cpio
[root@initroot ~]# file /tmp/boot.cpio
/tmp/boot.cpio: ASCII cpio archive (pre-SVR4 or odc)
登入後複製
使用find boot找出檔名,通過管道線|將輸出傳給cpio,通過重定向符號>將歸檔資料輸出到/tmp/boot.cpio檔案! 上面find的引數boot為相對路徑,而不是絕對路徑,cpio不會對路徑做特殊處理,給的什麼資料它就接收什麼資料。 所以如果這裡用絕對路徑的話,那麼find命令的輸出也是也是絕對路徑,cpio接收的也是絕對路徑, 那麼當從歸檔檔案中複製檔案的時候,因為是絕對路徑,那麼複製出來的檔案就一定會覆蓋掉原本/boot目中的檔案! 這是非常危險的!所以再用find命令配合cpio打包檔案的時候,一定要用相對路徑。參考tar命令的-P選項!!
現在將歸檔包檔案/tmp/boot.cpio解開到/root/目錄下:
[root@initroot ~]# cd ~
[root@initroot ~]# cpio -idvc < /tmp/boot.cpio
[root@initroot ~]# ls -al /root/boot
登入後複製
可以看出/root/boot與/boot的內容一模一樣!
cpio可以將系統的資料完整的備份到磁帶機上:
[root@initroot ~]# find / | cpio -ocvB > /dev/st0
登入後複製
從磁帶機中還原資料:
[root@initroot ~]# cpio -idvc < /dev/st0
登入後複製
cpio可以備份任何的檔案, 包括/dev下的裝置檔案!是非常重要的命令!
cpio必需要配合其他的程式,例如find來建立檔名,所以cpio與管線命令及資料流重導向有非常密切的關係!
事實上/boot目錄下的/boot/initramfs-xxx或者/boot/initrd.img-xxx-generic檔案也是一個cpio歸檔包檔案。
我們可以將該檔案解開到/tmp/initramfs目錄下看看這個歸檔包中都有哪些檔案:
[root@initroot ~]# file initrd.img-4.15.0-65-generic
initrd.img-4.15.0-65-generic: ASCII cpio archive (SVR4 with no CRC)
[root@initroot ~]# mkdir /tmp/initramfs
[root@initroot ~]# cd /tmp/initramfs
[root@initroot initramfs]# cpio -idv < /boot/initrd.img-4.15.0-65-generic
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/AuthenticAMD.bin
56 blocks
登入後複製
注意這裡將-c選項去掉,如果加上-c選項的話,cpio會出現如下提示:
cpio: premature end of file
登入後複製
將-c選項去掉就可以成功解壓歸檔包檔案了!
相關推薦:《Linux視訊教學》
以上就是linux cpio三種操作模式是什麼的詳細內容,更多請關注TW511.COM其它相關文章!