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还会尝试与大家分享,谢谢大家。
相关推荐
^yi3 分钟前
【Linux系统编程】对操作系统的理解
linux·运维·服务器·操作系统·系统调用·os
Kina_C20 分钟前
LVS-NAT 负载均衡实验从环境搭建到规则持久化
linux·运维·服务器·负载均衡·lvs
小肝一下33 分钟前
7. 库制作与原理
linux·c语言·操作系统·bash·shell·动静态库
Android洋芋43 分钟前
PrintFriendly网页文章转PDF插件工具及技术分析
运维·服务器·pdf·网页转pdf
Elastic 中国社区官方博客1 小时前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索
RoboWizard1 小时前
金士顿高速闪存盘 单双接口适配多元存储需求
大数据·运维·人工智能·智能手机·云计算
hkj88081 小时前
Ubuntu 20.04 安装 OpenJDK 17
linux·运维·ubuntu
huainingning1 小时前
防火墙重启后ssl登录提示证书过期临时解决方法
linux·服务器·ssl
sulikey1 小时前
服务器安装Docker教程。如何在云服务器安装Docker容器?
运维·服务器·ubuntu·docker·安装教程·云服务器
许彰午1 小时前
17-22-运维与高级主题
运维·网络