使用到的软件
-
Linux LiveCD
:本文使用的 archlinux -
rsync
:同步系统文件 -
lsblk、parted、mkfs
:硬盘分区工具 -
grub
:系统引导工具
预先准备
注意:接入设备的时候,输入源(待拷贝系统)最好接入在主板 SATA 或者 Nvme 口上,拷贝速度更快。
硬盘分区
- 使用
lsblk
查看分区情况,粗略区分输入源、输出源、LiveCD的硬盘,如/dev/sda
,/dev/sdb
此类信息 - 使用
parted
查看输入源分区详情,如输入源为sda
参考命令为parted /dev/sda
,主要关注内容为:分区的label(gpt,msdos),有几个分区,各分区的起止位置,分区的文件系统类型 - 查看系统是否为 UEFI 启动:参考命令
ls /sys/firmware/efi/efivars
,如果有内容则为UEFI
启动,parted
选择mklabel gpt
;没有此目录或者为空则为BIOS
,parted
选择mklabel msdos
- 记住之前输入源的分区信息,然后使用
parted
进入输出源硬盘,例如输出源为sdb
:parted /dev/sdb
- 开始分区,以
msdos
为例,有两个分区:系统分区以及swap
分区,硬盘总大小为 64GB, 内存为 4G
# 进入输出源硬盘
parted /dev/sdb
# 标记分区类型
mklabel msdos
# 分配系统分区
mkpart 1 primary ext4 2M 58G
# 设置分区1为启动分区
set boot 1 on
# 分配swap分区
mkpart 2 primary linux-swap 58G 100%
# 退出 parted
q
- 格式化分区,
parted
只是构建分区表信息,格式化需要手动执行,接上面代码格式化分区
# 格式化 ext4
mkfs.ext4 /dev/sdb1
# 格式化 swap 分区
mkswap /dev/sdb2
# 激活 swap 分区
swapon /dev/sdb2
至此,硬盘分区完成;接下来就使用 rsync
复制硬盘数据吧
拷贝系统
- 首先挂载输入源和输出源
# 挂载输入源到 /root/media
mount /dev/sda1 /root/media
# 挂载输出源到 /mnt
mount /dev/sdb1 /mnt
- 使用
rsync
拷贝系统,使用-a
选项可以保留文件的属性信息,并保留软连接。使用-v
选项可以查看拷贝的日志,但是会大大降低拷贝速度。拷贝时需要使用--exclude=XXX
过滤掉一些特殊的系统文件夹,此参数的路径是相对于输入源的路径,使用时需要注意,参考指令如下:
# rysnc 命令格式
rsync [OPTION...] SRC... [DEST]
# 从输入源拷贝系统至输出源,注意 /root/media/ 的 / 必须有, /mnt 没有 /
rsync -a /root/media/ --exclude=proc/ --exclude=lost+found/ --exclude=tmp/ --exclude=sys/ --exclude=media/ --exclude=mnt/ /mnt
- 创建系统文件夹,使用脚本
genfstab
更新硬盘分区表,这个是Archlinux LiveCD
才有的,如果没有可以自己手动写入
# 创建文件夹
for dir in /proc /tmp /sys/ /media /mnt
do
mkdir /mnt$dir
done
# 生成磁盘分区表,-U 为使用 UUID 的形式
genfstab -U /mnt > /mnt/etc/fstab
重建引导(Grub)
- 在上一小节,已经拷贝完系统并生成了磁盘分区表,此时新的系统还是启动不了的,需要更新
Grub
的配置文件中的磁盘UUID信息,具体使用grub-mkconfig
命令即可 - 首先需要挂载系统文件夹到新系统,然后使用
chroot
切换到新系统下生成引导信息
# 挂载系统文件夹到新系统
mount /proc -t proc -o nosuid,noexec,nodev /mnt/proc
mount /sys -t sysfs -o nosuid,noexec,nodev,ro /mnt/sys
mount /dev -t devtmpfs -o mode=0755,nosuid /mnt/dev
mount /dev/pts -t devpts -o mode=0620,gid=5,nosuid,noexec /mnt/dev/pts
mount /dev/shm -t tmpfs -o mode=1777,nosuid,nodev /mnt/dev/shm
mount /run -t tmpfs -o nosuid,nodev,mode=0755 /mnt/run
mount /tmp -t tmpfs -o mode=1777,strictatime,nodev,nosuid /mnt/tmp
# 切换到新系统
chroot /mnt /bin/bash
# 如果出现 ls 等命令都无法使用的情况,更新环境变量
export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
# 生成 grub 引导,/dev/sdb1 为新系统所在分区,具体以 lsblk 为准
grub-install --target=i386-pc /dev/sdb1
grub-mkconfig -o /boot/grub/grub.cfg
- 全部操作完成,新系统已拷贝完成,退出
chroot
环境, 卸载已挂载分区,重启电脑即可
# 退出 chroot (也可ctrl+d)
exit
# 卸载分区,随手释放资源好习惯
umount -R /mnt
umount -R /root/media
# 重启验证
reboot
附加
以上命令写成了 shell
脚本,按需修改使用即可