2015年6月20日 星期六

使用 rsync 透過網路複製 Linux Server 作業系統

[環境]
遠端:有一台 CentOS 7 的 Linux Server
近端:有一台新的 Server,未安裝作業系統,要做成跟遠端的 Server 一樣。

要將遠端的Server完整複製到近端。


[方法]
  1. 在近端 Server 用 Live CD 開機 (我使用 Arch Linux)。
  2. 使用 Live CD,將近端的新硬碟分割、format、mount。
  3. 使用 rsync,將遠端各掛載區資料複製到近端新硬碟。
  4. 近端 chroot 到掛載的新硬碟。
  5. 修改新硬碟的 /etc/fstab 掛載設定。
  6. 產生新的 GRUB 設定檔,並將 GRUB 寫入新硬碟的開機磁區。

[步驟]
  1. 因為我想將近端的分割區規劃弄得跟遠端一樣,所以先查看遠端 Server 的分割區資訊。
    若想自行重新規畫的話,可不用管遠端  Server 的分割區設定,
    根據自己喜好設定好新硬碟分割區後,可直接跳到複製資料的步驟(步驟12)。
    只須注意新硬碟分割區的可用容量不要比遠端 Server 資料量小,避免空間不夠複製即可。
  2. 登入遠端 server。用 fdisk -l 查看遠端 Server 分割區資訊,可得知
    有兩個分割區:/dev/sda1、/dev/sda2
    LVM 有三個 Logical volume:/dev/mapper/centos-swap、/dev/mapper/centos-root、/dev/mapper/centos-home
    [root@localhost ~]# fdisk -l
    
    Disk /dev/sda: 499.6 GB, 499558383616 bytes, 975699968 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O 大小 (最小/最佳化):512 位元組 / 512 位元組
    Disk label type: dos
    磁碟識別碼:0x00097c5f
    
    所用裝置 開機      開始         結束      區塊   識別號  系統
    /dev/sda1   *        2048     1026047      512000   83  Linux
    /dev/sda2         1026048   975699967   487336960   8e  Linux LVM
    
    Disk /dev/mapper/centos-swap: 8396 MB, 8396996608 bytes, 16400384 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O 大小 (最小/最佳化):512 位元組 / 512 位元組
    
    
    Disk /dev/mapper/centos-root: 53.7 GB, 53687091200 bytes, 104857600 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O 大小 (最小/最佳化):512 位元組 / 512 位元組
    
    
    Disk /dev/mapper/centos-home: 436.9 GB, 436945813504 bytes, 853409792 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O 大小 (最小/最佳化):512 位元組 / 512 位元組
    
  3. 使用 df -h 查看遠端 Server 掛載資訊、已用空間,可得知
    /dev/mapper/centos-root 掛載在 /,已用 5.3 G
    /dev/mapper/centos-home 掛載在 /home,已用 118M
    /dev/sda1 掛載在 /boot,已用 159M
    (tmpfs 是系統暫存所以不處理)
    [root@localhost ~]# df -h
    檔案系統                 容量  已用  可用 已用% 掛載點
    /dev/mapper/centos-root   50G  5.3G   45G   11% /
    devtmpfs                 7.8G     0  7.8G    0% /dev
    tmpfs                    7.8G   92K  7.8G    1% /dev/shm
    tmpfs                    7.8G   25M  7.8G    1% /run
    tmpfs                    7.8G     0  7.8G    0% /sys/fs/cgroup
    /dev/mapper/centos-home  407G  118M  407G    1% /home
    /dev/sda1                497M  159M  339M   32% /boot
  4. 使用 cat /etc/fstab 查看遠端 Server 掛載資訊、分割區種類,可得知
    /dev/mapper/centos-root 掛載在 /,種類為 xfs
    /dev/mapper/centos-home 掛載在 /home,種類為 xfs
    UUID=3cd1f4e1-f0dd-4087-baa7-8a7e9e9066e5 掛載在 /boot (使用 blkid 查看所有UUID,可知此為 /dev/sda1 的 UUID),種類為 xfs
    /dev/mapper/centos-swap 掛載在 swap,種類為 swap
    [root@localhost ~]# cat /etc/fstab
    /dev/mapper/centos-root /                       xfs     defaults        1 1
    UUID=3cd1f4e1-f0dd-4087-baa7-8a7e9e9066e5 /boot                   xfs     defaults        1 2
    /dev/mapper/centos-home /home                   xfs     defaults        1 2
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
  5. 使用 pvdisplay -m 查看遠端 Server 的 LVM 設定。
    Physical volume(物理卷、PV)、Logical volume(邏輯卷、LV)、Volume group(卷組、VG)可得知:
    /dev/sda2 為 Physical volume。
    一個 Volume group(centos) 裡面有三個 Logical volume(swap、home、root)
    [root@localhost ~]# pvdisplay -m
      --- Physical volume ---
      PV Name               /dev/sda2
      VG Name               centos
      PV Size               464.76 GiB / not usable 3.00 MiB
      Allocatable           yes (but full)
      PE Size               4.00 MiB
      Total PE              118978
      Free PE               0
      Allocated PE          118978
      PV UUID               Obj4fL-KTYB-rymB-vKdo-hCB1-qeys-suKqcU
    
      --- Physical Segments ---
      Physical extent 0 to 2001:
        Logical volume      /dev/centos/swap
        Logical extents     0 to 2001
      Physical extent 2002 to 106177:
        Logical volume      /dev/centos/home
        Logical extents     0 to 104175
      Physical extent 106178 to 118977:
        Logical volume      /dev/centos/root
        Logical extents     0 to 12799

  6. 由前面的資料,可總結出遠端 server 硬碟分割區的情況
    /dev/sda1,Linux,xfs,設定為可開機(bootable)
    /dev/sda2,Linux LVM,xfs,/dev/sda2 為 Physical volume,一個 Volume group(centos),三個 Logical volume(swap、home、root)
  7. 用可開機光碟開機後,使用硬碟分割工具(cfdisk 或 fdisk)建立兩個分割區,如下
    /dev/sda1,Linux,設定為可開機(bootable)
    /dev/sda2,Linux LVM
    註:若新硬碟須要先選 GPT、DOS、SGI、SUN 格式(disk labels),我是選 DOS
  8. 新增物理卷(PV)
    分割好硬碟,再來則是在 /dev/sda2 設定 LVM。
    先在 /dev/sda2 建立物理卷(PV)
    pvcreate /dev/sda2
    查看設定結果
    pvdisplay
  9. 新增卷組(VG)
    新增一個名稱為 centos 的 VG
    vgcreate centos /dev/sda2
    查看設定結果
    vgdisplay
  10. 新增邏輯卷(LV)
    在 centos 新增名稱為 swap 的 LV,加上 "-C y" 參數,表示 contiguous
    lvcreate -C y -L 1G centos -n swap
    在 centos 新增名稱為 home 的 LV
    lvcreate -L 500M centos -n home
    在 centos 新增名稱為 root 的 LV
    lvcreate -l +100%FREE centos -n root
    查看設定結果
    lvdisplay
  11. 格式化
    mkfs.xfs /dev/sda1
    mkfs.xfs /dev/centos/root
    mkfs.xfs /dev/centos/home
    mkswap /dev/centos/swap

    (其他 swapon -va 沒用到)
  12. 複製遠端 server 根目錄 "/" 掛載區的內容到近端新硬碟
    將 dev/centos/root 掛載在 /mnt/ 底下
    mount /dev/centos/root /mnt
    使用 rsync 複製遠端 server 裡面根目錄"/"掛載區的內容(-e "ssh -p 7000" 指定使用 ssh 傳輸,ssh port為 7000)
    rsync -xa -e "ssh -p 7000" root@遠端IP:/ /mnt/
  13. 複製完根目錄,應該會發現 /mnt/boot/、/mnt/home/ 兩個掛載區都是空的,這是因為不同的掛載區須分別複製。
    先將 dev/centos/boot 掛載在 /mnt/boot/ 底下
    mount /dev/sda1 /mnt/boot
    使用 rsync 複製遠端 server 裡面"/boot/"掛載區的內容
    rsync -xa -e "ssh -p 7000" root@遠端IP:/boot/ /mnt/boot/
    將 dev/centos/home 掛載在 /mnt/home/ 底下
    mount /dev/centos/home /mnt/home
    使用 rsync 複製遠端 server 裡面"/home/"掛載區的內容
    rsync -xa -e "ssh -p 7000" root@遠端IP:/home/ /mnt/home/
  14. chroot 到 /mnt,用複製回來的環境操作
    arch-chroot /mnt
  15. 修改 /etc/fstab,改為新硬碟的設定
    雖然,前面已經將分割區設定,設成跟遠端主機硬碟一樣,但複製回來的遠端主機 fstab 檔,裡面有 UUID 設定,須改成近端新硬碟分割區的 UUID(可使用 blkid 查看 UUID),或改成傳統的寫法 /dev/sda1,
    編輯 /etc/fstab
    cp /etc/fstab /etc/fstab.bak
    vi /etc/fstab
    UUID=3cd1f4e1-f0dd-4087-baa7-8a7e9e9066e5 /boot                   xfs     defaults        1 2
    改成
    /dev/sda1 /boot                   xfs     defaults        1 2
  16. 將 GRUB 寫入開機磁區
    備份
    cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
    產生新 grub 設定
    /usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
    寫入開機磁區
    /usr/sbin/grub2-install /dev/sda
    註:
    若沒產生新的grub設定,應該會出現 error no such device:....(一串UUID)....,可能還是可以開機,這是因為 /boot/grub2/grub.cfg 裡面也記錄了舊的 UUID=3cd1f4e1-f0dd-4087-baa7-8a7e9e9066e5
  17. 完成,即可使用新硬碟開機。
  18. 若有用 SeLinux,可能會沒辦法登入,須照忘記密碼處理方式重設root密碼

註1:另一種可能沒很乾淨的複製方式。
近端先裝跟遠端相同版本的作業系統,登入近端後,將近端 /etc/fstab 備份起來。
然後複製遠端的  /、/home 資料到近端,但不要複製 /boot 和暫存資料,複製回來後,再將備份的 /etc/fstab 覆蓋回來,即可。

參考:
Copy running Linux systems to other machines over network
How to fix the UUID in Grub after restore from another machine?
在CentOS/RHEL 7上如何借助系统存储管理器管理LVM卷?
Linux有问必答:如何扩展XFS文件系统 
LVM (简体中文) - ArchWiki
儲存空間管理與動態擴充-LVM
lvcreate

2 則留言:

  1. 您好 請教一下個問題,關於arch-chroot 這指令沒辦法使用的問題
    是否使用arch linux光碟開機,預設並沒有這指令可以用嗎?

    回覆刪除
    回覆
    1. 您好,是顯示找不到指令嗎?
      可以找一下放指令的資料夾看有沒有,如果有,嘗試用打完整路徑執行看看。
      我也是用光碟開機,有此指令可用。

      刪除