如何在 Linux 上创建循环设备如何在 Linux 上创建循环设备如何在 Linux 上创建循环设备如何在 Linux 上创建循环设备
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 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 上创建和分离循环设备。

©2015-2025 艾丽卡 support@alaica.com