# 無痛轉移Linux系統與資料(舊電腦舊硬碟→新電腦新硬碟) ### 0. 將新硬碟接上舊電腦 ### 1. 安裝```pigz``` ```=shell ### Ubuntu $ sudo apt-get install pigz ### Arch Linux $ sudo pacman -S pigz ### CentOS $ sudo yum -y install pigz ``` ### 2. 壓縮系統與所有的資料 建議可以先用df指令來看```/home```與```/```各還有多少空間,因為通常```/home```與```/```會分開掛載在大硬碟與小硬碟上,怕容量會不夠。 ```=shell $ sudo tar --use-compress-program=pigz -cvpf \ arch-backup.tgz --exclude=/proc --exclude=/lost+found \ --exclude=/arch-backup.tgz --exclude=/mnt --exclude=/etc/fstab \ --exclude=/sys --exclude=/run/media --exclude=/media <path> ``` ### 3. 確認新硬碟 ```=shell $ df -h ``` 會列出所有已掛載硬碟的資訊 ``` Filesystem Size Used Avail Use% Mounted on devtmpfs 32G 0 32G 0% /dev tmpfs 32G 0 32G 0% /dev/shm tmpfs 32G 9.7M 32G 1% /run tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/mapper/ol-root 894G 177G 717G 20% / /dev/sdb2 1014M 607M 408M 60% /boot /dev/sdb1 599M 5.1M 594M 1% /boot/efi /dev/sda 5.4T 92G 5.1T 2% /home tmpfs 6.3G 12K 6.3G 1% /run/user/42 tmpfs 6.3G 4.0K 6.3G 1% /run/user/1009 ``` 再使用 ```=shell $ ls /dev/[sh]d* ``` 會列出所有有接上電腦的硬碟 ``` /dev/sda /dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdc ``` 查看/dev/sdc資訊 ```=shell $ sudo parted /dev/sdc print ``` ``` Model: ATA WDC WD40EFZX-68A (scsi) Disk /dev/sdc: 4001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size Type File system Flags ``` 這裡就會知道```/dev/sdc```確實是我們新接上的4TB新硬碟,也還未有任何分割區。 ### 5. 確認開機模式 ```=shell $ sudo ls /sys/firmware/efi/efivars ``` :::danger 如果沒有以下資料夾,那就是用 **傳統BIOS(Legacy)** 開機,反之是用 **UEFI** 開機,這步驟很重要,因為**舊電腦目前的開機模式不同會導致後續指令的不同**,如果是使用傳統BIOS開機,無法強制讓其轉為UEFI開機(應該啦,我自己試過是會掛載不到硬碟)。 ::: ### 4. 給新硬碟分區或掛載 :::info 這裡只說明```parted```,因為```fdisk```不支援2TB以上硬碟分區。 ::: ```=shell $ sudo parted /dev/sdc ``` 進入我們的新硬碟後,這裡就會分成傳統BIOS開機與UEFI開機的不同切法。 #### 傳統BIOS開機 先切出一個非File System的分割區(不用太大),並設為bios開機分割區。 因為```/dev/sdc```還未有分割區,所以這個分割區應該會為編號1。 ``` (parted) mkpart non-fs 0MB 5MB (parted) set 1 bios_grub on ``` 再切出所需要的File System的分割區(因為我只有一顆硬碟,所以就不區分```/home```與```/```了) :::info 要先確認原本硬碟格式,必須跟舊硬碟相同(目前較通用為ext4)。 ::: ``` (parted) print ``` ``` Model: ATA WDC WD40EFZX-68A (scsi) Disk /dev/sdc: 4001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size Type File system Flags 1 17.4kB 5000kB 4983kB bios_grub 2 5243kB 4001GB 4001GB ext4 ``` 確認分割區都正確,離開```parted``` ``` (parted) q ``` 格式化File System分割區 ```=shell $ sudo mkfs -t ext4 /dev/sdc2 ``` #### UEFI開機 先切出一個的UEFI開機分割區,**格式必須為fat32**。 因為```/dev/sdc```還未有分割區,所以這個分割區應該會為編號1。 ``` (parted) mkpart primary fat32 0MB 512MB (parted) set 1 boot on ``` 再切出所需要的File System的分割區(因為我只有一顆硬碟,所以就不區分```/home```與```/```了) :::info 要先確認原本硬碟格式,必須跟舊硬碟相同(目前較通用為ext4)。 ::: ``` (parted) print ``` ``` Model: ATA WDC WD40EFZX-68A (scsi) Disk /dev/sdc: 4001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size Type File system Flags 1 17.4kB 512MiB 511MiB boot 2 513MiB 4001GB 4000GB ext4 ``` 確認分割區都正確,離開```parted``` ``` (parted) q ``` 格式化UEFI開機分割區 ```=shell $ sudo mkfs.fat -F32 /dev/sdc1 ``` 格式化File System分割區 ```=shell $ sudo mkfs -t ext4 /dev/sdc2 ``` ### 5. 掛載新硬碟到/mnt :::danger 掛載與創建資料夾的順序必須由外而內。 ::: 新建新硬碟目錄並掛載 #### 傳統BIOS開機 ```=shell $ sudo mkdir -pv /mnt/new $ sudo mount /dev/sdc2 /mnt/new ``` #### UEFI開機 ```=shell $ sudo mkdir -pv /mnt/new $ sudo mount /dev/sdc2 /mnt/new $ sudo mkdir -pv /mnt/new/boot/efi $ sudo mount /dev/sdc1 /mnt/new/boot/efi ``` ### 6. 恢復系統與資料 ```=shell $ sudo tar --use-compress-program=pigz -xvpf <path/to/arch-backup.tgz> -C /mnt/new ``` ### 7. 建立壓縮時排除的資料夾 ```=shell $ sudo mkdir -pv /mnt/arch/proc $ sudo mkdir -pv /mnt/arch/sys ``` ### 8. 確認硬碟的UUID ```=shell $ sudo lsblk ``` ### 9. 產生電腦可以自動掛載硬碟的文件 ```=shell $ sudo genfstab -U /mnt/new >> /mnt/new/etc/fstab ``` 確認UUID是否需要修改 ```=shell $ sudo cat /mnt/new/etc/fstab ``` ### 10. 進入新系統中的root ```=shell ### Ubuntu/CentOS $ sudo chroot /mnt/new/ ### Arch Linux $ sudo arch-chroot /mnt/new/ ``` 是否需要修改```/mnt/new/etc/fstab``` :::info 已經進入新系統中的root,路徑不需要再加```/mnt/new```。 ::: ```=shell $ sudo vim /etc/fstab ``` 修改UUID對應的掛載點。 ### 11. 更新Grub引導 還是在```chroot```權限下 #### 傳統BIOS開機 安裝開機文件在新硬碟(```/dev/sdc```)中。 ```=shell $ grub-install --target=i386-pc --recheck /dev/sdc $ grub-mkconfig -o /boot/grub/grub.cfg ``` #### UEFI開機 ```=shell $ grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader=GRUB --recheck $ grub-mkconfig -o /boot/grub/grub.cfg ``` ### 12. 更新```mkinitcpio``` ```=shell $ mkinitcpio -p linux-lts ``` 如果產生問題,改為執行 ```=shell $ mkinitcpio -p linux ``` ### 13. 退出```chroot```權限 ```=shell $ exit ``` ### 14. 取消掛載新硬碟 :::danger 取消掛載的順序必須由內而外。 ::: #### 傳統BIOS開機 ```=shell $ sudo umount /mnt/new ``` #### UEFI開機 ```=shell $ sudo umount /mnt/new/boot/efi $ sudo umount /mnt/new ``` ### 15. 將舊主機關機,新硬碟插入新主機 ```=shell $ sudo shutdown now ``` ### 16. 新主機開機 #### 傳統BIOS開機 需打開CSM才能從舊BIOS開機,參考 https://www.yakuo.com.tw/support/support.php?article_id=11 #### UEFI開機 應該可以直接開機。 ## 踩雷 ### 1. 解壓縮系統到新硬碟之後絕對不能更新系統。 ### 2. ASUS 500系之後的主機板都不支援CSM了,必須要接上獨立顯卡才能從舊BIOS開機,詳情:https://www.asus.com/tw/support/FAQ/1045467/。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.