/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). 

外部链接