跳到主要内容

迁移home目录到新的分区

· 阅读需 10 分钟

不少人在安装系统时没有自定义分区,将系统安装在一块硬盘上。如果机器上有另外一块大容量硬盘,那么就不能很好地利用;并且,没有将home目录挂载到单独的硬盘,会导致重装系统时覆盖home目录而丢失数据。此时,可以把home目录挂载到单独的硬盘,注意数据的迁移。

使用虚拟机来演示,在初始时查看挂载情况:

$ df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
udev devtmpfs 967M 0 967M 0% /dev
tmpfs tmpfs 200M 3.6M 196M 2% /run
/dev/sda1 ext4 18G 4.7G 13G 28% /
tmpfs tmpfs 997M 84K 997M 1% /dev/shm
tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs tmpfs 997M 0 997M 0% /sys/fs/cgroup
tmpfs tmpfs 200M 32K 200M 1% /run/user/1000

可以看到/home没有单独挂载。

虚拟机关机,在设置里添加一块新硬盘:

虚拟机开机,查看磁盘分区情况:

$ sudo fdisk -l
[sudo] jlice 的密码:
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4e5e418d

设备 启动 Start 末尾 扇区 Size Id 类型
/dev/sda1 * 2048 37748735 37746688 18G 83 Linux
/dev/sda2 37750782 41940991 4190210 2G 5 扩展
/dev/sda5 37750784 41940991 4190208 2G 82 Linux 交换 / Solaris

Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

可以看到我们刚才添加的硬盘(/dev/sdb),不过还没有分区,需要先进行分区。

本文操作的硬盘设备名根据实际情况修改

分区

使用gparted分区

如果有图形界面,但对分区操作不熟悉,可以使用gparted来进行操作。如果没有安装gparted可以安装:

$ sudo apt install gparted

gparted的界面如下:

工具栏右侧可以切换硬盘设备。如果新建分区提示没有分区表,可以选择设备>创建分区表。msdos限制分区最大为2T,如果你的硬盘大于2T,建议使用gpt。注意,更改分区表会丢失硬盘上的全部数据。

然后创建分区:

文件系统目前用的多的是ext4。不过,xfs逐渐成为主流,如果xfs选项是灰的,需要安装xfsprogs

$ sudo apt install xfsprogs

然后重启gparted即可使用xfs

然后点对勾执行分区操作:

使用parted分区

不过,如果没有图形界面,就要使用命令行来分区了。如果是msdos分区表,可以使用fdisk,或者cfdisk(更易操作)。而parted,支持msdosgpt

parted也可以看分区情况:

$ sudo parted -l      
Model: ATA VBOX HARDDISK (scsi)
磁盘 /dev/sda: 21.5GB
Sector size (logical/physical): 512B/512B
分区表:msdos
Disk Flags:

数字 开始: End 大小 类型 文件系统 标志
1 1049kB 19.3GB 19.3GB primary ext4 启动
2 19.3GB 21.5GB 2145MB extended
5 19.3GB 21.5GB 2145MB logical linux-swap(v1)

Model: ATA VBOX HARDDISK (scsi)
磁盘 /dev/sdb: 10.7GB
Sector size (logical/physical): 512B/512B
分区表:msdos
Disk Flags:

数字 开始: End 大小 类型 文件系统 标志

parted支持交互式操作,例如操作/dev/sdb

$ sudo parted /dev/sdb
GNU Parted 3.2
使用 /dev/sdb
欢迎使用 GNU Parted! 输入 'help'可获得命令列表.
(parted)

创建gpt分区表:

(parted) mktable                                                          
新的磁盘标签类型? gpt
警告: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do
you want to continue

是/Yes/否/No? y

创建分区:

(parted) mkpart                                                           
分区名称? []?
文件系统类型? [ext2]? ext4
起始点? 1
结束点? 100%

这里使用ext4文件系统,使用整个硬盘作为分区,可以根据情况改动。从性能角度考虑,起始点一般不设为0,如果设为0会警告:

The resulting partition is not properly aligned for best performance.

操作完成后,按Ctrl+D退出parted

然后通过

$ sudo fdisk -l

可以查分区名,也就是磁盘名+分区编号。然后格式化分区(根据实际情况选择相应的分区进行格式化):

$ sudo mkfs.ext4 /dev/sdb1

如要格式化为xfs,可以使用mkfs.xfs命令,注意要先安装xfsprogs

迁移数据

之后就需要将/home里的数据迁移到新的分区了。为此,需要先挂载分区。所谓挂载,就是给分区一个访问的路径。挂载上面建立的新分区(分区名根据实际修改)到/mnt(也可以新建一个目录挂载,这里只是临时挂载):

$ sudo mount /dev/sdb1 /mnt

将home下面的数据复制到新分区的挂载点/mnt:

$ sudo cp -a /home/* /mnt/

注意两点:

  1. -a选项可以保留文件的用户和用户组等信息,如果没有此选项,属主会变成root,这样会导致在图形界面登录时循环登录等问题。
  2. 是复制/home目录下所有的文件,不是复制整个/home目录。

这样就把home目录下的文件复制到了新分区:

$ ll /mnt
总用量 20K
drwxr-xr-x 25 jlice jlice 4.0K 1118 13:17 jlice
drwx------ 2 root root 16K 1118 13:10 lost+found

可以使用umount取消挂载:

$ sudo umount /mnt

修改fstab

查询分区的UUID:

$ sudo blkid   
/dev/sda1: UUID="56dbd416-9b43-4bb0-bbf7-a6ba1d071fe4" TYPE="ext4" PARTUUID="4e5e418d-01"
/dev/sda5: UUID="f98c2bc0-70eb-4044-81c9-13fcb27b40ee" TYPE="swap" PARTUUID="4e5e418d-05"
/dev/sdb1: UUID="dc081a00-b512-4804-9349-39b03aa02341" TYPE="ext4" PARTUUID="dfe32657-50fe-4d06-b96f-1d57ea69aaab"

记下新分区的UUID。然后修改/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>
# / was on /dev/sda1 during installation
UUID=56dbd416-9b43-4bb0-bbf7-a6ba1d071fe4 / ext4 errors=remount-ro 0 1
# swap was on /dev/sda5 during installation
UUID=f98c2bc0-70eb-4044-81c9-13fcb27b40ee none swap sw 0 0
UUID=dc081a00-b512-4804-9349-39b03aa02341 /home ext4 defaults 0 2

/etc/fstab添加最后一行(UUID根据blkid的结果修改)。

fstab用于配置开机自动挂载。共有6列: 第1列是分区标识,一般使用UUID。也可以使用分区名(如:/dev/sdb1)或label;第2列是挂载点;第3列是文件系统;第4列是选项;第5列一般设为0,第6列一般/设为0,交换分区和/tmp设为0,其余一般设为2。

关于fstab详见:fstab - ArchWiki

如果就这样重启,/home将在新分区上,之前的/home就访问不到了。如果之前的/home上的数据很少,可以不用管,否则就需要删除之前的/home上的数据了。由于用户已登录系统,需要用到/home,所以需要切换到单用户模式,这样才可以对/home进行操作。

切换到单用户模式:

$ sudo init 1

按Enter继续,此时可以使用root进行操作。root用户的家目录是/root,可以操作/home而不受影响。

首先可以看到/home成功挂载到了新分区,为此,先取消挂载/home。然后将/home重命名或删除,图中为重命名,可以待之后确认一切无误后再删除。然后创建/home目录,然后将新分区挂载到/home

之后运行reboot重启。

重启之后,可以看到/home已迁移到新分区了:

$ df -Th       
文件系统 类型 容量 已用 可用 已用% 挂载点
udev devtmpfs 967M 0 967M 0% /dev
tmpfs tmpfs 200M 3.6M 196M 2% /run
/dev/sda1 ext4 18G 4.8G 12G 29% /
tmpfs tmpfs 997M 140K 997M 1% /dev/shm
tmpfs tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs tmpfs 997M 0 997M 0% /sys/fs/cgroup
/dev/sdb1 ext4 9.8G 175M 9.1G 2% /home
tmpfs tmpfs 200M 32K 200M 1% /run/user/1000