Linux 远程Ubuntu服务器扩展硬盘后,将/home目录移动到新的硬盘空间上(把新硬盘的分区挂载到/home目录) 教程

目录

一、拾枝杂谈

1.前言:

[2.df -h命令 和 lsblk命令的区别?](#2.df -h命令 和 lsblk命令的区别?)

3.什么是loop设备?

[4.将新分区挂载到 /home 的前提条件:](#4.将新分区挂载到 /home 的前提条件:)

[二、将新分区挂载到 /home 的具体挂载步骤](#二、将新分区挂载到 /home 的具体挂载步骤)

1.对新硬盘进行分区:

[1.1 启动 parted 工具](#1.1 启动 parted 工具)

[1.2 创建GPT分区表](#1.2 创建GPT分区表)

[1.3 创建新分区](#1.3 创建新分区)

[1.4 查看分区表并退出](#1.4 查看分区表并退出)

2.格式化新分区为ext4系统:

3.进行数据迁移:

[4.更改系统配置以使用新的 /home 分区:](#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 的前提条件:

  1. 拥有 sudo权限。
  2. 新的硬盘目前是未分区、未使用的状态。
  3. 已经备份了 /home 目录下的所有重要数据。

二、将新分区挂载到 /home 的具体挂载步骤

1.对新硬盘进行分区:

1.1 启动 parted 工具

推荐使用 parted 工具来分区,因为它更现代而且对大容量硬盘的支持更好。首先我们启动 parted工具,指令如下:

bash 复制代码
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分区表

指令如下 (这会擦除磁盘上现有的分区表。一定要确认操作的是不是目标磁盘):

bash 复制代码
mklabel gpt

1.3 创建新分区

使用 parted工具 /dev/sda 硬盘上创建一个占据整个硬盘的单一分区具体命令如下:

bash 复制代码
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 查看分区表并退出

命令如下:

bash 复制代码
print
# 确认创建了一个名为 /dev/sda1 的分区,并且大小是 21.9 TB。
quit

print 命令的效果,如下图所示:

2.格式化新分区为ext4系统:

第二步我们需要将新创建的分区 /dev/sda1 格式化为 ext4 文件系统命令如下:

bash 复制代码
sudo mkfs.ext4 /dev/sda1

mkfs.ext4 命令会创建文件系统,并自动检查坏块。mkfs.ext4 命令的执行效果如下图所示:

3.进行数据迁移:

在将新分区挂载到 /home 之前,我们需要将旧 /home 目录中的所有数据迁移到新分区,这是很有必要的。

先创建一个临时挂载点,命令如下:

bash 复制代码
sudo mkdir /mnt/newhome

然后将新分区挂载到 /mnt/newhome 下,命令如下:

bash 复制代码
sudo mount /dev/sda1 /mnt/newhome

接着,使用 df -h 命令来验证新分区是否挂载成功

bash 复制代码
df -h /mnt/newhome

验证结果如下图所示:

继续,迁移旧的 /home 目录的数据,我们要使用 rsync 命令(rsync命令是一个非常强大的文件同步工具,可以保留文件权限、所有者、时间戳等属性。)。具体命令如下:

bash 复制代码
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 的内容和大小,以确保数据完整性,验证命令如下:

bash 复制代码
sudo du -sh /home/
sudo du -sh /mnt/newhome/
# 两个命令的输出大小应该大致相同。
sudo ls -la /home/
sudo ls -la /mnt/newhome/
# 检查文件列表是否一致。

数据验证结果,如下图所示:


4.更改系统配置以使用新的 /home 分区:

现在数据已经成功迁移,我们需要告诉系统在启动时将新分区挂载到 /home 目录。

首先,卸载之前创建的临时挂载点命令如下:

bash 复制代码
sudo umount /mnt/newhome

然后,对旧的 /home 进行备份,为了安全起见,此处up仅是将旧的 /home 目录重命名 ,而不是直接删除。命令如下:

bash 复制代码
sudo mv /home /old_home_backup

由于我们将原有的 /home 目录重命名为了 /old_home_backup。因此,当前的 / 文件系统下,已经没有名为 /home 的目录了,所以我们需要**在 / 文件系统下创建一个空的 /home 目录作为挂载点,**我们将会把新分区sda1挂载到这个新的 /home 目录。(没有这一步后面会报错)

bash 复制代码
sudo mkdir /home

接着,获取新分区的UUID(一定要把它保存下来)命令如下:

bash 复制代码
sudo blkid /dev/sda1

继续,使用vim编辑**/etc/fstab****配置文件**,这个文件定义了系统启动时自动挂载的文件系统。我们将要在这个配置文件下,将创建的新分区挂载后新的 /home目录,命令如下(此处要小心):

bash 复制代码
sudo vim /etc/fstab

通过 vim进入配置文件后,默认在普通模式 下,可以按键盘上的大写字母 G (即 Shift + g)。光标会立即跳到文件的最后一行 。在普通模式下,按键盘上的小写字母 o 。这会在当前行下方插入一个新行 ,并将 vim 切换到插入模式

在插入模式下输入命令:(UUID替换成新分区的UUID)

bash 复制代码
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的配置是否正确,以避免系统无法启动。命令如下:

bash 复制代码
sudo mount -a

++如果没有任何错误输出,说明 fstab 配置是正确的++ 。

继续,验证新的 /home 挂载,并重启系统命令如下:

bash 复制代码
df -h /home
sudo reboot    # 重启系统也需要时间,期间可以尝试重启 Xshell 刷新一下。

新的 /home 挂载 的测试结果如下图所示:

5.重启后的二次验证:

重启系统后,我们最好再次验证 /home 的挂载情况,如下图所示:

然后,验证自己的用户主目录,确认之前的文件和数据都在,命令如下:

bash 复制代码
ls -la ~

最后,在确认一切妥当之后,我们可以删除旧的 /home 备份, 即之前创建的 /old_home_backup 目录,以达到我们最初"释放空间"的目的。命令如下:

bash 复制代码
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还会尝试与大家分享,谢谢大家。
相关推荐
_dindong3 小时前
Linux网络编程:Socket编程TCP
linux·服务器·网络·笔记·学习·tcp/ip
七宝大爷3 小时前
深度解析英伟达DGX与HGX服务器——从架构差异到场景选择
运维·服务器·架构
wanhengidc3 小时前
服务器的安全性如何?
运维·服务器·安全·游戏·智能手机
taxunjishu3 小时前
DeviceNet 转 MODBUS TCP:倍福 CX 系列 PLC 与 MES 系统在 SMT 回流焊温度曲线监控的通讯配置案例
运维·人工智能·物联网·自动化·区块链
tianyuanwo3 小时前
tar打包过滤指定目录指南
linux·tar·过滤式打包
王嘉俊9253 小时前
DevOps 与 部署入门:加速软件交付与运维的实践指南
运维·devops
DARLING Zero two♡3 小时前
【Linux操作系统】简学深悟启示录:进程间通信
linux·运维·服务器
半梦半醒*3 小时前
gitlab部署
linux·运维·centos·ssh·gitlab·jenkins
liangshanbo12154 小时前
React + TypeScript 企业级编码规范指南
ubuntu·react.js·typescript