迁移home目录到新的分区
不少人在安装系统时没有自定义分区,将系统安装在一块硬盘上。如果机器上有另外一块大容量硬盘,那么就不能很好地利用;并且,没有将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
,支持msdos
和gpt
。
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/
注意两点:
-a
选项可以保留文件的用户和用户组等信息,如果没有此选项,属主会变成root
,这样会导致在图形界面登录时循环登录等问题。- 是复制
/home
目录下所有的文件,不是复制整个/home
目录。
这样就把home目录下的文件复制到了新分区:
$ ll /mnt
总用量 20K
drwxr-xr-x 25 jlice jlice 4.0K 11月 18 13:17 jlice
drwx------ 2 root root 16K 11月 18 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