[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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值