您的位置:首页 > 运维架构

/dev/loop与设备文件系统

2013-08-15 19:40 260 查看
摘要:在进行测试的时候,我们往往需要新建一些磁盘分区或者设备等,此时对硬盘进行重新划分往往不太方面。这种情况下,我们可以通过伪设备来实现循环挂载,从而达到目的。本文主要为你讲解什么是循环挂载,什么是虚拟设备,设备和文件系统有什么关系。

1.循环挂载

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

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

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

2.可用性

在各种操作系统中循环设备的命名存在着一些混乱。各种类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
Tools 和 Alcohol 120% VMware的免费工具以及LTR
Data (ImDisk)都可以实现类似的功能

3.实例

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

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

这两个操作既可以用两条命令来完成,也可以通过加上特殊的挂载符号的挂载命令来完成。第一个操作可以通过如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 系统调用来实现。

4.设备文件

类Unix操作系统中,设备文件系统允许软件通过标准输入输出系统调用与驱动程序交互,从而简化了许多任务。

设备文件系统包括设备文件、设备节点、设备特定文件,它们是驱动程序接口,而在文件系统中,它们就像是普通文件

5.设备

5.1块设备

块设备是指与系统间用块的方式移动数据的设备。这些设备节点通常代表可寻址设备,如硬盘CD-ROM内存区域。

块设备通常支持随机存取和寻址,并使用缓存器。操作系统为输入输出分配了缓存以存储一块数据。当程序向设备发送了读取或者写入数据的请求时,系统把数据中的每一个字符存储在适当的缓存中。当缓存被填满时,会采取适当的操作(把数据传走),而后系统清空缓存。

5.2字符设备

字符设备是指每次与系统传输1个字符的设备。这些设备节点通常为传真虚拟终端和串口调制解调器之类设备提供流通信服务,它通常不支持随机存取数据。

字符设备在实现时,大多不使用缓存器。系统直接从设备读取/写入每一个字符。

5.3伪设备

在类Unix操作系统中,设备节点并不一定要对应物理设备。没有这种对应关系的设备是伪设备。操作系统运用了它们提供的多种功能。部份經常使用到的偽設備包括:

/dev/null

接受和丟棄所有輸入;即不產生任何輸出。
/dev/full

永遠在被填滿狀態的設備。
/dev/loop

Loop設備
/dev/zero

產生連續的NUL字元的串流(數值為0)。
/dev/random

產生一個虛假隨機的任意長度字元串流。(Blocking)
/dev/urandom

產生一個虛假隨機的任意長度字元串流。(Non-Blocking)

6.两个相关的linux命令

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: