ubuntu data transfer - hanyong/note GitHub Wiki

ubuntu 数据迁移

工作电脑 (thinkpad x230) 已经使用了 42 个月, 即将光荣退岗。 工作需要经常多开 vm 和 eclipse, 基于硬件性能考虑选择换了 macbook pro。 旧电脑打算自购, 但磁盘需要归还公司, 工作资料需要迁移到新电脑上。 初步想法是 在新电脑上建立一样的分区结构, 然后将数据对拷过去

工作电脑分区结构

我一直用 ubuntu, 最近两年开始用 lvm (逻辑卷管理) 管理分区。 现有电脑分区如下:

observer.hany@ali-59375n:~$ sudo lvs
  LV         VG   Attr       LSize  Pool Origin  Data%  Meta%  Move Log Cpy%Sync Convert
  home       vg   -wi-ao---- 78.15g                                                     
  node1n1    vg   swi-aos--- 10.00g      node2n3 3.21                                   
  node2n3    vg   owi-a-s--- 10.00g                                                     
  repo       vg   -wi-ao---- 40.00g                                                     
  swap       vg   -wi-ao----  8.00g                                                     
  ubu1204    vg   -wi-ao---- 12.00g                                                     
  ubu1604    vg   -wi-ao---- 10.00g                                                     
  ubu1604var vg   -wi-ao----  2.00g                                                     
  win7       vg   owi-aos--- 30.00g                                                     
  win7s01    vg   swi-a-s---  5.00g      win7    66.52                                  
  windata    vg   -wi-ao---- 10.00g                                                     

fstab 配置如下:

observer.hany@ali-59375n:~$ cat /etc/fstab 
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/vg-ubu1604 /               ext4    errors=remount-ro 0       1
/dev/mapper/vg-ubu1604var /var            ext4    defaults        0       2
/dev/mapper/vg-home /home           ext4    defaults        0       2
/dev/mapper/vg-repo /repo           ext4    defaults        0       2
/dev/mapper/vg-ubu1204 /ubu           ext4    defaults        0       2
#UUID=DE1075571075381B /d              ntfs    defaults,umask=007,gid=46 0       0
/dev/mapper/vg-swap none            swap    sw              0       0

咦, 没有 EFI 分区? 天可怜见, 这台老电脑竟然连 EFI 都还不支持(?)。

  • ubu1604ubu1604var 这两个是系统分区 (曾经被 /var/log/ 日志打爆系统盘坑过, 我现在把 /var/ 目录拆分开了)。
  • home, repo 这两个是数据分区。
  • node1n1, win7, windata 是给 vm 用的。
  • 其他都是废弃不要的, 不用迁移。

网络配置

两台电脑都连公司网络, 拷贝可能有点慢, 用一个 usb3 千兆网卡和一根网线直接将两台电脑直连。

TODO: IMG

看一下现有电脑的网络结构:

observer.hany@ali-59375n:~$ ip addr
# ... ...
2: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 3c:97:0e:62:a7:5f brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 84:3a:4b:13:7e:2a brd ff:ff:ff:ff:ff:ff
    inet 30.9.77.144/21 brd 30.9.79.255 scope global dynamic wlp3s0
       valid_lft 3373sec preferred_lft 3373sec
    inet6 fe80::863a:4bff:fe13:7e2a/64 scope link 
       valid_lft forever preferred_lft forever
4: nat0-nic: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master nat0 state DOWN group default qlen 1000
    link/ether ca:8f:95:0e:c0:a2 brd ff:ff:ff:ff:ff:ff
5: nat0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ca:8f:95:0e:c0:a2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global nat0
       valid_lft forever preferred_lft forever
# ... ...

observer.hany@ali-59375n:~$ ip route
default via 30.9.72.1 dev wlp3s0  proto static  metric 600 
10.20.0.6 via 30.9.72.1 dev wlp3s0  proto dhcp  metric 600 
30.9.72.0/21 dev wlp3s0  proto kernel  scope link  src 30.9.77.144  metric 600 
169.254.0.0/16 dev nat0  scope link  metric 1000 
192.168.1.0/24 dev nat0  proto kernel  scope link  src 192.168.1.2 

observer.hany@ali-59375n:~$ brctl show
bridge name	bridge id		STP enabled	interfaces
nat0		8000.ca8f950ec0a2	no		nat0-nic
							vnet0
							vnet1

ubuntu 16.04 换 systemd 后网卡名字变的奇形怪状, enp0s25 是有线网卡 (目前 state DOWN), wlp3s0 是无线网卡 (连着 wifi)。 nat0 是我给本地 vm 和 docker 容器搭的网桥, 192.168.1.0/24 是分给网桥的 IP 段。 vm node1n1 在网桥上搭了 DHCP, 把有线网卡接到网桥上, 远程机器就可以自动配置网络。

observer.hany@ali-59375n:~$ sudo brctl addif nat0 enp0s25

observer.hany@ali-59375n:~$ sudo brctl show
bridge name	bridge id		STP enabled	interfaces
nat0		8000.3c970e62a75f	no		enp0s25
							nat0-nic
							vnet0
							vnet1

observer.hany@ali-59375n:~$ ip link show enp0s25
2: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master nat0 state DOWN mode DEFAULT group default qlen 1000
    link/ether 3c:97:0e:62:a7:5f brd ff:ff:ff:ff:ff:ff

mac 识别不了我的 usb 网卡 (缺少驱动?), 不过我已经在 mac 上装了 ubuntu, 否则 mac 也识别不了 ext4 文件系统, 而且 mac 的 rsync 也用着不放心 (mac 下很多工具有特性差异, 怕踩坑)。 mac 重启到 ubuntu, 有线网络自动连接 OK 。查看网络状态:

hanyong@ali-59375mac:~$ ip addr
# ... ...
2: wlp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 98:01:a7:a8:47:09 brd ff:ff:ff:ff:ff:ff
3: enx001b9e9aa2a7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:1b:9e:9a:a2:a7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.103/24 brd 192.168.1.255 scope global dynamic enx001b9e9aa2a7
       valid_lft 43075sec preferred_lft 43075sec
# ... ...

再看本机:

observer.hany@ali-59375n:~$ ip link show enp0s25 
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master nat0 state UP mode DEFAULT group default qlen 1000
    link/ether 3c:97:0e:62:a7:5f brd ff:ff:ff:ff:ff:ff

可见本机有线网卡连上网络后链路层状态从 state DOWN 变成 state UP

lvm 数据卷迁移

使用 ubuntu-mate 16.04 live cd 启动 mac 机器, 有线网络自动连接后安装 openssh-server, 设置默认用户 ubuntu-mate 密码方便本机登陆上去操作。 设置 sshd 允许 root 使用密码登陆并设置 root 密码, 使 rsync 拷贝文件时对目标机器有完全控制权限。

sudo apt-get install -y openssh-server
sudo passwd $USER
sudo sed -r 's/^PermitRootLogin\b.*$/PermitRootLogin yes/' /etc/ssh/sshd_config -i
sudo systemctl restart ssh
sudo passwd root

设置本机 root 对 mac root 免密码登陆 (使用 ssh key)。 注意 sudo 加 -H 才会使用 root 的 key。

sudo -H ssh-copy-id [email protected]

ssh 到 mac 机器上, 使用 parted 完成分区, 分区结果如下:

ubuntu-mate@ubuntu-mate:~$ sudo parted /dev/sda 'unit GiB  print free'    
Model: ATA APPLE SSD SM0256 (scsi)
Disk /dev/sda: 234GiB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start    End      Size     File system  Name                          Flags
        0.00GiB  0.00GiB  0.00GiB  Free Space
 1      0.00GiB  0.20GiB  0.20GiB  fat32        EFI System Partition          boot, esp
 2      0.20GiB  27.5GiB  27.4GiB  hfs+         mac
 3      27.5GiB  28.2GiB  0.61GiB  hfs+         Recovery HD
        28.2GiB  28.2GiB  0.00GiB  Free Space
 4      28.2GiB  35.6GiB  7.45GiB  fat32        OSXRESERVED                   msftdata
 5      35.6GiB  35.6GiB  0.02GiB               Microsoft reserved partition  msftres
 6      35.6GiB  69.8GiB  34.2GiB  ntfs         Basic data partition          msftdata
 7      69.8GiB  74.0GiB  4.22GiB               windata                       msftdata
 8      74.0GiB  234GiB   160GiB                pv1                           lvm
        234GiB   234GiB   0.00GiB  Free Space

mac 和 win 分了 74GiB, 留给 ubuntu 的只有 160GiB, 看看本机每个卷多大, 使用了多少空间, 以确定目标机器上给每个卷多少空间。

observer.hany@ali-59375n:~$ df -h
文件系统                      容量  已用  可用 已用% 挂载点
udev                          3.8G     0  3.8G    0% /dev
tmpfs                         769M   21M  748M    3% /run
/dev/mapper/vg-ubu1604        9.8G  7.0G  2.3G   76% /
tmpfs                         3.8G  1.5M  3.8G    1% /dev/shm
tmpfs                         5.0M  4.0K  5.0M    1% /run/lock
tmpfs                         3.8G     0  3.8G    0% /sys/fs/cgroup
/dev/mapper/vg-home            77G   48G   26G   65% /home
/dev/mapper/vg-ubu1604var     2.0G  992M  870M   54% /var
/dev/mapper/vg-repo            40G   24G   15G   62% /repo
cgmfs                         100K     0  100K    0% /run/cgmanager/fs
tmpfs                         769M   60K  769M    1% /run/user/1001

创建 lvm 逻辑卷。额, 磁盘空间有限, 基本上每个卷空间都很吃紧, swap 先只给 1g。

sudo vgcreate vg /dev/sda8
sudo lvcreate -n ubu1604 -L 10g vg
sudo lvcreate -n ubu1604var -L 2g vg
sudo lvcreate -n home -L 55g vg
sudo lvcreate -n repo -L 35g vg
sudo lvcreate -n node1n1 -L 10g vg
sudo lvcreate -n win7 -L 30g vg
sudo lvcreate -n windata -L 10g vg
sudo lvcreate -L 1g -n swap vg

创建文件系统。这里要小心, 确认是在 mac 上操作, 一不小心把本机给格了就悲剧了。

sudo mkfs.ext4 /dev/vg/ubu1604
sudo mkfs.ext4 /dev/vg/ubu1604var
sudo mkfs.ext4 /dev/vg/home
sudo mkfs.ext4 /dev/vg/repo

目标机器 (mac) 上把所有卷都挂在 "/x" 下, 方便稍后通过 "/x" 文件夹进行同步。

sudo mkdir -p /x/{ubu1604,ubu1604var,home,repo}
sudo mount {/dev/vg,/x}/ubu1604
sudo mount {/dev/vg,/x}/ubu1604var
sudo mount {/dev/vg,/x}/home
sudo mount {/dev/vg,/x}/repo

本机磁盘我们还在使用, 一边写一边同步会不会有问题? lvm 专门考虑到这个问题, 创建快照将磁盘当前状态保存下来, 使用快照进行同步, 我们就可以一边继续使用本机电脑一边同步数据。 如果同步过程中本机又有修改, 可以稍后再停机同步一次增量数据。 或者本机代码修改提交到 git 仓库, 其他基本没什么修改, 不用再同步。 创建快照?我们有那么多磁盘空间吗?快照采用写时复制技术, 毫秒级创建, 只占用很少的磁盘空间。

sudo lvcreate -L 1g -s -n {s0,vg/}ubu1604
sudo lvcreate -L 1g -s -n {s0,vg/}ubu1604var
sudo lvcreate -L 1g -s -n {s0,vg/}home
sudo lvcreate -L 1g -s -n {s0,vg/}repo

快照卷我们都以 "s0" 开头, 每个卷预留 1g 写时复制空间。 同样, 我们也把快照卷都挂在本机 "/x" 目录下。 挂载快照卷还有个好处, 像 /proc/, '/sys/` 等这些 "运行时" 系统文件自然就不会被同步了。

sudo mkdir -p /x/{ubu1604,ubu1604var,home,repo}
sudo mount {/dev/vg/s0,/x/}ubu1604
sudo mount {/dev/vg/s0,/x/}ubu1604var
sudo mount {/dev/vg/s0,/x/}home
sudo mount {/dev/vg/s0,/x/}repo

离大功告成只差最后一步, df 命令最后确认一次两机数据卷挂载 ok, sudo rsync 测试 ok, 使用 rsync 命令同步 "/x/" 文件夹。

time sudo rsync -av /x/ [email protected]:/x/ -P > a.log &

我们使用 time 计时, 输出重定向到 a.log 避免狂刷终端同时影响速度。 可以在本机 tail a.log 或者到目标机器 df -h 查看同步状态。 经过漫长的等待, 文件拷贝完成。

还有 vm 卷要同步, 如果我们创建两个相同大小的卷, 直接用 dd 命令对拷, 如 "win7" 卷拷贝命令如下:

sudo dd if=/dev/vg/win7 | pv | sudo ssh [email protected] dd of=/dev/vg/win7

中间添加 pv 命令以实时看到拷贝速度, 使用千兆网卡拷贝速度保持在 "100MiB" 左右。 可见使用 dd 对拷不仅信息无损而且速度最快, 但要求两个卷大小一样, 并且不支持增量数据拷贝。

更新系统配置

数据拷贝完, 是否可以直接用拷贝过去的系统启动电脑了呢? 还有一些跟硬件和系统环境相关的配置需要修改。 想了想主要是网卡, 主机名, 磁盘, 文件系统等配置。 确认网络配置和 fstab 没问题后重启。 grub 配置需要更新, 第一次启动先手动调用 grub 加载内核, 启动成功后再执行 update-grub 更新配置。 初步测试系统启动失败, 可能是非 EFI 与 EFI 系统和硬件等的差异。 在 mac 上重装系统后把新的系统内核和 initrd 镜像拷贝到原系统, 控制台有一条 no video 的报错, 但没什么影响, 启动成功。

启动后原有的系统、软件、配置全都还在, 可以开始工作。 换了一套硬件, 软件都没变,但流畅度感觉提升了很多, 系统和数据迁移成功。

⚠️ **GitHub.com Fallback** ⚠️