2015-06-29

Ubuntu 用 dd 指令複製檔案

疑 ... 阿舍 ! 這個用 cp 指令來複製檔案不是就已經很方便了,為什麼還要用到 dd 指令哩 ?! 嗯 ... 這個嘛,是因為阿舍正在寫一篇用 debugfs 指令來救回已刪除檔案的文,然後,就發現裡面要用到 dd 指令來把檔案從被刪除的區塊(Block)中搬到另外的檔名來存放,阿舍覺得這個方式也可用來複製檔案,而且,可以從 dd 複製的方式來練習從檔案區塊救回資料的方式,所以,阿舍先來寫這篇文來介紹一下囉 !



在開始之前,阿舍要先說一下,這篇文會提到二個和 Linux 檔案系統有關的東西,一個是 Inode,另一個就是 Block(區塊),有關 Inode 的說明和介紹請參考阿舍寫的這一篇文,而有關區塊的部份,你可以把當作是檔案系統的最小儲存單位,在 Linux 的檔案系統上,一般是 4096 byte,所以,當你存一個檔案小於 4096 byte 時,還是會用到一個區塊哩 ! 但是,一個區塊的單位也可能不是 4096 Byte,可以用下面的指令來查一下囉 ! (以阿舍的硬碟代碼是 /dev/sda1 為例)

$ blockdev --getbsz /dev/sda1

瞭解 Inode 和 Block 之後,接下來,阿舍就可以開始說明用 dd 指令複製檔案的操作步驟哩 ! 首先,當然是要先查出檔案的資料所存放的 Block 的開始和結束位置,查詢的方式有二種,下面的第一種是用檔案名稱,而第二種則是用 Inode 編號,下面是以阿舍要複製 /dev/sda1 磁碟上的 /home/arthurtoday/xyz.zip 檔案為例。

$ sudo debugfs -R 'stat /home/arthurtoday/xyz.zip' /dev/sda1

$ sudo debugfs -R 'stat <149665≶' /dev/sda1

執行完上面的指令後,會看到類似下面這樣的結果 (按下 q 字母鍵可跳出),而阿舍需要的資料是最下面那一行的數字,也就 "EXTENTS:" 下面那一行,那個就是這個檔案的 Block 開始編號 2752512 和結束編號 2786584 及它幫忙算好的共有 34072 個 Block 的這個數字哩 !

Inode: 149665   Type: regular    Mode:  0640   Flags: 0x80000
Generation: 1253879810    Version: 0x00000000:00000001
User:  1000   Group:  1000   Size: 139560875
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 272584
Fragment:  Address: 0    Number: 0    Size: 0
  ctime: 0x558f59f3:e0d6becc -- Sun Jun 28 10:20:35 2015
  atime: 0x558f5c1d:0766fe08 -- Sun Jun 28 10:29:49 2015
  mtime: 0x558f59f3:e0d6becc -- Sun Jun 28 10:20:35 2015
crtime: 0x558f59f0:87318650 -- Sun Jun 28 10:20:32 2015
Size of extra inode fields: 28
EXTENTS:
(0-32767):2752512-2785279, (32768-34072):2785280-2786584

有了這幾個數字之後,阿舍就可以用 dd 指令來複製檔案囉 ! 下面就用 dd 指令來複製這個檔案的方式和說明,執行後,應該就會產出檔案,但是,複製出來的檔案可能會比原來的大,因為是以 Block 為單位來複製的,不過,並不會改變或影響檔案的內容的,但是,如果複製出來的檔案比較小,通常就會有問題哩 !

$ sudo dd if=/dev/sda1 of=f.zip bs=4096 count=34073 skip=2752512

# if 選項用來指定磁碟裝置代號
# of 選項用來指定複製出來的新檔案名稱和路徑
# bs 選項用來指定 Block 的大小,也就是用 blockdev 指令取到的數字
# count 選項用來指定要複製幾個 Block,記得要多加 1 才行,以阿舍查的檔案查到的 Block 數是 34072 為例,這個選項就要變成放 34073 才對
# skip 選項就是要放上面查到的 Block 的開始編號

這種以 Block 為基礎的資料複製方式拿來複製完整的檔案可能不太實用,但是,如果是用在無法以檔名直接複製資料或要從光碟或磁碟直接複製某些資料出來時,就會滿實用的囉 ! ...



[+] Ubuntu 指令新手會用到的35個技法 - 這是以阿舍的使用經驗編寫出來的電子書,三天內應該就看的完,學的起來哩 ! 有空就參考一下囉 ! ... ^^=

關於阿舍

好文不藏私,請多分享囉!! ^^=



沒有留言 :

張貼留言

如果留言後,發現留言不見了,這通常是因為 Goolge 把它認為是垃圾留言了,請用信件通知阿舍調整 ( ayubiz@gmail.com )。謝謝 !