[linux] losetup 命令
功能
Linux循环设备 `/dev/loop` 解析
语法
操作示例
测试实例
附录
功能
inux losetup 命令用于设置循环设备。
循环设备可把文件虚拟成区块设备,籍以模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。
Linux循环设备 /dev/loop 解析
/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
这种设备文件经常被用于光盘或是磁盘镜像(IOS、IMG)。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。
语法
losetup [-d][-e <加密方式>][-o <平移数目>][循环设备代号][文件]
参数:
-d 卸除设备。 -e<加密方式> 启动加密编码。 -o<平移数目> 设置数据平移的数目。
操作示例
- 创建空的磁盘镜像文件,这里创建一个1.44M的软盘
$ dd if=/dev/zero of=floppy.img bs=512 count=2880
- 使用 losetup将磁盘镜像文件虚拟成块设备
$ losetup /dev/loop1 floppy.img
- 挂载块设备
$ mount /dev/loop0 /tmp
- 经过上面的三步之后,我们就可以通过/tmp目录,像访问真实块设备一样来访问磁盘镜像文件floppy.img。
- 卸载loop设备
$ umount /tmp $ losetup -d /dev/loop1
测试实例
- 首先创建一个 1G 大小的空文件:
# dd if=/dev/zero of=loopfile.img bs=1G count=1 1+0 records in 1+0 records out 1073741824 bytes (1.1 GB) copied, 69.3471 s, 15.5 MB/s
- 对该文件格式化为 ext4 格式:
# mkfs.ext4 loopfile.img
- 用 file 命令查看下格式化后的文件类型:
# file loopfile.img loopfile.img: Linux rev 1.0 ext4 filesystem data, UUID=a9dfb4a0-6653-4407-ae05-7044d92c1159 (extents) (large files) (huge files)
- 准备将上面的文件挂载起来:
# mkdir /mnt/loopback # mount -o loop loopfile.img /mnt/loopback
- mount 命令的 -o loop 选项可以将任意一个 loopback 文件系统挂载。
- 上面的 mount 命令实际等价于下面两条命令:
# losetup /dev/loop0 loopfile.img # mount /dev/loop0 /mnt/loopback
- 因此实际上,mount -o loop 在内部已经默认的将文件和 /dev/loop0 挂载起来了。
- 然而对于第一种方法(mount -o loop)并不能适用于所有的场景。比如,我们想创建一个硬盘文件,然后对该文件进行分区,接着挂载其中一个子分区,这时就不能用 -o loop 这种方法了。因此必须如下做:
# losetup /dev/loop1 loopfile.img # fdisk /dev/loop1
- 卸载挂载点:
# umount /mnt/loopback
附录
这里,列出一个用来导入新的系统镜像,并且加载的操作,也是用到了 losetup 命令完成的镜像文件挂载,具体如下:
#!/bin/sh # 脚本使用方式 : get_img.sh [curos] [uname] [osid] [orgos] [servIP] # 参数准备 export DEFAULT_IFACE=eth0 export DISKDIR=/mnt/disk export TCDIR=/usr/sbin/tc export BOOT_FILE=$DISKDIR/osenv.inf export BOOT_FILE2=$DISKDIR/osenv1.inf export XPDATA_IMG=tempdata.img if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" ] ; then echo "Usage: get_img.sh <curimg> <username> <osid> <orgimg>" exit 1 fi IFACE=$DEFAULT_IFACE if [ -f $IFACE_FILE ] ; then IFACE=`cat $IFACE_FILE` fi if [ "x$2" != "xadmin" ] ; then echo "not admin, del mdf/udf" rm -f $DISKDIR/$4-$2.udf $DISKDIR/$4-$2.mdf fi if [ ! -f $DISKDIR/$4-$2.udf -o ! -f $DISKDIR/$4-$2.mdf ] ; then $TCDIR/createMdfUdf $DISKDIR/$4 $2 $DISKDIR if [ $? -ne 0 ] ; then echo "create mdf/udf failed" exit 12 fi fi fdisk -l $DISKDIR/$4 | grep -i "EFI system" if [ $? -eq 0 ] ; then echo "UEFI OS image" ln -sf /usr/sbin/tc/kloader.uefi /usr/sbin/tc/kloader else echo "Legacy OS image" ln -sf /usr/sbin/tc/kloader.legacy /usr/sbin/tc/kloader fi # for offline mode cp $DISKDIR/$2-$4.osenv1 $BOOT_FILE if [ -f $DISKDIR/$2-$4.osenv2 ] ; then # for offline mode cp $DISKDIR/$2-$4.osenv2 $BOOT_FILE2 else # add for centerm echo "create disk-D for none p-user" XPDATA_MDF=$XPDATA_IMG-x.mdf XPDATA_UDF=$XPDATA_IMG-x.udf if [ ! -f $DISKDIR/$XPDATA_IMG ] ; then dd if=/dev/zero of=$DISKDIR/$XPDATA_IMG seek=6143 bs=1M count=1 losetup /dev/loop0 $DISKDIR/$XPDATA_IMG fdisk /dev/loop0 <<EOT EOT mkfs.ntfs -f /dev/loop0p1 losetup -d /dev/loop0 fi $TCDIR/createMdfUdf $DISKDIR/$XPDATA_IMG x $DISKDIR echo "BASEIMG:\\Device\\Harddisk0\\Partition1\\$XPDATA_IMG" >$BOOT_FILE2 echo "UDFIMG:\\Device\\Harddisk0\\Partition1\\$XPDATA_UDF" >>$BOOT_FILE2 echo "MDFIMG:\\Device\\Harddisk0\\Partition1\\$XPDATA_MDF" >>$BOOT_FILE2 fi exit 0