[linux] losetup 命令
- 功能
- 测试实例
- 附录
功能
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