『Linux学习笔记』12. 存储设备及管理

在接触Linux前, 我们或多或少有过使用其他操作系统的经验 -- MacOS或Windows;

它们无一例外都对物理存储介质提供了支持, 如 U盘 光盘(光驱) 软盘(软驱) 硬盘等.

除此之外, 它们还对如磁盘中的逻辑分区(逻辑卷)、磁盘阵列等虚拟存储介质提供的支持.

 

因此, Linux作为操作系统, 自然也少不了对存储设备及其管理的支持, 这也是本章的主要内容.

 

本章中涉及的命令有:

  • mount – Mount a file system

    • 挂载一个文件系统

  • umount – Unmount a file system

    • 卸载一个文件系统

  • fsck – Check and repair a file system

    • 检查和修复一个文件系统

  • fdisk – Partition table manipulator

    • 分区表控制器

  • mkfs – Create a file system

    • 创建文件系统

  • fdformat – Format a floppy disk

    • 格式化一张软盘

  • dd – Write block oriented data directly to a device

    • 把面向块的数据直接写入设备

  • genisoimage (mkisofs) – Create an ISO 9660 image file

    • 创建一个 ISO 9660的映像文件

  • wodim (cdrecord) – Write data to optical storage media

    • 通过光驱写入数据(烧录CD或DVD)

  • md5sum – Calculate an MD5 checksum

    • 计算 MD5检验码

挂载与卸载设备

在我们此前使用的图形界面操作系统中, 往往能够自动实现设备的挂载与卸载, 我们只需将设备连接到系统中(如插入U盘)它就能够正常工作.

但在过去的操作系统或目前的部分服务器中, 这个过程仍需要人为操作, 因为服务器经常有极端的存储需求和复杂的配置要求; 在部分Linux发行版中也是如此, 但在目前大多数Linux发行版中系统都会尝试自动帮我们完成这个过程.

存储设备的结构

在我们此前的文章中提到过, Linux的系统文件结构类似一棵倒置的树, 因此想要访问设备的第一步便是将设备连接到这棵"树"上, 而连接的地方也被称为"挂载点", 也就是我们访问该设备的路径;

在实际操作之前, 我们先要了解Linux系统是如何表述一个已挂载的设备的, 以便我们后续顺利进行.

在"/etc/fstab"的文件中我们可以看到当Linux系统启动时就会挂载的设备, 这可以类比为Windows或MacOS中的磁盘分区:

 

 

 (由于子系统的特殊性, 该文件实例与常规直接安装并运行在硬盘上的Linux实例有差异)

抛开其他暂且不谈, 我们主要希望通过该例程认识到Linux中的存储设备结构, 可见上图共输出了6个字段, 分别对应以下含义

字段内容说明
1 设备名 传统上,这个字段包含与物理设备相关联的设备文件的实际名字,比如说/dev/hda1(第一个 IDE 通道上第一个主设备分区)。然而今天的计算机,有很多热插拔设备(像 USB 驱动设备),许多 现代的 Linux 发行版用一个文本标签和设备相关联。当这个设备连接到系统中时, 这个标签(当储存媒介格式化时,这个标签会被添加到存储媒介中)会被操作系统读取。 那样的话,不管赋给实际物理设备哪个设备文件,这个设备仍然能被系统正确地识别。
2 挂载点 设备所连接到的文件系统树的目录。
3 文件系统类型 Linux 允许挂载许多文件系统类型。大多数本地的 Linux 文件系统是 ext3, 但是也支持很多其它的,比方说 FAT16 (msdos), FAT32 (vfat),NTFS (ntfs),CD-ROM (iso9660),等等。
4 选项 文件系统可以通过各种各样的选项来挂载。有可能,例如,挂载只读的文件系统, 或者挂载阻止执行任何程序的文件系统(一个有用的安全特性,避免删除媒介。)
5 频率 一位数字,指定是否和在什么时间用 dump 命令来备份一个文件系统。
6 次序 一位数字,指定 fsck 命令按照什么次序来检查文件系统。

查看已挂载的文件系统列表

mount, 这是本章中介绍的第一个新命令, 它用于挂载操作, 但如果执行时未传入参数, 它将为我们显示目前已挂载的所有文件系统:

 (由于子系统的特殊性, 可以看到此处Windows的磁盘也被挂载了, 实际的Linux与其他操作系统的混合多系统(如Win7+CentOS双系统)中无法通过直接该方式访问其他系统的设备)

此处输出的格式为 (设备) on (挂载点) type (文件系统类型) ((设备其他信息)).

挂载设备

在目前主流的Linux发行版中, 当我们连接新设备时一般系统会自动将其挂载到特定挂载点下, 届时通过mount命令便可查看到挂载点并通过挂载点访问.

但由于目前我们使用的是基于WSL所运行的子系统, 因此需要手动挂载设备.

此时, 我在设备上连接了一张容量为16G的SD卡, Windows系统自动将其挂载为了卷标为"F"的分区:

 

在Linux中, 我们可以通过如下指令手动的挂载一个设备到指定挂载点:

sudo mount -t 文件系统类型 设备名 挂载点

如我们需要将"F:"设备挂载到$HOME/sdcard文件夹

首先我们需要确定我们的挂载点是存在的, 这可以使用之前学到的命令进行确认

ll ~ | grep sdcard

如果没有这个文件夹, 则需要使用以下命令进行新建:

mkdir ~/sdcard

在完成了准备工作以后, 我们就可以使用本节所介绍的挂载命令对设备进行挂载了:

sudo mount -t drvfs F:\\ ~/sdcard

最后我们使用"mount"命令确认一下我们的设备挂载结果

 

 不难看出, 我们的设备已经被成功挂载了; 至此, 我们便可以通过挂载点的路径对设备进行访问(~/sdcard/)

卸载设备

当我们完成操作后想要移除设备或修改挂载点需要重新挂载时, 就需要用到卸载设备的命令:

sudo umount 设备名(或挂载点)

假设我们需要卸载刚才挂载的SD卡, 那么可以使用:

sudo umount F:\\

sudo umount ~/sdcard

请注意, 如果目前的终端正位于挂载点或其子目录内或有其他软件正在对挂载点或其子目录进行读写, 那么umount命令将会予以警告, 届时请先检查设备的占用情况再予以卸载;

查看设备名称

当进行设备挂载时, 系统要求我们提供完整的设备名称(WLS中需要从Windows上挂载如上文的"F:"), 我们可以通过查看"/dev"中的内容确定我们新连接的设备名称; 通常Linux中自动挂载的部分设备也将在该目录下(如/dev/cdrom), 它们只是一个符号链接, 本体仍指向某一个实际连接的设备(如果有的话):

ls /dev

在连接新设备时, 旧设备往往不会发生变更, 因此我们可以很方便的得到新设备的名称;

以下是Linux中的设备命名规则, 可以更加方便快捷的找出我们所需要的设备: 

规则设备
/dev/fd* 软盘驱动器
/dev/hd* 老系统中的 IDE(PATA)磁盘。典型的主板包含两个 IDE 连接器或者是通道,每个连接器 带有一根缆线,每根缆线上有两个硬盘驱动器连接点。缆线上的第一个驱动器叫做主设备, 第二个叫做从设备。设备名称这样安排,/dev/hda 是指第一通道上的主设备名;/dev/hdb 是第一通道上的从设备名;/dev/hdc 是第二通道上的主设备名,等等。末尾的数字表示 硬盘驱动器上的分区。例如,/dev/hda1是指系统中第一硬盘驱动器上的第一个分区,而 /dev/hda 则是指整个硬盘驱动器。
/dev/lp* 打印机
/dev/sd* SCSI 磁盘。在最近的 Linux 系统中,内核把所有类似于磁盘的设备(包括 PATA/SATA 硬盘, 闪存,和 USB 存储设备,比如说可移动的音乐播放器和数码相机)看作 SCSI 磁盘。 剩下的命名系统类似于上述所描述的旧的/dev/hd*命名方案。
/dev/sr* 光盘(CD/DVD 读取器和烧写器)

 

以下查看设备名的方法不适用于WSL(Ubuntu)

除了查看/dev的内容外, 还有其他能够得到新连接设备名称的方法, 如监控系统日志:

sudo tail -f /var/log/messages

届时, 当我们连接新设备, 文件末尾就会出现数行系统内核扫描新设备时所打印的日志, 当然也包括设备的名称, 它看起来像这样

"Jul 4 10:07:59 linuxbox kernel: sdb: sdb1"

由此, 我们可以知道sdb指的是我们新插入的设备, 而sdb1指的是该设备的第一分区.

知道了设备的名称, 我们就可以轻松的将设备手动挂载了.


 

 

驱动器操作(分区、格式化)

在Linux中如果我们想要重新格式化某一个驱动器需要分为以下两步, 这和多数操作系统类似:

  1. 创建一个分区布局或者重新分区即分区(可选的)
  2. 在这个驱动器上创建一个新的文件系统即格式化

 

格式化将会导致驱动器中的数据被擦除, 因此不建议使用含有数据的驱动器进行本节中的任何实验.

 

fdisk -- 驱动器操作命令(分区)

fdisk是Linux中内置的为驱动器(硬盘 U盘 软盘 光盘等)操作提供支持的程序; 它允许我们对这些设备进行修改、创建、删除分区.

在进行操作前, fdisk要求我们保证目标在过程中无任何读写操作进行即要求我们卸载设备后进行操作.

加载设备

完成对目标驱动器的卸载操作后, 我们可以通过以下指令使fdisk加载一个驱动器设备(此处设备为/dev/sdb):

sudo fdisk /dev/sdb

需要注意的是, 我们需要为fdisk传递完整的设备名称而非其中一个分区(sdb1就不行)

操作设备

在成功完成了设备加载后, fdisk会要求我们传递我们想做的事情即Command,  看起来就像这样:

Command (m for help):

可选的参数间下一部分↓

操作说明

以下是可以在操作设备阶段指明操作意图的参数:

  • m :显示菜单和帮助信息
  • a :活动分区标记/引导分区
  • d :删除分区
  • l :显示分区类型
  • n :新建分区
  • p :显示分区信息
  • q :退出不保存
  • t :设置分区号
  • v :进行分区检查
  • w :保存修改
  • x :扩展应用,高级功能

查询当前分区情况

fdisk除了提供驱动器操作功能外, 还提供了查询功能, 当我们想了解当前设备的分区情况时, 也可以通过fdisk查询:

fdisk -l -u 4

-l表示显示当前分区情况;

-u表示显示列表中的前多少个分区(在选择参数-l后该参数可选);

 

mkfs -- 文件系统操作命令(格式化)

当我们需要将某一个分区转换成指定格式时, 就需要用到mkfs命令了, 它是"make file system"的简写;

如我们想将刚才分完区的/dev/sdb设备的第一分区转换为ext3系统类型:

sudo mkfs -t ext3 /dev/sdb1

这样, 便完成了对分区的格式化; 任何Linux支持的文件系统格式都可以通过在参数-t中指定, 此处选用的是ext3.

 

测试和修复文件系统

不同的文件系统拥有不同的数据结构; 在Linux中, 每当设备被挂载时, 系统都会校验其文件系统是否出错. 该过程的日志可以在"/etc/fstab"文件中查询到.

在Linux中负责文件系统校验的是fsck(file system check)程序, 它不但能够检查文件系统的完整性, 还能够修复一定程度的文件系统错误(在文件系统的数据结构中, 有部分数据是可以推断的), 修复成功率与文件系统损坏程度成反比.

但需要注意, 在进行以下操作前应先卸载设备.

检测指定设备(/dev/sdb1)的文件系统完整性:

sudo fsck /dev/sdb1

如今文件系统损坏的情况十分罕见, 当你遇到这种情况时往往Linux系统也已经无法正常启动, 届时系统将会引导你使用fsck尝试进行文件系统修复, 此处不做展开.(我没法试

 

直接对数据进行操作

计算机以"文件"为单位进行信息存储仅仅是为了使人更加方便的使用, 而信息的本质仍是数据, 亦或者说是一堆数字.

当我们抛开"文件"的概念想要直接操作数据时, 可以使用"dd"命令.

它的用法看起来像这样:

dd if=input_file of=output_file [bs=block_size [count=blocks]]

if为原驱动器, of为目标驱动器, bs为数据块大小, count为移动的数据块数量(当bs非空时可选)

 

比如我们想将某个驱动器(sdb)中的数据原封不动的克隆到另外一个驱动器(sdc)上:

dd if=/dev/sdb of=/dev/sdc

 

亦或者我们想用一个文件(sdb_duplicate.img)存储我们驱动器中的所有数据以便转移或后期恢复:

dd if=/dev/sdb of=sdb_duplicate.img

 

需要注意的是"dd"指令允许我们越过"文件"的限制直接操作数据, 这也导致了它不可避免的极易发生危险, 就像它的原名"destroy disk"一样, 一旦操作不当将造成数据不可逆的损失, 因此在使用dd命令时请再三检查输入输出规范!


光盘与软盘内容在此暂时不予展开, 后续用到可能会更新🧑‍💻

posted @ 2021-07-04 20:26  HoD  阅读(299)  评论(0编辑  收藏  举报