如何在 Linux 上创建循环设备
循环设备是一种伪设备,它不对应于真实的物理块设备,但可用于使文件出现并像文件一样对待。要管理Linux上的循环设备,我们可以使用losetup命令:该实用程序让我们创建新的循环设备,分离它们并检索有关现有循环设备的信息。
在本文中,我们学习如何使用 losetup 来执行上述操作。
在本教程中您将学习:
什么是循环设备
如何检索有关现有循环设备的信息
如何创建循环设备
如何分离循环设备
使用的软件要求和约定
介绍丢失设置
在 Linux 上,losetup
命令是我们用来与循环设备交互的命令:我们可以用它来创建、列出和删除它们。该命令是大多数 Linux 发行版核心包的一部分,因此无需显式安装它。首先,让我们开始看看如何检索有关现有循环设备状态的信息。
检索有关现有循环设备的信息
要列出系统中存在的循环设备并获取其状态,我们所要做的就是调用 losetup
而不指定任何选项或参数,或者更明确地,使用 --列表选项。为了本教程的目的,我已经创建了一个循环设备:/dev/loop0
:
$ losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 0 0 /home/egdoc/Downloads/block0 0 512
当我们像上面那样调用 losetup
时,会报告所有现有循环设备的信息。如果我们想调查特定循环设备的状态,我们必须将其作为参数传递给命令。例如,要仅获取有关 /dev/loop0
设备的信息,我们将运行:
$ losetup /dev/loop0
正如我们在上面看到的,该命令的输出默认包含 7 列:
COLUMN NAME | INFORMATION |
---|---|
NAME | The name of the loop device |
SIZELIMIT | The size limit of the file in bytes |
OFFSET | The offset from the beginning |
AUTOCLEAR | The status of the “autoclear” flag (we will talk about this later) |
RO | Whether the device is read-only or not |
BACK-FILE | The file associated with the loop device |
DIO | Whether access to the backing file with direct-io is active or not |
LOG-SEC | The size of the logical sector expressed in bytes |
还有其他可用的列,默认情况下不显示:
COLUMN NAME | INFORMATION |
---|---|
BACK-INO | The inode of the backing file |
BACK-MAJ:MIN | The backing file major:minor device number |
MAJ:MIN | The loop device major:minor number |
可以使用 -o
选项(--output
的缩写)指定必须包含在输出中的列。例如,要仅包含 NAME
和 BACK-FILE
列,我们将运行:
$ losetup --output=NAME,BACK-FILE /dev/loop0
我们将获得以下输出:
NAME BACK-FILE
/dev/loop0 /home/egdoc/Downloads/block0
要包含所有可用列,我们可以简单地使用--output-all
选项。正如我们在上面看到的,losetup 生成的输出被格式化为列表。但是,我们可以选择将其格式化为 JSON:如果我们打算稍后使用其他编程语言解析检索到的信息,这会特别有用。我们所要做的就是使用 --json
选项。以下是输出的变化方式:
$ losetup --json --list /dev/loop0
{
"loopdevices": [
{
"name": "/dev/loop0",
"sizelimit": 0,
"offset": 0,
"autoclear": false,
"ro": false,
"back-file": "/home/egdoc/Downloads/block0",
"dio": false,
"log-sec": 512
}
]
}
创建循环设备
让我们看看如何创建一个新的循环设备。首先,我们需要创建将被视为块设备的文件。要创建一个仅由 0s
组成的文件,我们可以使用 dd
和 /dev/zero
作为输入。我们将通过指定块大小为 1M
并写入 5120
来创建一个名为 blockfile
、大小为 5GiB
的文件。块:
$ dd if=/dev/zero of=blockfile bs=1M count=5120
任务结束后,dd 将响应以下输出:
5120+0 records in
5120+0 records out
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 28.8846 s, 186 MB/s
下一步是实际创建循环设备。正如我们已经说过的,我们使用 losetup 来执行任务。要使用的语法非常简单:我们提供循环设备的名称作为第一个参数,以及我们想要映射到它的文件的路径作为第二个参数:
$ sudo losetup /dev/loop0 blockfile
在某些情况下,特定的循环设备可能已在使用中。例如,在本例中,我们知道 /dev/loop0
已被我作为示例创建的块设备使用。我们怎样才能知道该使用什么?要查找第一个未使用的块设备,我们可以使用 -f
选项(--find
的缩写)调用 losetup
:
$ sudo losetup -f blockfile
如果使用 -f 选项调用 losetup,而不带任何其他参数,它将仅返回第一个可用块设备的名称,而不是实际映射文件:
$ sudo losetup -f
/dev/loop1
创建循环设备时我们要使用的另一个有用选项是 -P 或 --partscan :这将强制内核重新扫描现有分区表。创建循环设备后,它将与任何其他块设备一样列出。例如,它包含在 lsblk
的输出中(在 TYPE
列中,您可以看到该设备被报告为“loop”):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop1 7:1 0 5G 0 loop
[...]
我们可以像任何其他块设备一样使用循环设备:我们可以在其上创建分区表、分区和文件系统,例如:
$ sudo parted -s /dev/loop1 mklabel msdos
$ sudo parted -s /dev/loop1 mkpart primary 1MiB 100%
$ sudo mkfs.ext4 /dev/loop1p1
请注意,一旦创建,循环设备的第一个分区就如何用 p1
表示法报告。在示例中,我们在其上创建了一个 ext4 文件系统,现在可以照常安装:
$ sudo mount /dev/loop1p1 /mnt
在 Linux 上自动创建循环设备的一个典型情况是当我们挂载 ISO 文件时,例如发行版安装程序映像(当然,iso 文件以只读模式挂载):
$ sudo mount Fedora-Server-netinst-x86_64-35-1.2.iso /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
一旦安装了 iso,就可以轻松访问其中的文件:
ls -l /mnt
total 11
drwxrwxr-x. 1 root root 2048 Oct 26 04:14 EFI
-rw-r--r--. 1 root root 2574 Oct 11 19:31 Fedora-Legal-README.txt
drwxrwxr-x. 1 root root 2048 Oct 26 04:14 images
drwxrwxr-x. 1 root root 2048 Oct 26 04:14 isolinux
-rw-r--r--. 1 root root 1063 Oct 11 19:29 LICENSE
分离循环设备
要分离循环设备,我们所要做的就是调用 losetup
以及 -d
选项,这是 --detach
的缩写> 并传递我们想要分离的循环设备的路径。要分离 /dev/loop0 设备,我们将运行:
$ sudo losetup -d /dev/loop0
如果我们想要分离所有现有的循环设备,我们可以使用 -D
选项(大写“d”),或长 --detach-all
版本。在最新的 Linux 内核版本(>=3.7)上,如果我们分离系统正在使用的循环设备,例如挂载其上存在的一个或多个分区,则不会返回错误;设备的 AUTOCLEAR 标志将被设置为 1,并且设备将在稍后被销毁(此功能称为“延迟销毁”):
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 1 0 /home/egdoc/blockfile 0 512
结束语
在本教程中,我们了解了什么是循环设备,了解了如何检索有关 Linux 上现有循环设备的信息,以及如何使用 losetup 实用程序在 Linux 上创建和分离循环设备。