[linux] losetup 命令


功能

inux losetup 命令用于设置循环设备。

循环设备可把文件虚拟成区块设备,籍以模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。

Linux循环设备 ​​/dev/loop​​ 解析

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

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

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

语法

​losetup [-d][-e <加密方式>][-o <平移数目>][循环设备代号][文件]​

参数:

-d 卸除设备。
-e<加密方式> 启动加密编码。
-o<平移数目> 设置数据平移的数目。

操作示例

  1. 创建空的磁盘镜像文件,这里创建一个1.44M的软盘
$ dd if=/dev/zero of=floppy.img bs=512 count=2880
  1. 使用 losetup将磁盘镜像文件虚拟成块设备
$ losetup /dev/loop1 floppy.img
  1. 挂载块设备
$ mount /dev/loop0 /tmp

经过上面的三步之后,我们就可以通过/tmp目录,像访问真实块设备一样来访问磁盘镜像文件​​floppy.img​​。

  1. 卸载loop设备
$ umount /tmp
$ losetup -d /dev/loop1

测试实例

  1. 首先创建一个 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
  1. 对该文件格式化为 ext4 格式:
# mkfs.ext4 loopfile.img
  1. 用 file 命令查看下格式化后的文件类型:
# file loopfile.img
loopfile.img: Linux rev 1.0 ext4 filesystem data, UUID=a9dfb4a0-6653-4407-ae05-7044d92c1159 (extents) (large files) (huge files)
  1. 准备将上面的文件挂载起来:
# 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
  1. 卸载挂载点:
# 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