Linux 远程Ubuntu服务器扩展硬盘后,将/home目录移动到新的硬盘空间上(把新硬盘的分区挂载到/home目录) 教程
目录
一、拾枝杂谈
1.前言:
2.df -h命令 和 lsblk命令的区别?
3.什么是loop设备?
4.将新分区挂载到 /home 的前提条件:
二、将新分区挂载到 /home 的具体挂载步骤
1.对新硬盘进行分区:
1.1 启动 parted 工具
1.2 创建GPT分区表
1.3 创建新分区
1.4 查看分区表并退出
2.格式化新分区为ext4系统:
3.进行数据迁移:
4.更改系统配置以使用新的 /home 分区:
5.重启后的二次验证:
Δ总结
一、拾枝杂谈
1.前言:
起因是up 通过 df -h 命令查看了一下远程Linux服务器的文件系统的使用情况,如下图所示:
udev, tmpfs 都是内存文件系统,我们不去管他。注意看,/dev/nvme0n1p2 挂载到了 根目录/,而我们的 /home 目录就在 根目录/ 下。/dev/nvme0n1p2 这个文件系统的空间很大,有900多G,但是使用率已经来到90%,这是空间不足的标志!所以up 想的是将 /home 目录进行移动,以缓解 /分区 空间不足的问题。
2.df -h命令 和 lsblk命令的区别?
df -h 命令主要关注文件系统 (filesystem) 的信息,特别是它们已用 和 可用空间 的情况,它显示的是文件系统在挂载点上的使用情况。挂载点是指文件系统被挂载到的目录。
lsblk 命令主要关注块设备 (block devices) 的信息。块设备是指可以随机访问的固定大小数据块的设备,例如硬盘、SSD、USB 驱动器、CD/DVD-ROM 等。lsblk 显示的是物理或虚拟的存储设备 及其 分区结构。lsblk命令的使用如下图所示:
可以看到,我们有一块可用的21T的物理硬盘sda,没有分区,也没有挂载,这表示这块硬盘是未使用的,或者需要进一步配置(分区、格式化、挂载)才能使用。那岂不是可以正好用来放/home目录?
这里顺便解释一下 lsblk 命令的输出结果中,最上面一行的意思——
(1) NAME : 表示设备的名词(例如sda, nvme0n1, loop0 等)
(2) MAJ : MIN : 表示设备的主 / 次设备号
(3) RM : 是否是可移动设备(1表示是,0表示否)
(4) SIZE : 设备的总大小
(5) RO : 是否是只读设备(1表示是,0表示否)
(6) TYPE : 设备的类型(disk 表示整个硬盘,part 表示分区,loop 表示循环设备)
(7) MOUNTPOINT : 设备的挂载点,就是具体的Linux目录(如果已经挂载的话)。Δ注意:MOUNTPOINT 显示的是分区被挂载到的目录,而不是整个物理硬盘的挂载点。如果一个物理硬盘没有分区,或者分区没有被挂载,那么 MOUNTPOINT 列就会显示为空白。
3.什么是loop设备?
loop类型表示 它不是一个独立的物理磁盘(如 SSD 或 HDD),而是一种虚拟设备。它允许我们将一个文件(通常是一个磁盘镜像文件,或像 Snap 包这样的自包含应用镜像)当作一个块设备来挂载,它的空间是来自现有的物理磁盘。
以up 操作的这台Ubuntu服务器为例,loop 设备实际上是存储在 /dev/nvme0n1p2 这个 NVMe SSD 分区上的。每个 loop 设备对应一个 Snap 包的镜像文件,这些文件占据了 SSD 空间。
Snap 是 Ubuntu 推出的一种软件包管理系统,它将应用程序及其所有依赖项打包在一个独立的、隔离的容器中。为了实现这种隔离和只读性,Snap 包通常会以一个只读的镜像文件形式存在。当我们运行一个 Snap 应用时,这个镜像文件会被挂载为一个 loop 设备。这样,应用程序就可以在一个独立的文件系统环境中运行,不会干扰系统的其他部分。
我们之所以在 df -h 中看到这些 loop 设备显示 100% 已用,是因为它们是固定大小的镜像文件,被挂载后就显示为完全占用其自身容量。
4.将新分区挂载到 /home 的前提条件:
- 拥有 sudo 权限。
- 新的硬盘目前是未分区、未使用的状态。
- 已经备份了 /home 目录下的所有重要数据。
二、将新分区挂载到 /home 的具体挂载步骤
1.对新硬盘进行分区:
1.1 启动 parted 工具
推荐使用 parted 工具来分区,因为它更现代而且对大容量硬盘的支持更好。首先我们启动 parted工具,指令如下:
sudo parted /dev/sda
注意1: 如果提示 The disk /dev/sda contains an MBR label; the size is 22TB, which is bigger than 2TB. Use GPT.,要选择 Yes 转换成 GPT 分区表。GPT 是支持 2TB 以上硬盘容量的现代分区表格式。
注意2:如果提示 Error: The backup GPT table is corrupt, but the primary appears OK, so that will be used. OK/Cancel?,要选择 OK。
1.2 创建GPT分区表
指令如下 (这会擦除磁盘上现有的分区表。一定要确认操作的是不是目标磁盘):
mklabel gpt
1.3 创建新分区
使用 parted 工具 /dev/sda 硬盘上创建一个占据整个硬盘的单一分区。具体命令如下:
mkpart primary ext4 0% 100%
由于这是这块硬盘上的第一个分区,Linux 系统会自动将其命名为 /dev/sda1。对于上面这条命令——
(1) mkpart : 表示创建分区。
(2) primary : 表示分区类型(在GPT分区表中通常是 primary)
(3) ext4 : 表示文件系统类型是ext4
(4) 0% : 表示要创建的这个分区从硬盘的 0% 位置开始。
(5) 100% : 表示分区到磁盘的 100% 位置结束,即使用所有的可用空间。
1.4 查看分区表并退出
命令如下:
print
# 确认创建了一个名为 /dev/sda1 的分区,并且大小是 21.9 TB。
quit
print 命令的效果,如下图所示:
2.格式化新分区为ext4系统:
第二步我们需要将新创建的分区 /dev/sda1 格式化为 ext4 文件系统。命令如下:
sudo mkfs.ext4 /dev/sda1
mkfs.ext4 命令会创建文件系统,并自动检查坏块。mkfs.ext4 命令的执行效果如下图所示:
3.进行数据迁移:
在将新分区挂载到 /home 之前,我们需要将旧 /home 目录中的所有数据迁移到新分区,这是很有必要的。
先创建一个临时挂载点,命令如下:
sudo mkdir /mnt/newhome
然后将新分区挂载到 /mnt/newhome 下,命令如下:
sudo mount /dev/sda1 /mnt/newhome
接着,使用 df -h 命令来验证新分区是否挂载成功:
df -h /mnt/newhome
验证结果如下图所示:
继续,迁移旧的 /home 目录的数据,我们要使用 rsync 命令(rsync命令是一个非常强大的文件同步工具,可以保留文件权限、所有者、时间戳等属性。)。具体命令如下:
sudo rsync -avx /home/ /mnt/newhome/
对rsync 命令进行一下说明——
(1) -a 表示归档模式,保留权限、所有者、时间戳、符号链接等。
(2) -v 表示详细模式,显示传输进度。
(3) -x 表示保持在当前文件系统,这是为了防止 rsync 跨越文件系统边界(例如,避免复制 /home 下的任何其他挂载点)
(4) /home/ : 后面还带有一个斜杠/,是为了表示复制 /home 目录里面的所有内容,而不是复制 /home 目录本身,目标目录 /mnt/newhome/ 也带有一个斜杠/,同样表示将内容复制到该目录的里面。
PS : 命令执行实际的长短,具体取决于 /home 目录的大小。
迁移完成后,要进行数据验证,比较旧 /home 和新 /mnt/newhome 的内容和大小,以确保数据完整性,验证命令如下:
sudo du -sh /home/
sudo du -sh /mnt/newhome/
# 两个命令的输出大小应该大致相同。
sudo ls -la /home/
sudo ls -la /mnt/newhome/
# 检查文件列表是否一致。
数据验证结果,如下图所示:
4.更改系统配置以使用新的 /home 分区:
现在数据已经成功迁移,我们需要告诉系统在启动时将新分区挂载到 /home 目录。
首先,卸载之前创建的临时挂载点,命令如下:
sudo umount /mnt/newhome
然后,对旧的 /home 进行备份,为了安全起见,此处up仅是将旧的 /home 目录重命名,而不是直接删除。命令如下:
sudo mv /home /old_home_backup
由于我们将原有的 /home 目录重命名为了 /old_home_backup。因此,当前的 / 文件系统下,已经没有名为 /home 的目录了,所以我们需要在 / 文件系统下创建一个空的 /home 目录作为挂载点,我们将会把新分区sda1挂载到这个新的 /home 目录。(没有这一步后面会报错)
sudo mkdir /home
接着,获取新分区的UUID(一定要把它保存下来),命令如下:
sudo blkid /dev/sda1
继续,使用 vim 编辑 /etc/fstab 配置文件,这个文件定义了系统启动时自动挂载的文件系统。我们将要在这个配置文件下,将创建的新分区挂载后新的 /home目录,命令如下(此处要小心):
sudo vim /etc/fstab
通过 vim 进入配置文件后,默认在普通模式下,可以按键盘上的大写字母 G (即 Shift + g)。光标会立即跳到文件的最后一行。在普通模式下,按键盘上的小写字母 o。这会在当前行下方插入一个新行,并将 vim 切换到插入模式。
在插入模式下输入命令:(UUID替换成新分区的UUID)
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /home ext4 defaults 0 2
输入完内容后,保存并退出 /etc/fstab。按键盘上的 Esc 键。这会将 vim 切换回普通模式。在普通模式下,输入 :wq (冒号,然后 wq),然后按回车,其中“冒号:”表示进入命令行模式,“w”表示写入(保存)文件,“q”表示退出vim。
再来解释一下这个命令——
(1) UUID:就是刚才获取到的新分区的UUID。
(2) /home : 挂载点
(3) ext4 : 文件系统类型
(4) defaults : 标准挂载选项(rw, suid, dev, exec, auto, nouser, async)
(5) 0:不进行备份
(6) 2 : 在根文件系统之后进行文件系统检查
好的,挂载成功后,我们先测试一下 /etc/fstab 的配置是否正确,以避免系统无法启动。命令如下:
sudo mount -a
如果没有任何错误输出,说明 fstab 配置是正确的。
继续,验证新的 /home 挂载,并重启系统,命令如下:
df -h /home
sudo reboot # 重启系统也需要时间,期间可以尝试重启 Xshell 刷新一下。
新的 /home 挂载 的测试结果如下图所示:
5.重启后的二次验证:
重启系统后,我们最好再次验证 /home 的挂载情况,如下图所示:
然后,验证自己的用户主目录,确认之前的文件和数据都在,命令如下:
ls -la ~
最后,在确认一切妥当之后,我们可以删除旧的 /home 备份, 即之前创建的 /old_home_backup 目录,以达到我们最初“释放空间”的目的。命令如下:
sudo rm -rf /old_home_backup
对于这个命令——
(1) sudo : 表示以管理员权限执行命令;
(2) rm : 表示删除命令;
(3) -r : 递归删除,用于删除目录及其所有内容。
(4) -f : 强制删除,不提示确认。
这个命令会永久删除 /old_home_backup 目录及其所有内容,无法恢复。
此时我们再通过 df -h 命令查看文件系统的使用情况,如下图所示:
可以看到,原来的使用率 90% 变成了使用率 30%,直接为我们腾挪出了500多G的高速可用空间。呜呼!
Δ总结
- 🆗,以上就是本文的全部内容了,感谢阅读!
- 总结一下,新安装的硬盘必须先经过分区和格式化才可以使用。因为一个原始的、未分区、未格式化的硬盘,操作系统无法识别其文件系统结构,也就无法在其上创建、读取或写入文件。
- 与其说是“把/home目录移动到新的硬盘上”,不如说是“把新硬盘上面的某个分区(我们这里只创建了一个分区/dev/sda1)挂载到/home目录下”。我们挂载的不是整个物理硬盘,而是硬盘上的一个已经创建了文件系统的分区。这很好地体现了LInux “一切皆文件” 的思想!
- “一切皆文件” 强调的是所有系统资源都通过文件接口来访问,而文件系统目录结构(文件系统层次结构)正是这些“文件”的组织方式。可以说,文件系统层次结构在 Linux 中具有至高无上的地位,它是用户和程序与系统交互的统一视图。
- 后面如果还有 EmoLLM 相关的创作思路或者Ubuntu服务器的相关问题,up还会尝试与大家分享,谢谢大家。