loopback_device

回环设备(loop-backdevices)

回环设备('loopback device')允许用户以一个普通磁盘文件虚拟一个块设备。设想一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。(当然,disk-image 必须存在于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)回环设备允许你这样使用一个普通文件。

回环设备以/dev/loop0、/dev/loop1等命名。每个设备可虚拟一个块设备。注意只有超级用户才有权限设置回环设备。

回环设备的使用与其它任何块设备相同。特别是,你可以在这个设备上创建文件系统并像普通的磁盘一样将它挂载在系统中。这样的一个将全部内容保存在一个普通文件中的文件系统,被称为虚拟文件系统(virtual file system)(译者注:这个用法并不常见。VFS 通常另有所指,如指代 Linux 内核中有关文件系统抽象的代码层次等)。

可以通过下列步骤创建一个虚拟文件系统并通过回环设备挂载:

创建一个用于承载虚拟文件系统的空文件。这个文件的大小将成为挂载后文件系统的大小。
创建指定大小文件的简单方法是通过 dd 命令。这个命令以块为单位(通常为 512 字节)从一个文件向另一个文件复制数据。/dev/zero 文件则是一个很好的数据来源。
要建立一个 10 MB 大的名为 disk-image 的文件可以通过以下命令:
% dd if=/dev/zeroof=/tmp/disk-image count=20480

20480+0 records in
20480+0 records out
% ls -l/tmp/disk-image
-rw-rw----    1 root      root      10485760 Mar   8 01:56 /tmp/disk-image
这个新建立的文件被填满了 0 字节。在挂载之前,必须在其上建立一个文件系统。这个过程会建立许多用于组织和存储文件的控制单元并构造根目录结构。
在这个磁盘映像之上可以构建任何类型的文件系统。以创建 ext2 文件系统为例(ext2 是 Linux 系统中最常见的文件系统),用 mke2fs 可以完成这个操作。因为这个命令通常是针对块设备进行操作,当对一个普通文件操作时它会要求确认:
% mke2fs -q/tmp/disk-image

mke2fs 1.18,11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
disk-image is not ablock special device.
Proceed anyway?(y,n) y
这里 -q 参数用于省略输出有关新建立文件系统的概要信息。如果你想看到这些信息,则请省略这个参数。
现在disk-image 文件包含了一个新建立的文件系统,正如一个被刚刚初始化完毕的 10 MB 大小的磁盘。
以一个环回设备挂载这个文件系统。方法是使用 mount 命令,指定磁盘文件为被挂载的设备。同时指定 loop=loopback-device 作为 -o 选项的参数,告诉 mount 命令使用哪个回环设备。
下面例子中的命令可用于挂载我们的 disk-image 文件系统。要记住的是只有超级用户可以使用环回设备。第一个命令将创建一个目录 /tmp/virtual-fs,这个目录将被用于挂载我们的文件系统。
% mkdir /tmp/virtual-fs

% mount -oloopback=/dev/loop0 /tmp/disk-image /tmp/virtual-fs
这时,这个设备应该已经被挂载,就如同一个普通的 10M 空间的磁盘一样。
% df -h/tmp/virtual-fs

Filesystem  Size Used Avail Use% Mounted on
/tmp/disk-image9.7M 13k 9.2M 0% /tmp/virtual-fs
你可以向任何其它磁盘一样使用这个设备:
% cd /tmp/virtual-fs

% echo 'Hello,world!' > test.txt
% ls -l
total 19
drwxr-xr-x2   root root 12288 Mar 8 02:00 lost+found
-rw-rw----1   root root     14 Mar 8 02:12 test.txt
% cat test.txt
Hello, world!
请注意lost+found 是一个由 mke2fs自动建立的文件夹一旦文件系统被破坏,部分数据被回复但没有与任何文件关联起来,将被放置在这个文件夹中。。
结束使用后,卸载这个文件系统:
% cd /tmp

% umount/tmp/virtual-fs
你可以删除disk-image,或者之后再次挂载并使用其中的文件。你甚至可以将这个文件复制到远程主机并在那里挂载、使用——文件系统的内容完全不会受到影响。
除了从新创建一个文件系统,还可以从一个现有的文件系统复制而得到一份映像。例如,可以通过普通的复制操作为一个 CD-ROM 创建一份映像。

如果系统中有一个 IDE 接口的 CD-ROM 驱动器,使用前面说过的设备名如 /dev/hda。如果 CD-ROM 是 SCSI 接口的话,设备文件名可能是 /dev/scd0 之类。系统中也可能包含一个符号链接 /dev/cdrom 指向实际的光驱。请参考 /etc/fstab (译者注: 手册)查看系统实际使用的光驱对应的设备。

接下来要做的仅仅是将这个设备复制为一个文件——得到的文件将是被存在硬盘上的、这个 CD-ROM 内容的完整映像。例如:

% cp /dev/cdrom/tmp/cdrom-image

取决于设备的速度和 CD-ROM的容量,这个操作可能需要几分钟的时间。最终的文件将会相当大,它的体积与这个 CD-ROM 的容量相同。

这时,你可以在系统中挂载这个光盘而无须插入原始的 CD-ROM 盘片。要挂载在 /mnt/cdrom 目录下:

mount -oloopback=/dev/loop0 /tmp/cdrom-image /mnt/cdrom

因为映像位于磁盘上,这个文件系统的速度将远胜于直接挂载自实际光驱的时候。请注意多数光盘使用的文件系统类型都是   iso9660

代码的意思是把AUDIO_DEVICE_LIST_DEF(V)替换为 AUDIO_DEVICE_LIST_UNIQUE_DEF(V) \ V(AUDIO_DEVICE_OUT_AUX_DIGITAL, AUDIO_DEVICE_OUT_HDMI) \ V(AUDIO_DEVICE_OUT_STUB, AUDIO_DEVICE_OUT_DEFAULT) \ V(AUDIO_DEVICE_IN_VOICE_CALL, AUDIO_DEVICE_IN_TELEPHONY_RX) \ V(AUDIO_DEVICE_IN_AUX_DIGITAL, AUDIO_DEVICE_IN_HDMI) \ V(AUDIO_DEVICE_IN_STUB, AUDIO_DEVICE_IN_DEFAULT) 其中#define AUDIO_DEVICE_LIST_UNIQUE_DEF(V) \ V(AUDIO_DEVICE_NONE, 0x0u) \ V(AUDIO_DEVICE_OUT_EARPIECE, 0x1u) \ V(AUDIO_DEVICE_OUT_SPEAKER, 0x2u) \ V(AUDIO_DEVICE_OUT_WIRED_HEADSET, 0x4u) \ V(AUDIO_DEVICE_OUT_WIRED_HEADPHONE, 0x8u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_SCO, 0x10u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET, 0x20u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, 0x40u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP, 0x80u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, 0x100u) \ V(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, 0x200u) \ V(AUDIO_DEVICE_OUT_HDMI, 0x400u) \ V(AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET, 0x800u) \ V(AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET, 0x1000u) \ V(AUDIO_DEVICE_OUT_USB_ACCESSORY, 0x2000u) \ V(AUDIO_DEVICE_OUT_USB_DEVICE, 0x4000u) \ V(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, 0x8000u) \ V(AUDIO_DEVICE_OUT_TELEPHONY_TX, 0x10000u) \ V(AUDIO_DEVICE_OUT_LINE, 0x20000u) \ V(AUDIO_DEVICE_OUT_HDMI_ARC, 0x40000u) \ V(AUDIO_DEVICE_OUT_HDMI_EARC, 0x40001u) \ V(AUDIO_DEVICE_OUT_SPDIF, 0x80000u) \ V(AUDIO_DEVICE_OUT_FM, 0x100000u) \ V(AUDIO_DEVICE_OUT_AUX_LINE, 0x200000u) \ V(AUDIO_DEVICE_OUT_SPEAKER_SAFE, 0x400000u) \ V(AUDIO_DEVICE_OUT_IP, 0x800000u) \ V(AUDIO_DEVICE_OUT_BUS, 0x1000000u) \ V(AUDIO_DEVICE_OUT_PROXY, 0x2000000u) \ V(AUDIO_DEVICE_OUT_USB_HEADSET, 0x4000000u) \ V(AUDIO_DEVICE_OUT_HEARING_AID, 0x8000000u) \ V(AUDIO_DEVICE_OUT_ECHO_CANCELLER, 0x10000000u) \ V(AUDIO_DEVICE_OUT_BLE_HEADSET, 0x20000000u) \ V(AUDIO_DEVICE_OUT_BLE_SPEAKER, 0x20000001u) \ V(AUDIO_DEVICE_OUT_BLE_BROADCAST, 0x20000002u) \ V(AUDIO_DEVICE_OUT_DEFAULT, AUDIO_DEVICE_BIT_DEFAULT) \ V(AUDIO_DEVICE_IN_COMMUNICATION, AUDIO_DEVICE_BIT_IN | 0x1u) \ V(AUDIO_DEVICE_IN_AMBIENT, AUDIO_DEVICE_BIT_IN | 0x2u) \ V(AUDIO_DEVICE_IN_BUILTIN_MIC, AUDIO_DEVICE_BIT_IN | 0x4u) \ V(AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_BIT_IN | 0x8u) \ V(AUDIO_DEVICE_IN_WIRED_HEADSET, AUDIO_DEVICE_BIT_IN | 0x10u) \ V(AUDIO_DEVICE_IN_HDMI, AUDIO_DEVICE_BIT_IN | 0x20u) \ V(AUDIO_DEVICE_IN_TELEPHONY_RX, AUDIO_DEVICE_BIT_IN | 0x40u) \ V(AUDIO_DEVICE_IN_BACK_MIC, AUDIO_DEVICE_BIT_IN | 0x80u) \ V(AUDIO_DEVICE_IN_REMOTE_SUBMIX, AUDIO_DEVICE_BIT_IN | 0x100u) \ V(AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET, AUDIO_DEVICE_BIT_IN | 0x200u) \ V(AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET, AUDIO_DEVICE_BIT_IN | 0x400u) \ V(AUDIO_DEVICE_IN_USB_ACCESSORY, AUDIO_DEVICE_BIT_IN | 0x800u) \ V(AUDIO_DEVICE_IN_USB_DEVICE, AUDIO_DEVICE_BIT_IN | 0x1000u) \ V(AUDIO_DEVICE_IN_FM_TUNER, AUDIO_DEVICE_BIT_IN | 0x2000u) \ V(AUDIO_DEVICE_IN_TV_TUNER, AUDIO_DEVICE_BIT_IN | 0x4000u) \ V(AUDIO_DEVICE_IN_LINE, AUDIO_DEVICE_BIT_IN | 0x8000u) \ V(AUDIO_DEVICE_IN_SPDIF, AUDIO_DEVICE_BIT_IN | 0x10000u) \ V(AUDIO_DEVICE_IN_BLUETOOTH_A2DP, AUDIO_DEVICE_BIT_IN | 0x20000u) \ V(AUDIO_DEVICE_IN_LOOPBACK, AUDIO_DEVICE_BIT_IN | 0x40000u) \ V(AUDIO_DEVICE_IN_IP, AUDIO_DEVICE_BIT_IN | 0x80000u) \ V(AUDIO_DEVICE_IN_BUS, AUDIO_DEVICE_BIT_IN | 0x100000u) \ V(AUDIO_DEVICE_IN_PROXY, AUDIO_DEVICE_BIT_IN | 0x1000000u) \ V(AUDIO_DEVICE_IN_USB_HEADSET, AUDIO_DEVICE_BIT_IN | 0x2000000u) \ V(AUDIO_DEVICE_IN_BLUETOOTH_BLE, AUDIO_DEVICE_BIT_IN | 0x4000000u) \ V(AUDIO_DEVICE_IN_HDMI_ARC, AUDIO_DEVICE_BIT_IN | 0x8000000u) \ V(AUDIO_DEVICE_IN_HDMI_EARC, AUDIO_DEVICE_BIT_IN | 0x8000001u) \ V(AUDIO_DEVICE_IN_ECHO_REFERENCE, AUDIO_DEVICE_BIT_IN | 0x10000000u) \ V(AUDIO_DEVICE_IN_BLE_HEADSET, AUDIO_DEVICE_BIT_IN | 0x20000000u) \ V(AUDIO_DEVICE_IN_DEFAULT, AUDIO_DEVICE_BIT_IN | AUDIO_DEVICE_BIT_DEFAULT)
最新发布
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值