Linux 文件系统挂载

LinuxBeginner
立即练习

介绍

Linux 文件系统挂载是系统管理员和技术用户的基本技能。此过程允许操作系统通过将存储设备及其文件系统附加到目录结构中的特定位置来访问和与其交互。

在这个实验中,你将学习如何创建一个模拟存储设备,使用文件系统对其进行格式化,并将其挂载以访问其内容。你还将探索不同的挂载选项,这些选项控制如何使用文件系统,例如限制执行权限或使其只读。

在本实验结束时,你将了解:

  • 如何在 Linux 中创建和格式化存储设备
  • 挂载和卸载文件系统的过程
  • 如何使用挂载选项来控制文件系统访问
  • 如何验证已挂载文件系统的状态

这些技能对于管理 Linux 环境中的存储设备至关重要,从本地硬盘驱动器到可移动介质和网络存储。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 89%。获得了学习者 91% 的好评率。

创建和挂载存储设备

在此步骤中,你将创建一个模拟存储设备,使用文件系统对其进行格式化,并将其挂载,使其可以在 Linux 目录结构中访问。

导航到项目目录

首先,让我们导航到项目目录,你将在整个实验中在此目录中工作:

cd ~/project

创建模拟存储设备

现在,使用 dd 命令创建一个模拟存储设备。此命令将创建一个特定大小的文件,该文件将充当你的存储设备:

dd if=/dev/zero of=storage_device.img bs=1M count=100

此命令创建一个名为 storage_device.img 的 100MB 文件。让我们了解此命令的每个部分:

  • if=/dev/zero: 输入文件是 /dev/zero,这是一个特殊文件,它产生一个无休止的零流
  • of=storage_device.img: 输出文件名为 storage_device.img
  • bs=1M: 块大小设置为 1 MB
  • count=100: 复制 100 个块,从而生成一个 100MB 的文件

你应该看到类似于以下的输出:

100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.0331261 s, 3.2 GB/s

使用文件系统格式化存储设备

在使用存储设备之前,你需要使用文件系统对其进行格式化。mkfs.ext4 命令使用 ext4 文件系统格式化该文件,ext4 文件系统在 Linux 中很常用:

mkfs.ext4 storage_device.img

当命令创建文件系统时,你将看到几行输出,类似于:

mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 25600 4k blocks and 25600 inodes

Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

创建挂载点

在挂载设备之前,创建一个将用作挂载点的目录。这是你的文件系统内容可访问的位置:

mkdir -p ~/project/mount_point

挂载存储设备

现在,使用 mount 命令将存储设备挂载到挂载点:

sudo mount -t ext4 storage_device.img ~/project/mount_point

此命令告诉 Linux:

  • 挂载类型为 (-t) ext4 的设备
  • 要挂载的设备是 storage_device.img
  • 挂载位置是 ~/project/mount_point

验证挂载

要验证设备是否已正确挂载,请使用带有选项的 df 命令(disk free,磁盘可用空间)来显示文件系统类型和人类可读的大小:

df -hT | grep mount_point

你应该看到类似于以下的输出:

/dev/loop0     ext4      90M   24K   83M   1% /home/labex/project/mount_point

测试已挂载的文件系统

要测试文件系统是否正常工作,请在已挂载的目录中创建一个测试文件:

echo "This is a test file" | sudo tee ~/project/mount_point/test.txt > /dev/null

读取该文件以验证它是否已成功创建:

cat ~/project/mount_point/test.txt

你应该看到显示文本“This is a test file”,确认你的文件系统已正确挂载并正常运行。

了解发生了什么

你已成功:

  1. 创建了一个模拟存储设备的文件
  2. 使用 ext4 文件系统对其进行了格式化
  3. 创建了一个挂载点目录
  4. 将文件系统挂载到该目录
  5. 确认挂载成功
  6. 在已挂载的文件系统上创建并读取了一个文件

此过程类似于连接和使用外部硬盘驱动器或 USB 闪存盘,但使用文件来模拟物理设备。

用于安全和访问控制的挂载选项

在此步骤中,你将学习如何使用挂载选项来控制如何访问文件系统。挂载选项提供了对文件系统行为的额外控制,例如限制执行权限或使文件系统只读。

卸载当前文件系统

在应用新的挂载选项之前,你需要卸载当前文件系统:

sudo umount ~/project/mount_point

如果收到一条错误消息,提示设备正忙,请确保你当前不在挂载点目录中:

cd ~/project

然后再次尝试卸载。

使用 noexec 选项挂载

noexec 挂载选项阻止在已挂载的文件系统上执行任何二进制文件。这是一项安全功能,可以防止恶意脚本或程序运行。

使用 noexec 选项挂载文件系统:

sudo mount -t ext4 -o noexec storage_device.img ~/project/mount_point

-o noexec 部分告诉 mount 命令使用 noexec 选项。

测试 noexec 选项

让我们在已挂载的文件系统上创建一个简单的 shell 脚本,并尝试执行它:

echo '#!/bin/bash' | sudo tee ~/project/mount_point/test_script.sh > /dev/null
echo 'echo "This script is running"' | sudo tee -a ~/project/mount_point/test_script.sh > /dev/null

使脚本可执行:

chmod +x ~/project/mount_point/test_script.sh

现在尝试执行该脚本:

~/project/mount_point/test_script.sh

你应该看到类似以下的错误消息:

bash: /home/labex/project/mount_point/test_script.sh: Permission denied

这证实了 noexec 选项正在阻止脚本执行。

卸载并使用只读选项重新挂载

现在,让我们尝试将文件系统挂载为只读。首先,卸载它:

sudo umount ~/project/mount_point

然后,使用只读选项挂载它:

sudo mount -t ext4 -o ro storage_device.img ~/project/mount_point

-o ro 部分告诉 mount 命令使用只读选项。

测试只读选项

尝试在已挂载的文件系统上创建一个新文件:

touch ~/project/mount_point/new_file.txt

你应该看到类似以下的错误消息:

touch: cannot touch '/home/labex/project/mount_point/new_file.txt': Read-only file system

这证实了文件系统已挂载为只读。

检查挂载选项

你可以使用 mount 命令验证当前的挂载选项:

mount | grep mount_point

你应该看到包含 ro 的输出,表明只读选项处于活动状态:

/home/labex/project/storage_device.img on /home/labex/project/mount_point type ext4 (ro,relatime)

组合挂载选项

你可以通过用逗号分隔来组合多个挂载选项。让我们卸载文件系统,然后使用 noexec 和 ro 选项重新挂载它:

sudo umount ~/project/mount_point
sudo mount -t ext4 -o ro,noexec storage_device.img ~/project/mount_point

验证挂载选项:

mount | grep mount_point

你应该在输出中看到这两个选项:

/home/labex/project/storage_device.img on /home/labex/project/mount_point type ext4 (ro,noexec,relatime)

了解挂载选项

你已探索的挂载选项对于安全和控制访问非常重要:

  • noexec 阻止执行二进制文件,这可以防止恶意代码
  • ro (read-only,只读) 阻止对文件系统进行更改,这可以保护数据完整性

这些选项通常在生产环境中使用,以实现最小权限原则(principle of least privilege),仅向系统和用户提供他们需要的访问权限。

使用 /etc/fstab 自动挂载

在此步骤中,你将学习如何通过配置 /etc/fstab 文件,使文件系统挂载在系统重启后保持持久。这对于在系统启动时自动挂载存储设备至关重要。

了解 /etc/fstab

/etc/fstab (file system table,文件系统表) 文件包含有关系统启动时应自动挂载的文件系统的信息。文件中的每一行代表一个单独的文件系统,并包括设备、挂载点、文件系统类型和挂载选项等字段。

让我们首先查看文件的当前内容:

cat /etc/fstab

你将看到已配置系统挂载的若干行。

卸载当前文件系统

在配置持久挂载之前,卸载当前文件系统:

sudo umount ~/project/mount_point

创建 /etc/fstab 的备份

在修改系统配置文件之前创建备份始终是一个好习惯:

sudo cp /etc/fstab /etc/fstab.backup

向 /etc/fstab 添加条目

现在,将存储设备的条目添加到 /etc/fstab。你需要使用设备文件的绝对路径:

echo "$(readlink -f ~/project/storage_device.img) $(readlink -f ~/project/mount_point) ext4 defaults 0 0" | sudo tee -a /etc/fstab

此命令:

  • 使用 readlink -f 获取文件的绝对路径
  • 使用带有 sudo 权限的 tee -a 将格式化的行重定向到 /etc/fstab

让我们分解 fstab 条目中的字段:

  1. 设备(Device)- 存储设备文件的完整路径
  2. 挂载点(Mount point)- 挂载目录的完整路径
  3. 文件系统类型(File system type)- ext4
  4. 挂载选项(Mount options)- defaults (等效于 rw,suid,dev,exec,auto,nouser,async)
  5. Dump - 0 (不使用 dump 备份)
  6. Pass - 0 (启动时不检查文件系统)

测试 fstab 条目

通过使用 mount -a 命令测试你的条目是否正确,该命令挂载 /etc/fstab 中列出的所有尚未挂载的文件系统:

sudo mount -a

如果没有错误消息,则表示你的条目正确。

验证挂载

验证文件系统是否按预期挂载:

df -hT | grep mount_point

你应该看到你的文件系统已使用 ext4 类型挂载。

使用更多选项修改 fstab 条目

现在,让我们修改条目以使用你在上一步中学到的挂载选项。使用 nano 文本编辑器编辑 /etc/fstab 文件:

sudo nano /etc/fstab

找到你添加的行,该行应如下所示:

/home/labex/project/storage_device.img /home/labex/project/mount_point ext4 defaults 0 0

将挂载选项(第四个字段)从 defaults 更改为 ro,noexec

/home/labex/project/storage_device.img /home/labex/project/mount_point ext4 ro,noexec 0 0

Ctrl+O 写入更改,然后按 Enter 确认,再按 Ctrl+X 退出 nano。

使用新选项重新挂载

卸载文件系统并重新挂载 /etc/fstab 中的所有条目:

sudo umount ~/project/mount_point
sudo mount -a

验证新的挂载选项

验证文件系统是否已使用新选项挂载:

mount | grep mount_point

你应该在输出中看到 ronoexec 选项。

了解持久挂载

/etc/fstab 文件提供了一种方法来:

  • 在启动时自动挂载文件系统
  • 以持久方式配置挂载选项
  • 控制启动期间的文件系统检查顺序

在生产环境中,正确配置 /etc/fstab 可确保系统启动时所有必要的文件系统都可用,而无需手动干预。

总结

祝贺你完成 Linux 文件系统挂载实验。你已经获得了宝贵的技能,这些技能对于任何 Linux 系统管理员或技术用户来说都是必不可少的。

在本实验中,你学习了:

  1. 创建和格式化存储设备

    • 如何使用 dd 命令创建模拟存储设备
    • 如何使用 mkfs.ext4 命令使用 ext4 文件系统格式化设备
  2. 基本挂载操作

    • 如何创建挂载点目录
    • 如何使用 mount 命令挂载文件系统
    • 如何使用 df 和其他命令验证挂载
  3. 用于安全和控制的挂载选项

    • 如何使用 noexec 选项来阻止二进制文件的执行
    • 如何使用 ro 选项来创建只读文件系统
    • 如何组合多个挂载选项以增强安全性
  4. 使用 /etc/fstab 进行持久挂载

    • 如何配置在启动时自动挂载文件系统
    • 如何设置持久挂载选项
    • 如何测试和验证 fstab 条目

这些技能将使你能够:

  • 管理 Linux 中的各种类型的存储设备
  • 通过挂载选项实施安全控制
  • 配置自动挂载以进行系统启动
  • 排除文件系统挂载问题

当你继续你的 Linux 之旅时,你会发现这些技能在处理物理存储设备、网络共享和虚拟文件系统时非常有价值。你学到的原则适用于许多不同的 Linux 发行版和存储技术。