文件系统和存储设备管理
FILESYSTEM AND STORAGE DEVICE MANAGEMENT
如果您来自 Windows 环境,那么 Linux 表示和管理存储设备的方式在您看来将非常不同。您已经看到,文件系统没有驱动器的物理表示形式,就像 Windows 中的 C:、D:或 E:系统一样,而是有一个文件树结构,其顶部或根目录是/。本章将介绍 Linux 如何表示存储设备,如硬盘驱动器、闪存驱动器和其他存储设备。
我们首先查看附加的驱动器和其他存储设备是如何挂载在文件系统上的,然后是/(根)目录。在这个上下文中挂载仅仅意味着将驱动器或磁盘附加到文件系统,使操作系统能够访问它们。对于黑客来说,有必要了解文件和存储设备管理系统,包括您自己的系统和目标系统。黑客通常使用外部媒介来加载数据、黑客工具,甚至他们的操作系统。在目标系统上之后,您需要了解正在处理的文件、在何处查找机密文件或其他关键文件、如何将驱动器挂载到目标系统,是否以及在何处可以将这些文件放在系统上。本章将介绍所有这些主题,以及如何管理和监视存储设备。
我们从名为/dev 的目录开始,您可能已经在目录结构中注意到了:dev 是 device 的缩写,Linux 中的每个设备都由/dev 目录中的文件表示。让我们从与/dev 开始一起工作。
设备目录/DEV
Linux 有一个特殊的目录,其中包含代表每个附加设备的文件:适当命名的/dev 目录。作为第一个介绍,导航到/dev 目录,然后在其上执行长列表格式查看。您应该看到类似清单 10
- 1 的内容。
kali >cd /dev kali >ls -l total 0
crw 1 root root 10,175 May 16 12:44 agpgart
crw 1 root root 10,235 May 16 12:44 autofs
drwxrxrx 1 root root 160 May 16 12:44 block
snip
lrwxrwxrwx 1 root root 3 May 16 12:44 cdrom > sr0
snip
drwxrxrx 2 root root 60 May 16 12:44 cpu
snip
清单 10-1:/dev 目录的内容
默认情况下,设备是按字母顺序显示的。您可能认识其中一些设备,比如 cdrom 和 cpu,但是其他设备的名称相当神秘。系统上的每个设备都由/dev 目录中的一个文件表示,其中包括您可能从未使用过或甚至从未意识到存在的设备。如果您这样做,可能会有一个设备文件等待使用。
如果您向下滚动屏幕一点,您应该会看到更多的设备清单。特别有趣的是设备 sda1、sda2、sda3、sdb 和 sdb1,它们是硬盘驱动器及其分区、USB 闪存驱动器及其分区。
snip
brwrw 1 root root 8, 0 May 16 12:44 sda
brwrw 1 root root 8, 1 May 16 12:44 sda1
brwrw 1 root root 8, 2 May 16 12:44 sda2
brwrw 1 root root 8, 5 May 16 12:44 sda5
brwrw 1 root root 8, 16 May 16 12:44 sdb
brwrw 1 root root 8, 17 May 16 12:44 sdb1
snip
让我们仔细看看这些内容。
Linux 如何表示存储设备
Linux 对随后挂载在文件系统上的驱动器使用逻辑标签。这些逻辑标签将根据驱动器的挂载位置而变化,这意味着相同的硬盘驱动器可能在不同的时间有不同的标签,这取决于它挂载的位置和时间。
最初,Linux 将软盘驱动器(还记得吗?)表示为 fd0,将硬盘驱动器表示为 hda。您仍然会偶尔在遗留 Linux 系统上看到这些驱动器表示,但是今天大多数软盘驱动器都消失了(谢天谢地)。即使如此,使用 IDE 或 E-IDE 接口的旧的遗留硬盘驱动器仍然以 hda 的形式表示。较新的串行 ATA (SATA)接口驱动器和小型计算机系统接口(SCSI)硬盘驱动器被表示为 sda。驱动器有时被分割成称为分区的部分,这些部分在标记系统中用数字表示,您将在下一节中看到。
当系统有多个硬盘驱动器时,Linux 通过按字母顺序递增最后一个字母来串行命名它们,因此第一个驱动器是 sda,第二个驱动器是 sdb,第三个驱动器是 sdc,等等(参见表 10-1)。sd 后的连续字母通常被称为主编号。
表 10-1:设备命名系统
设备文件描述 | |
---|---|
sda | 第一个 SATA 硬盘 |
sdb | 第二 SATA 硬盘驱动器 |
sdc | 第三 SATA 硬盘驱动器 |
sdd | 第四 SATA 硬盘驱动器 |
硬盘分区
一些驱动器可以划分为多个分区,以便管理和分离信息。例如,您可能想要将硬盘驱动器分开,以便交换文件、主目录和/目录都位于单独的分区上——您这样做可能有很多原因,包括共享资源和放松默认权限。
Linux 在每个分区的驱动器名称后面都加上一个次要编号。这样,第一个 SATA 驱动器上的第一个分区就是 sda1。第二个分区是 sda2,第三个是 sda3,以此类推,如表 10-2 所示。
表 10-2:分区标识
设备文件描述 | |
---|---|
sda1 | 第一个 SATA 驱动器上的第一个分区(1) |
sda2 | 在第一个(a)驱动器上的第二个(2)分区 |
sda3 | 在第一个(a)驱动器上的第三个(3)分区 |
sda4 | 在第一个(a)驱动器上的第四个(4)分区 |
有时,您可能希望查看 Linux 系统上的分区,以查看您拥有哪些分区以及每个分区中有多少可用容量。您可以通过使用fdisk实用程序来实现这一点。使用带有fdisk的-l参数列出所有驱动器的所有分区,如清单 10-2 所示。
kali >fdisk -l
Disk /dev/sda: 20GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x7c06cd70
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 39174143 39172096 18.7G 83 Linux
/dev/sda2 39176190 41940991 2764802 1.3G 5 Extended
/dev/sda5 39176192 41940991 2764800 1.3G 82 Linux swap / Solaris
Disk /dev/sdb: 29.8 GiB, 31999393792 bytes, 62498816 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos
Disk identifier: 0xc3072e18
Device Boot Start End Sectors Size Id Type
/dev/sdb1 32 62498815 62498784 29.8G 7 HPFS/NTFS/exFAT
清单 10-2:使用 fdisk 列出分区
如清单 10-2 所示,设备 sda1、sda2 和 sda5 在第一节中列出。这三种设备构成了我的虚拟机的虚拟磁盘,它是一个 20GB 的驱动器,有三个分区,包括交换分区(sda5),当 RAM 容量超过时,它充当虚拟 RAM—类似于 Windows 中的虚拟页面文件。
如果将清单 10-2 向下扫描到第三节,您将看到指定为 sdb -的第二个设备输出,b 标签告诉我们这个驱动器与前三个设备是分开的。这是我的 64GB 闪存。注意,fdisk表示它是 HPFS/NTFS/ExFAT 文件系统类型。这些文件类型——高性能文件系统(HPFS)、新技术文件系统(NTFS)和扩展文件分配表(exFAT)——不是 Linux 系统的本机文件,而是 macOS 和 Windows 系统的。在进行研究时,能够识别不同系统的原生文件类型是值得的。文件系统可能指出驱动器的格式设置在哪种机器上,这是有价值的信息。Kali 能够使用在许多不同操作系统上创建的 USB 闪存驱动器。
正如您在第 1 章中看到的,Linux 文件系统的结构与 Windows 和其他专有操作系统有很大的不同。最重要的是,Linux 中文件的存储和管理方式也不同。新版本的 Windows 使用 NTFS 文件系统,而旧的 Windows 系统使用文件分配表(FAT)系统。
Linux 使用许多不同类型的文件系统,但最常见的是 ext2、ext3 和 ext4。这些都是 ext(或扩展的)文件系统的升级版,ext4 是最新的。
字符和块设备
关于/dev 目录中设备文件的命名,还需要注意的是,第一个位置包含c或b。您可以在清单 10-1 的大多数条目开头看到这一点,它看起来像这样:
crw 1 root root 10,175 May 16 12:44 agpgart
这些字母代表设备输入和输出数据的两种方式。c代表字符,如您所料,这些设备被称为字符设备。通过逐个字符(如鼠标或键盘)发送和接收数据与系统交互的外部设备是字符设备。
b代表第二种类型:块设备。它们以数据块(一次多个字节)进行通信,包括硬盘驱动器和 DVD 驱动器等设备。这些设备需要更高的数据吞吐量,因此以块(一次多个字符或字节)的形式发送和接收数据。一旦您知道一个设备是字符设备还是块设备,您就可以轻松地获得关于它的更多信息,您将在下面的文章中看到。
使用 lsblk 列出块设备和信息
Linux 命令lsblk (list block 的缩写)列出/dev 中列出的每个块设备的一些基本信息。结果类似于fdisk -l的输出,但它也将在一种树型结构中显示具有多个分区的设备,将每个设备的分区显示为分支,并且不需要运行根特权。例如,在清单 10-3 中,我们看到了 sda 及其分支 sda1、sda2 和 sda5。
kali >lsblk
Name MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda1 8:0 0 20G 0 disk
|sda1 8:1 0 18.7G 0 part /
|sda2 8:2 0 1K 0 part
|sda5 8:5 0 1.3G 0 part [SWAP]
sdb 8:16 1 29.8G 0 disk
|sdb1 8.17 1 29.8G 0 disk /media
sr0 11:0 1 2.7G 0 rom
清单 10-3:使用 lsblk 列出块设备信息
输出包括软盘驱动器作为 fd0, DVD 驱动器作为 sr0,尽管我的系统上没有软盘驱动器,这只是旧系统的遗留。我们还可以在驱动器的挂载点上看到信息——这是驱动器附加到文件系统的位置。请注意,硬盘驱动器 sda1 安装在/目录和闪存驱动器安装在/media 目录。在下一节中,您将更多地了解这一点的重要性。
安装和卸载
大多数现代操作系统,包括 Linux 的大多数新版本,在附加存储设备时自动加载它们,这意味着新的闪存驱动器或硬盘驱动器将自动附加到文件系统。对于 Linux 新手来说,挂载可能是一个陌生的主题。
存储设备必须首先物理地连接到文件系统,然后逻辑地连接到文件系统,以便使数据对操作系统可用。换句话说,即使设备在物理上与系统相连,它也不一定在逻辑上与操作系统相连并可用。术语 mount 是计算机早期的遗留问题,当时存储磁带(在硬盘驱动器之前)必须物理地挂载到计算机系统中,想想那些带旋转磁带驱动器的大型计算机,您可能已经看过老式科幻电影了。
如前所述,目录树中附加设备的点称为挂载点。Linux 中的两个主要挂载点是/mnt 和/media。一般来说,内部硬盘安装在/mnt 上,外部 USB 设备(如闪存驱动器和外部 USB 硬盘)安装在/media 上,但从技术上讲,可以使用任何目录。
自己安装存储设备
在某些版本的 Linux 中,您需要手动挂载驱动器才能访问其内容,因此这是一项值得学习的技能。要在文件系统上挂载驱动器,请使用mount命令。如果将设备挂载到具有子目录和文件的目录上,则挂载的设备将覆盖该目录的内容,使其不可见且不可用。因此,要将新硬盘 sdb1 挂载到/mnt 目录,需要输入以下命令:
kali >mount /dev/sdb1 /mnt
然后,应该可以访问该硬盘驱动器。如果您想将闪盘 sdc1 挂载在/media 目录下,请输入:
kali >mount /dev/sdc1 /media
挂载在系统上的文件系统保存在/etc/fstab(文件系统表的缩写)的文件中,系统在每次启动时读取该文件系统。
卸载与 umount
如果你来自 Mac 或 Windows 的实践背景,你可能在不知情的情况下卸载了一个驱动器。在您从系统中删除闪存驱动器之前,您要“弹出”它,以防止对存储在设备上的文件造成损害。“弹出”是 unmount 的另一种说法。
类似于mount命令,您可以通过输入umount命令和/dev 目录中设备的文件条目(例如/dev/sdb)卸载第二个硬盘驱动器。注意,该命令的拼写不是 unmount,而是 umount (no n)。
kali >umount /dev/sdb1
您无法卸载正在使用中的设备,因此如果系统正在读取或写入此设备,您将只会收到一个错误。
监控文件系统
在本节中,我们将研究一些用于监控文件系统状态的命令——这是任何黑客或系统管理员都必须具备的技能。我们将获得一些关于挂载磁盘的信息,然后检查和修复错误。存储设备尤其容易出错,因此值得学习这项技能。
获取挂载磁盘上的信息
命令df(对于空余磁盘)将为我们提供关于任何硬盘或挂载设备(如 CD、DVD 和闪存驱动器)的基本信息,包括正在使用的空间和可用空间(参见清单 10-4)。如果没有任何选项,df默认为系统上的第一个驱动器(在本例中是 sda)。如果您想检查另一个驱动器,只需使用您想检查的驱动器表示形式(例如,df sdb)遵循df命令即可。
kali >df
Filesystem 1KBlocks Used Available Use% Mounted on
rootfs 19620732 17096196 1504788 92% /
udev 10240 0 10240 0% /dev
snip
/dev/sdb1 29823024 29712544 110480 99% /media/USB3.0
清单 10-4:使用 df 获取磁盘和挂载设备上的信息
这里的第一行输出我们得到的信息显示类别标题,磁盘空间以 1KB 块的形式给出。在第二行,我们看到 rootfs 有 19,620,732 个 1 千字节的块,其中使用了 17,096,196 个块(约占 92%),剩下 1,504,788 个可用。df命令还告诉我们这个文件系统安装在文件系统/根目录。
在最后一行,你可以看到我的 u 盘。注意,它被指定为/dev/sdb1,几乎 100%已满,挂载在/media/USB3.0。
综上所述,我在这个系统上的虚拟磁盘被指定为 sda1,它的信息如下:
sd SATA 硬盘
一个硬盘驱动器
驱动器上的第一个分区
我的 64GB 闪存驱动器指定为 sdb1,我的外部驱动器指定为 sdc1。
检查错误
fsck命令(文件系统检查的缩写)检查文件系统的错误并修复损坏(如果可能的话),或者将错误区域放入一个错误块表中,将其标记为错误。要运行fsck命令,需要指定文件系统类型(默认为 ext2)和要检查的设备文件。重要的是,在运行文件系统检查之前,必须卸载驱动器。如果卸载挂载的设备失败,将收到清单 10-5 所示的错误消息。
kali >fsck
fsck from utillinux 2.20.1
e2fsck 1.42.5 (29Jul2012)
/dev/sda1 is mounted
e2fsck: Cannot continue, aborting.
清单 10-5:尝试(失败)在挂载的驱动器上运行错误检查
因此,执行文件系统检查的第一步是卸载设备。在这种情况下,我将卸载我的闪存驱动器做一个文件系统检查:
kali >umount /dev/sdb1
我可以添加-p选项,让 fsck 自动修复设备的任何问题,如:
kali >fsck -p /dev/sdb1
在设备卸载后,我现在可以检查设备的任何坏扇区或其他问题,如下:
kali >fsck -p /dev/sdb1
fsck from utillinux 2.30.2
exfatfsck 1.2.7
Checking file system on /dev/sdb1.
File system version 1.0
Sector size 512 bytes
Cluster size 32 KB
Volume size 7648 MB
Used space 1265 MB
Available space 6383 MB
Totally 20 directories and 111 files.
File system checking finished. No errors found.
总结
理解 Linux 如何设计和管理它的设备对于任何 Linux 用户和黑客来说都是至关重要的。黑客需要知道哪些设备被连接到一个系统,以及有多少可用空间。由于存储设备经常出现错误,我们可以使用fsck检查和修复这些错误。dd命令能够创建设备的物理副本,包括任何已删除的文件。