ubuntu data transfer - hanyong/note GitHub Wiki
工作电脑 (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 都还不支持(?)。
-
ubu1604
,ubu1604var
这两个是系统分区 (曾经被/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
。
使用 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 的报错, 但没什么影响, 启动成功。
启动后原有的系统、软件、配置全都还在, 可以开始工作。 换了一套硬件, 软件都没变,但流畅度感觉提升了很多, 系统和数据迁移成功。