摘要:在进行测试的时候,我们往往需要新建一些磁盘分区或者设备等,此时对硬盘进行重新划分往往不太方面。这种情况下,我们可以通过伪设备来实现循环挂载,从而达到目的。本文主要为你讲解什么是循环挂载,什么是虚拟设备,设备和文件系统有什么关系。
在类Unix系统中,/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
这种设备文件经常被用于光盘或是磁盘镜像。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。
在各种操作系统中循环设备的命名存在着一些混乱。各种类Unix操作系统中,功能性的循环设备被以不同的名字命名。
在Linux中,设备名按照相应设备驱动程序的符号表项进行命名。这些设备被叫做”loop“设备,设备节点通常命名为/dev/loop0, /dev/loop1之类。 静态设备目录可以用makedev脚本创建,或者动态地由设备文件系统(udev)设施创建。 循环设备的管理界面是 losetup,这是util-linux软件包的一部分。
有时,循环设备被错误地认为是回环设备,但是这个术语在Linux内核中是为网络设备保留的(参见回环设备)。循环设备的概念和回环设备不同,虽然在名字上有相似的地方。
在NetBSD和OpenBSD等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 Tools 和 Alcohol 120% VMware的免费工具以及LTR Data (ImDisk)都可以实现类似的功能
在目录上挂载包含文件系统的文件一般需要两步:
这两个操作既可以用两条命令来完成,也可以通过加上特殊的挂载符号的挂载命令来完成。第一个操作可以通过如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 系统调用来实现。
在类Unix操作系统中,设备文件系统允许软件通过标准输入输出系统调用与驱动程序交互,从而简化了许多任务。
设备文件系统包括设备文件、设备节点、设备特定文件,它们是驱动程序的接口,而在文件系统中,它们就像是普通文件。
块设备是指与系统间用块的方式移动数据的设备。这些设备节点通常代表可寻址设备,如硬盘、CD-ROM和内存区域。
块设备通常支持随机存取和寻址,并使用缓存器。操作系统为输入输出分配了缓存以存储一块数据。当程序向设备发送了读取或者写入数据的请求时,系统把数据中的每一个字符存储在适当的缓存中。当缓存被填满时,会采取适当的操作(把数据传走),而后系统清空缓存。
字符设备是指每次与系统传输1个字符的设备。这些设备节点通常为传真、虚拟终端和串口调制解调器之类设备提供流通信服务,它通常不支持随机存取数据。
字符设备在实现时,大多不使用缓存器。系统直接从设备读取/写入每一个字符。
在类Unix操作系统中,设备节点并不一定要对应物理设备。没有这种对应关系的设备是伪设备。操作系统运用了它们提供的多种功能。部份經常使用到的偽設備包括:
/dev/null
/dev/full
/dev/loop
/dev/zero
/dev/random
/dev/urandom
6.1dd命令
dd - convert and copy a file
bs=BYTES
read and write up to BYTES bytes at a time
if:inputfile
of:outputfile
6.2losetup命令
losetup - set up and control loop devices
Delete loop:
losetup -d loopdev...
Print name of first unused loop device:
losetup -f