/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))在类Unix系统中是一种伪设备,这种设备使得文件可以如同块设备一般被访问。

在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载

这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。如果挂载目录中本身有文件,这些文件在挂载后将被禁止使用。

一个循环设备或许能允许在重定向过程中进行一些数据处理。例如,设备可能是一个被加密文件的解密形式。在这种情况下,与循环设备相关的文件可能是另一种伪设备。当设备包含加密文件系统时,这种数据处理十分有用。如果数据处理得到支持且原文件被加密,循环设备将是此加密文件的解密形式并且设备可以如同普通文件系统一般被挂载。

循环挂载的使用

在挂载了含有文件系统的文件之后,存储于该文件系统中的文件不需要特殊函数的支持便可以被常规的文件系统接口或是系统访问。例如在应用程序中读写光盘镜像文件。

应用包括管理与编辑文件系统镜像以提供日后使用(尤其是CD、DVD镜像或是安装系统)或是在实际应用中永久隔离一些数据(例如在可移动媒体上模拟一个更快,更方便的硬盘或封装加密的文件系统)。

循环设备提供了在单个文件中安装操作系统一种便捷方法,使得安装操作系统不必为磁盘驱动器重新分区。

可用性

在各种操作系统中循环设备的命名存在着一些混乱。各种类Unix操作系统中,功能性的循环设备被以不同的名字命名。

在Linux中,设备名按照相应设备驱动程序的符号表项进行命名。这些设备被叫做“loop”设备,设备节点通常命名为/dev/loop0, /dev/loop1之类。 静态设备目录可以用makedev脚本创建,或者动态地由设备文件系统(udev)设施创建。 循环设备的管理界面是 losetup,这是util-linux软件包的一部分。

有时,循环设备被错误地认为是回环设备,但是这个术语在Linux内核中是为网络设备保留的(参见回环网卡)。循环设备的概念和回环设备不同,虽然在名字上有相似的地方。

NetBSDOpenBSD等BSD所派生的系统中,循环设备被称为“虚拟节点设备”或“vnd”,并且设备被置于 /dev/vnd0, /dev/rvnd0/dev/svnd0等处。在文件系统中,使用vnconfig程序来进行配置。

FreeBSD在发行版5之前和其他BSD系统一样遵守约定,之后循环设备便被纳入记忆磁盘设备("md")。目前使用mdconfig[1]程序进行配置。

Solaris/OpenSolaris中,循环设备被称为 "回环文件接口" 或 lofi,[2] 位于 /dev/lofi/1等处。SunOS 拥有 lofiadm 配置程序。"lofi"驱动程序支持只读压缩和可读写的加密。 自从1988年夏季开始更有SunOS/Solaris平台的第三方驱动 "fbk"[3] (文件模拟块设备,英文:File emulates Blockdevice)

Mac OS X实现了一个原生的镜像挂载机制并作为其随机访问磁盘设备的抽象。这些设备如同普通设备一样出现在 /dev 中,读写操作被送往一个用户模式的辅助进程,并由辅助进程负责读取和写入的操作。在用户界面中当打开磁盘镜像的时候自动被启用。这可以处理多种格式的盘片、CD-ROM 或 DVD 镜像。

Microsoft Windows操作系统上并不能原生支持循环挂载(直到Windows 7,这个功能才被原生实现,并通过工具diskpart进行工作)。 [4] 然而,这项能力经常通过第三方程序得以实现,例如Daemon ToolsAlcohol 120% VMware页面存档备份,存于互联网档案馆)的免费工具以及LTR Data页面存档备份,存于互联网档案馆) (ImDisk)都可以实现类似的功能。

实例

在目录上挂载包含文件系统的文件一般需要两步:

  1. 用一个循环设备节点连接文件。
  2. 在目录上挂载该循环设备

这两个操作既可以用两条命令来完成,也可以通过加上特殊的挂载符号的挂载命令来完成。第一个操作可以通过如Linux平台下的losetup[5]或者是SunOS上的lofiadm[6]命令完成。

例如,如果 example.img 是一个包含文件系统的常规文件,并且 /home/you/dir 是 Linux用户的目录,超级用户(root)或许可以通过执行如下的命令来将文件挂载在目录上:

losetup /dev/loop0 example.img
mount /dev/loop0 /home/you/dir

其中第二条命令将设备挂载于目录 /home/you/dir。执行上述语句的效果便是文件被作为文件系统挂载,文件的内容出现在被挂载的目录中(以被挂载的目录作为根目录)。

此外 mount 工具常常可以胜任整个挂载的程序:

mount -o loop example.img /home/you/dir

之后设备便能用下列命令实现卸载:

umount /home/you/dir
# 或者通过诸如 mount | grep "/home/you/dir" 
# 或是 losetup -a | grep example.img 的查找找到与文件相关联的loop设备号码
# 并执行下列命令:(<N>代表设备号)
umount /dev/loop<N> 

在较底层的应用程序接口中,文件的关联与解除关联通过在循环设备上的ioctl 系统调用来实现。

参见

引用

  1. ^ mdconfig—configure and enable memory disks, FreeBSD manual page. [2011-02-01]. (原始内容存档于2020-10-23). 
  2. ^ 存档副本. [2009-09-28]. (原始内容存档于2010-12-30). 
  3. ^ 存档副本. [2011-02-01]. (原始内容存档于2004-08-25). 
  4. ^ See for example: DiskPart: vdisk create select attach页面存档备份,存于互联网档案馆), install and boot Windows 7 from virtual disk drive页面存档备份,存于互联网档案馆) and other relative articles on this thematics.
  5. ^ losetup manual page. [2011-02-01]. (原始内容存档于2016-03-13). 
  6. ^ lofiadm, Sun System Administration Command manual. [2011-02-01]. (原始内容存档于2009-05-02). 

外部链接