1.loop设备介绍
在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。在使用之前,一个 loop 设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。
上面说的文件格式,我们经常见到的是 CD 或 DVD 的 ISO 光盘镜像文件或者是软盘(硬盘)的 *.img 镜像文件。通过这种 loop mount (回环mount)的方式,这些镜像文件就可以被 mount 到当前文件系统的一个目录下。至此,顺便可以再理解一下 loop 之含义:对于第一层文件系统,它直接安装在我们计算机的物理设备之上;而对于这种被 mount 起来的镜像文件(它也包含有文件系统),它是建立在第一层文件系统之上,这样看来,它就像是在第一层文件系统之上再绕了一圈的文件系统,所以称为 loop;循环设备可把文件虚拟成块设备,籍此来模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。
2.losetup命令基本用法
losetup --help ##查看命令帮助
losetup [ -e encryption ] [ -o offset ] loop_device file
losetup [ -d ] loop_device
-e 表示加密的方式
-o 设置数据偏移量
-d 卸载关联设备
3.使用loop虚拟设备挂载目录限制目录空间大小举例
1)创建文件系统
dd if=/dev/zero of=/root/file100.disk bs=1M count=100 ##生成100M大小文件
losetup /dev/loop100 /root/file100.disk ##把生成的文件关联到虚拟块设备
ll /dev/loop100 ##查看生成的虚拟设备
mkfs.ext3 /dev/loop100 ##以ext3格式格式化loop100虚拟设备(或者直接格式化对应的文件也行;mkfs.ext3 /root/file100.disk 需要输入y 确认 )
mkdir /data100 ##创建待挂载目录
mount /dev/loop100 /data100 ##将虚拟设备挂载到/data100目录
df -Th|grep data100 ##查看挂载情况
losetup -l loop100 ##查看loop100设备挂载对应的文件
losetup -a ##查看所有虚拟设备的关联情况
2)验证配额空间
cd /data100
dd if=/dev/zero of=file.disk1 bs=1M count=60
dd if=/dev/zero of=file.disk2 bs=1M count=60 ##再次创建60m文件失败
3)卸载
umount /data100 ##卸载
df -Th|grep data100 ##查看挂载;发现已经没有挂载
losetup -a ##查看关联;发现关联依然存在
losetup -d /dev/loop100 ##卸载loop虚拟设备与文件的关联
losetup -a ##再次查看关联;此时发现没有关联
ll /dev/loop* ##查看loop设备;发现还在
##reboot
##卸载后再次卸载即报错设备不存在;ls /dev/loop100却还在;但是需要重启Linux服务器后/dev/loop*设备文件的显示才消失;
##创建多个限制目录按照上述步骤再操作一遍即可;
##但是每次重启发现上次创建的设备消失;导致数据也会丢失!!因此需要设置为永久挂载
4)永久挂载
由于服务器重启后/dev/loop100就会丢失;因此不能在/etc/fstab下编写挂载;否则会导致设备丢失后找不到设备服务器重启之后起不来;因此只能临时挂载然后编写开机挂载脚本;
##编写开机自启脚本
vi /etc/init.d/loop100.sh ##设置挂载关联之前的文件和设备
#!/bin/bash -l
source ~/.bashrc
losetup /dev/loop100 /root/file100.disk
mount /dev/loop100 /data100
chmod 755 /etc/init.d/loop100.sh ##添加执行权限
ln -vsf /etc/init.d/loop100.sh /etc/rc5.d/S99loop100 ##设置脚本链接到root对应的运行级别下
ll /etc/rc5.d/S99loop100
##创建待验证文本文件(如果执行了上述卸载过程;先重新挂载后再创建该验证文件 )
echo 123456 > /data100/123456.txt
##reboot ##再次重启验证;
df -Th|grep data100 ##重启之后再次登陆;首先查看挂载情况
cat /data100/123456.txt ##查看文件内容
##此时开机自动挂载成功;并且文件内容依然保留;
##因此使用loop虚拟设备挂载文件限制目录大小成功!!!!
4. mount -o loop命令介绍
#前提准备:创建挂载目录、创建文件;格式化文件
mkdir /data100
dd if=/dev/zero of=/root/file100.disk bs=1M count=100
mkfs.ext3 /root/file100.disk
##挂载虚拟设备和文件
losetup /dev/loop100 /root/file100.disk
mount /dev/loop100 /data100
##可以用以下命令代替上面两条命令;-o loop 选项可以将任意一个 loopback 文件系统挂载
mount -o loop /root/file100.disk /data100
##同时挂载多个也没问题;mount -o loop可以自动设置loop名称不影响;
mkdir /data200
dd if=/dev/zero of=/root/file200.disk bs=1M count=200
mkfs.ext3 /root/file200.disk
mount -o loop /root/file200.disk /data200
df -h|grep data
##mount -o loop并不能适用于所有的场景。比如,我们想创建一个硬盘文件,然后对该文件进行分区,接着挂载其中一个子分区,这时就不能用 -o loop 这种方法;则需要先将文件进行分区;(不过此种方法不推荐;因为存在开机丢设备的情况;需要设置开机重新建分区的脚本等操作比较麻烦)
losetup /dev/loop100 /root/file100.disk
fdisk /dev/loop100 ##新建分区操作
fdisk -l /dev/loop100 ##然后查看分区情况;