
我想知道繼續複製硬碟的最佳方法是什麼,這樣我就可以簡單地將克隆的驅動器插入我的電腦並從它無縫啟動,就像我目前使用現有驅動器一樣。
我有一個運行 Debian 的硬碟,根據其 SMART 數據,它看起來好像出現了故障。我確實有備份,也可以在新磁碟機上重新安裝作業系統;但是,我目前的首選是克隆驅動器,目前除了使用可啟動 CD 上的 System Rescue CD 5.0.3 之外別無選擇。
該驅動器上沒有太多的空間——可能不到 10 GB 的已用空間,數據也很少,所以我不太關心時間,因為我預計這不會花費大量時間。
如果我記得的話,我在安裝 Debian 時瀏覽了選項,將其設置為加密驅動器,所以我相信 /dev/sda 顯示為未加密的啟動分區,其餘部分已加密,然後在“其餘部分”中,我加密區域內有一個10 GB 的小根分割區,其餘部分目前未使用。
我還在處理較舊的PATA 連接器(沒有可用的SATA 驅動器),並且電腦的主機板上有一個PATA 連接器,一條PATA 帶狀電纜連接到該連接器中,用於啟動CD-ROM 驅動器和接近故障的硬碟,因此沒有空間連接任何第二個 PATA 驅動器以進行本機傳輸。
為了解決這個問題,我有第二台計算機,其主機板上具有相同的單一 PATA 連接器,其中我連接了另一個用於啟動的 CD-ROM 驅動器和目標硬碟。
我已經透過 CD-ROM 驅動器啟動了兩台計算機,以啟動 System Rescue CD 5.0.3,我正在考慮如何盡可能最好地克隆故障驅動器。
這些電腦可以透過 LAN 訪問,並且我透過沒有圖形介面的終端透過 SSH 遠端連接到這兩台電腦。
我不太確定來源磁碟機和目標磁碟機的大小。來源驅動器的容量可能比目標驅動器的容量更大,因此理想情況下,我只想傳輸已使用的空間,而不是遍歷整個空驅動器。
我正在考慮按照描述使用 ddrescue這裡;然而,它僅描述了本地傳輸數據。
更新:我正在研究 Debian 安裝程式如何設定來源驅動器。看來我有三個分割區,只有最後一個分割區被加密:
src # fdisk -l /dev/sda
Disk /dev/sda: 37.3 GiB, 40027029504 bytes, 78177792 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
Disklabel type: dos
Disk identifier: 0x332e4146
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 247807 245760 120M 83 Linux
/dev/sda2 247808 8060927 7813120 3.7G 82 Linux swap / Solaris
/dev/sda3 8060928 78176255 70115328 33.4G 83 Linux
src# cryptsetup --verbose isLuks /dev/sda1
Device /dev/sda1 is not a valid LUKS device.
Command failed with code 22: Invalid argument
src# cryptsetup --verbose isLuks /dev/sda2
Device /dev/sda2 is not a valid LUKS device.
Command failed with code 22: Invalid argument
src# cryptsetup --verbose isLuks /dev/sda3
Command successful.
我相信我也在嘗試在類似容量的驅動器之間進行傳輸:一個 40 GB PATA 驅動器到另一個 40 GB PATA 驅動器。
這是目的地:
dest# fdisk -l /dev/sda
Disk /dev/sda: 37.3 GiB, 40027029504 bytes, 78177792 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
更新:我正在考慮使用 NBD 透過 LAN 公開來源磁碟機的分割區,以便從目標使用 ddrescue。
這是我迄今為止嘗試公開來源驅動器的方法...
src# nbd-server -d 8000 /dev/sda
...並在目標電腦上本機安裝:
dest# nbd-client src 8000 /mnt/nbd-sda
不幸的是,我在嘗試這個時遇到了錯誤;我什至無法安裝遠端設備:
Warning: the oldstyle protocol is no longer supported.
This method now uses the newstyle protocol with a default export
Error: Cannot open NBD: No such file or directory
Please ensure the 'nbd' module is loaded.
Exiting.
更新:我要嘗試的下一件事就是手動在目標磁碟機上重新建立分割區。
我首先將 MBR 複製到:
src# dd if=/dev/sda of=/tmp/sda-mbr.dat bs=512 count=1
dest# scp root@src:/tmp/sda-mbr.dat /tmp
dest# dd if=/tmp/sda-mbr.dat of=/dev/sda
dest# sync
在繼續之前,我認為這次至少創建一個恢復分區會有幫助。
dest# fdisk /dev/sda
我正在刪除最後一個分割區,並為自己留出大約 15 GB 的空間作為最後一個分割區。
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x332e4146
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 247807 245760 120M 83 Linux
/dev/sda2 247808 8060927 7813120 3.7G 82 Linux swap / Solaris
/dev/sda3 8060928 45809663 37748736 18G 83 Linux
/dev/sda4 45809664 78177791 32368128 15.4G 83 Linux
我需要在目標上建立與來源上的 /dev/sda3 相同的加密分割區;我不妨對這個恢復分區做同樣的事情:
dest# cryptsetup luksFormat /dev/sda3 --verify-passphrase
dest# cryptsetup luksFormat /dev/sda4 --verify-passphrase
接下來,開啟加密的復原分割區:
dest# cryptsetup open /dev/sda4 sda4-opened
dest# mkdir /mnt/sda4-open
dest# mke2fs -j /dev/mapper/sda4-opened
dest# mount /dev/mapper/sda4-opened /mnt/sda4-open
至少現在我可以遠端安裝這個復原分割區並將資料傳輸到更好的磁碟機。
首先,我打開來源磁碟機上的加密分割區:
src# cryptsetup open /dev/sda3 sda3-opened
src# mkdir /mnt/sda3-open
src# mount /dev/mapper/sda3-opened /mnt/sda3-open
現在使用 df,我可以看到我僅使用了 12 GB 的磁碟空間。
讓我們卸載但保留它的映射:
src# umount /mnt/sda3-open
src# rmdir /mnt/sda3-open
現在我想在來源磁碟機上安裝恢復分割區:
src# mkdir /mnt/dest-sda4
src# sshfs root@dest:/mnt/sda4-open /mnt/dest-sda4
安裝完畢後,我現在可以運行 ddrescue:
src# ddrescue -f -n /dev/sda1 /mnt/dest-sda4/sda1.ddrescue.img /mnt/dest-sda4/sda1.ddrescue.log
這產生了與原始分割區大小相同的影像,因此看起來這並不排除未使用的空間。
我想檔案歸檔器現在改為:
src# fsarchiver savefs /mnt/dest-sda4/sda1.fsarchiver.img.fsa /dev/sda1
Statistics for filesystem 0
* files successfully processed:....regfiles=314, directories=6, symlinks=0, hardlinks=0, specials=0
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
掛載 /dev/sda1 並執行 df 顯示它只使用了 33 MB,而 .fsa 檔案只有 24 MB,所以可能它被壓縮了。它比原來的 120 MB 更好。
現在讓我們嘗試使用根分割區 sda3 來看看效果如何:
src# fsarchiver savefs /mnt/dest-sda4/sda3.fsarchiver.img.fsa /dev/mapper/sda3-opened
這可能需要一段時間,所以我現在保存此更新。
更新:這比我預想的還要快。這是我最終得到的:
dest# ls -lh
total 7.7G
drwx------ 2 root root 16K Apr 8 01:49 lost+found
-rw-r--r-- 1 root root 24M Apr 8 02:04 sda1.fsarchiver.img.fsa
-rw-r--r-- 1 root root 7.7G Apr 8 02:43 sda3.fsarchiver.img.fsa
這是查看上面命令的輸出的更有趣的部分:
src# fsarchiver savefs /mnt/dest-sda4/sda3.fsarchiver.img.fsa /dev/mapper/sda3-opened
Statistics for filesystem 0
* files successfully processed:....regfiles=149025, directories=84796, symlinks=20559, hardlinks=127551, specials=1269
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
如果我沒看錯的話,這是令人鼓舞的,因為從來源磁碟機讀取資料沒有任何困難。
讓我們清理一些:
src# umount /mnt/dest-sda4
src# rmdir /mnt/dest-sda4
接下來,我將存檔檔案還原到目標的 /dev/sda1 和 /dev/sda3 上,但首先讓我們看一下目標磁碟機上有什麼,因為我忘記了在哪裡停止設定。
首先,/dev/sda1 上有檔案系統嗎?
dest# mkdir /mnt/sda1
dest# mount /dev/sda1 /mnt/sda1
NTFS signature is missing.
Failed to mount '/dev/sda1': Invalid argument
The device '/dev/sda1' doesn't seem to have a valid NTFS.
Maybe the wrong device is used? Or the whole disk instead of a
partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?
好的。我預計不會有檔案系統,但沒想到會出現 NTFS 訊息。所以那裡什麼都沒有。
讓我們恢復第一個分割區映像:
dest# fsarchiver restfs /mnt/sda4-open/sda1.fsarchiver.img.fsa id=0,dest=/dev/sda1
Statistics for filesystem 0
* files successfully processed:....regfiles=314, directories=6, symlinks=0, hardlinks=0, specials=0
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
現在讓我們來安裝:
dest# mount /dev/sda1 /mnt/sda1
dest# ls -l /mnt/sda1
...
dest$ df -h | grep sda1
...
到目前為止,情況看起來不錯。
現在讓我們進行根分割區。
dest# cryptsetup open /dev/sda3 sda3-opened
dest# mkdir /mnt/sda3-open
dest# mount /dev/mapper/sda3-opened /mnt/sda3-open
NTFS signature is missing.
Failed to mount '/dev/mapper/sda3-opened': Invalid argument
The device '/dev/mapper/sda3-opened' doesn't seem to have a valid NTFS.
Maybe the wrong device is used? Or the whole disk instead of a
partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?
和以前一樣——那裡什麼都沒有。
讓我們恢復分割區映像:
dest# fsarchiver restfs /mnt/sda4-open/sda3.fsarchiver.img.fsa id=0,dest=/dev/mapper/sda3-opened
Statistics for filesystem 0
* files successfully processed:....regfiles=149025, directories=84796, symlinks=20559, hardlinks=127551, specials=1269
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
現在讓我們來安裝:
dest# mount /dev/mapper/sda3-opened /mnt/sda3-open
dest# ls -l /mnt/sda3
...
dest$ df -h | grep sda3
...
到目前為止,情況看起來不錯。
我也在兩者上運行了以下命令:
# fsarchiver probe simple
事情看起來正如預期的那樣。
我相信我仍然想念的一件事是我認為這會弄亂 Grub。我似乎記得有關階段 1 從 MBR 正常啟動的信息,但當我上次嘗試執行類似操作時,它無法在 /boot 分區上找到階段 2。
dest# mount -o bind /proc /mnt/sda3-open/proc
dest# mount -o bind /dev /mnt/sda3-open/dev
dest# mount -o bind /sys /mnt/sda3-open/sys
dest# chroot /mnt/sda3-open /bin/bash
(dest) chroot# mount /dev/sda1 /boot/
(dest) chroot# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
(dest) chroot# umount /boot
(dest) chroot# exit
dest# umount /mnt/sda3-open/{sys,dev,proc}
當我重新啟動時,這應該可以工作並且驅動器應該可以正常啟動;不過,現在已經太晚了,我還不想介入。
而且我還不相信這會有一個美好的結局。上面的 grub-install 命令表示它正在為 i386 安裝,但我相信我想要 64 位元。
我可能必須透過救援64 重新啟動系統救援CD 來重做此部分。我不確定預設啟動是否會啟動 32 位元。
再說一次,我明天會處理剩下的事情。
更新:所以好消息是系統救援 CD 的預設啟動是rescue64,所以這不會有任何問題。
事實證明我完全忘記了 LVM,而且驅動器的 UUID 顯然不匹配。
...
cryptsetup: lvm is not available
cryptsetup: lvm is not available
cryptsetup: lvm is not available
cryptsetup: lvm is not available
ALERT! /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx does not exist.
Check cryptopts=source= bootarg: cat /proc/cmdline
or missing modules, devices: cat /proc/modules; ls /dev
-r Dropping to a shell. Will skip /dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxx
xxxxxxxx if you can't fix.
modprobe: module ehci-orion not found in modules.dep
BusyBox vx.xx.x (Debian x:x.xx.x-x+xxxxxx) built-in shell (ash)
Enter 'help for a list of built-in commands.
/bin/sh: can't access tty: job control turned off
(initramfs)
我想我可以與這些戰鬥,但我不會打擾。相反,我將嘗試 dirkt 的建議並克隆完整的 /dev/sda——UUID 和所有內容——因為 40 GB 只是 10 GB 的四倍,我昨晚傳輸了它,並且沒有花費太長時間局域網。
昨晚我無法做到這一點,因為我無法讓 NBD 工作,所以我訴諸於保存到圖像檔案。如果我正在進行完整的磁碟克隆,我就無法做到這一點,所以讓我們看看管道或命名管道是否工作得更好。
回到開頭,兩台電腦現在都已從 System Rescue CD 可啟動 CD 啟動,兩台電腦都可以透過各自的 DHCP 分配的 IP 位址透過網路進行訪問,並且兩台電腦都已透過命令設定了 root 密碼passwd
。
在使用真正的驅動器進行此操作之前,我想使用一個小型假驅動器進行練習,因此我將首先對其進行設定。
src# dd if=/dev/zero of=/root/tempsrc.dat bs=1M count=128
...
src# fdisk -l /root/tempsrc.dat
Disk /root/tempsrc.dat: 128 MiB, 134217728 bytes, 262144 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
Disklabel type: dos
Disk identifier: 0x8b8647e7
Device Boot Start End Sectors Size Id Type
/root/tempsrc.dat1 * 2048 34815 32768 16M 83 Linux
/root/tempsrc.dat2 34816 100351 65536 32M 82 Linux swap / Solaris
/root/tempsrc.dat3 100352 262143 161792 79M 83 Linux
src# mkdir /mnt/tempsrc
src# mkdir /mnt/tempsrc-mounted
src# losetup /dev/loop1 /root/tempsrc.dat -o $(expr 2048 \* 512)
src# mke2fs /dev/loop1
src# mount /dev/loop1 /mnt/tempsrc-mounted
src# echo 'This is partition 1' > /mnt/tempsrc-mounted/note1.txt
src# umount /mnt/tempsrc-mounted
src# losetup -d /dev/loop1
src# losetup /dev/loop1 /root/tempsrc.dat -o $(expr 100352 \* 512)
src# cryptsetup luksFormat /dev/loop1 --verify-passphrase
src# cryptsetup open /dev/loop1 loop1-opened
src# mke2fs -j /dev/mapper/loop1-opened
src# mount /dev/mapper/loop1-opened /mnt/tempsrc-mounted
src# echo 'This is partition 3' > /mnt/tempsrc-mounted/note3.txt
src# umount /mnt/tempsrc-mounted
src# cryptsetup close loop1-opened
src# losetup -d /dev/loop1
src# rmdir /mnt/tempsrc-mounted
src# rmdir /mnt/tempsrc
我知道。我沒有再和LVM打交道。那好吧。
我現在有一個 /root/tempsrc.dat,其中包含磁碟映像(例如我想要傳輸到遠端目標的 SD 卡映像)。第一個分割區上有一個名為 的文件note1.txt
,第三個分割區已加密且note3.txt
內容不同。我想確保在運行fsarchiver
並傳輸它之後我可以完成所有這些。
讓我們在目的地準備一些東西:
dest# dd if=/dev/zero of=/root/tempdest.dat bs=1M count=128
dest# fdisk -l /root/tempdest.dat
Disk /root/tempdest.dat: 128 MiB, 134217728 bytes, 262144 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
我們也為這些創建環回設備:
src# losetup /dev/loop1 /root/tempsrc.dat
dest# losetup /dev/loop2 /root/tempdest.dat
現在,當我準備執行傳輸時,我發現 fsarchiver 無法按照所述處理它這裡和這裡。
我希望做類似以下的事:
src# fsarchiver savefs /tmp/fifo1 /dev/loop1
dest# fsarchiver restfs /tmp/fifo2 id=0,dest=/dev/loop2
更新:我用臨時的第三個驅動器取代了目標 40 GB 驅動器,並打開了目標 PC。
讓我們開始設定這個新驅動器:
dest# mkdir /mnt/sda-open
dest# mount /dev/sda1 /mnt/sda-open
嘗試再次傳輸,但這次同時對整個 /dev/sda 進行操作:
src# mkdir /mnt/dest-sda
src# sshfs root@dest:/mnt/sda-open /mnt/dest-sda
src# fsarchiver savefs /mnt/dest-sda/src-sda.fsarchiver.img.fsa /dev/sda
filesys.c#317,generic_mount(): partition [/dev/sda] cannot be mounted on [/tmp/fsa/20180408-222928-xxxxxxxx-00] as [vfat] with options []
oper_save.c#1032,filesystem_mount_partition(): cannot mount partition [/dev/sda]: filesystem may not be supported by either fsarchiver or the kernel.
removed /mnt/dest-sda/src-sda.fsarchiver.img.fsa
好吧,這個想法就這麼多。我猜他們稱其為“FS”存檔器是有原因的。讓我們嘗試一下partimage。
src# partimage --compress=1 save /dev/sda /mnt/dest-sda/src-sda.partimg.bz2
這也不起作用;顯然,這涉及檔案系統而不是整個磁碟。
由於我們對整個磁碟進行操作,讓我們看看 ddrescue 現在是否可以工作。
src# ddrescue --no-scrape /dev/sda /mnt/dest-sda/src-sda.ddrescue.img /mnt/dest-sda/src-sda.ddrescue.img.log
GNU ddrescue 1.21
Press Ctrl-C to interrupt
ipos: 785580 kB, non-trimmed: 0 B, current rate: 12320 kB/s
opos: 785580 kB, non-scraped: 0 B, average rate: 10615 kB/s
non-tried: 39241 MB, errsize: 0 B, run time: 1m 14s
rescued: 785580 kB, errors: 0, remaining time: 1h
percent rescued: 1.96% time since last successful read: 0s
Copying non-tried blocks... Pass 1 (forwards)
我在下午 5:41 開始使用一個 40 GB 的驅動器,我認為是一個 100 Mbps 的 LAN。目前,輸出聲稱將在大約一個小時內完成。
答案1
嗯,看來我的中間驅動器走在正確的軌道上。這不是我最初打算做的,但它確實幫助我解決了我的問題。
現在的新驅動器是原始驅動器的克隆,並且運作良好。
為了在所提出的限制下克隆我的原始驅動器(特別是需要在沒有 Clonezilla 的情況下使用系統救援 CD 通過 LAN),我能夠按如下方式完成此操作。
首先,我按照上述方法將臨時 160 GB 硬碟插入備用 PC,然後使用可啟動的 System Rescue CD 光碟啟動兩台電腦。
在我的PC 上,我在本地src
安裝了 160 GB 硬碟驅動器,然後按照上述方式運行,將故障硬碟驅動器作為映像檔鏡像到 160 GB 硬碟上。這個 40 GB 驅動器被鏡像為一個 40 GB 鏡像文件,在我的 100 Mbps LAN 上花了一個小時左右完成。dest
sshfs
ddrescue
我將保留這張圖片,這樣我就不必再這樣做了;從現在開始,資料的增量備份應該足以在捕獲此初始映像後進行還原。
此階段完成後,我將故障的 40 GB 驅動器替換為主機中恰好具有相同 40 GB 容量的替換驅動器,而src
無需觸摸甚至關閉電源dest
。
然後,我src
再次啟動系統救援 CD,再次dest
透過掛載目錄sshfs
,這次從我的映像中恢復:
dest# ddrescue --force --no-scrape /mnt/dest-sda/src-sda.ddrescue.img /dev/sda /mnt/dest-sda/src-restore-sda.ddresue.img_2018-04-08.log
這又花了大約一個小時才能完成。
由於這是一個完整驅動器的映像(而不是分區),因此我可以簡單地彈出 CD 並重新啟動src
,一切都保持原樣。