循環設備不會在解除安裝時自動分離
我有一個備份腳本,我在其中解除安裝了一個 squashfs 文件,我進行備份然後再次將其安裝回去。腳本的簡化版本是:
umount /home/backup/auto/mnt/os mksquashfs /src-dir /home/backup/auto/os.sqfs.img mount -t squashfs -o loop /home/backup/auto/os.sqfs.img /home/backup/auto/mnt/os
這個想法是隨時可以訪問備份數據。
這工作了很長時間。但是,我收到一個錯誤,即沒有足夠的環回設備,並且我看到 umount 不再分離安裝有 mount 的循環設備。
最近我有兩個主要變化:
- 我將核心更新為 2.6.32-754.11.1.el6.i686
- 我將作業系統移至 SSD。
我剛剛注意到有新的核心更新 2.6.32-754.12.1.el6,所以我更新了,但它並沒有解決問題。
作業系統:CentOS 6.10 i686
更新: 這是在故障系統上:
# strace -e trace=ioctl,mount mount -t squashfs -o loop os.sqfs.img mnt/os ioctl(3, LOOP_GET_STATUS, {number=0, offset=0, flags=0, name="/home/squash/web.img", ...}) = 0 ioctl(3, LOOP_GET_STATUS, {number=0, offset=0, flags=0, name="/home/squash/web.img", ...}) = -1 ENXIO (No such device or address) ioctl(4, LOOP_SET_FD, 0x3) = 0 ioctl(4, LOOP_SET_STATUS64, {offset=0, number=0, flags=0, file_name="/home/backup/auto/os.sqfs.img", ...}) = 0 mount("/dev/loop1", "mnt/os", "squashfs", MS_MGC_VAL, NULL) = 0 +++ exited with 0 +++ # cat /etc/mtab|grep 'mnt/os' /dev/loop1 /home/backup/auto/mnt/os squashfs ro,relatime 0 0 # ls -la /etc/mtab lrwxrwxrwx. 1 root root 12 Apr 17 02:53 /etc/mtab -> /proc/mounts # notice that here there is no even the umount call. Am I missing something? # strace -e trace=ioctl,umount,mount umount mnt/os +++ exited with 0 +++
這是在另一個具有相同版本的所有系統上,但它是 64 位的:
# strace -e trace=ioctl,mount mount -t squashfs -o loop os.sqfs.img mnt/os ioctl(3, LOOP_GET_STATUS, {number=0, offset=0, flags=0, name="/storage/backup/auto/home.sqfs.img", ...}) = 0 ioctl(3, LOOP_GET_STATUS, {number=1, offset=0, flags=0, name="/storage/backup/auto/mail.sqfs.img", ...}) = 0 ioctl(3, LOOP_GET_STATUS, {number=1, offset=0, flags=0, name="/storage/backup/auto/mail.sqfs.img", ...}) = -1 ENXIO (No such device or address) ioctl(4, LOOP_SET_FD, 0x3) = 0 ioctl(4, LOOP_SET_STATUS64, {offset=0, number=0, flags=0, file_name="/storage/backup/auto/os.sqfs.img", ...}) = 0 mount("/dev/loop2", "mnt/os", "squashfs", MS_MGC_VAL, NULL) = 0 +++ exited with 0 +++ # strace -e trace=ioctl,umount,mount umount mnt/os umount("/storage/backup/auto/mnt/os", 0) = 0 ioctl(3, LOOP_CLR_FD) = 0 +++ exited with 0 +++ # losetup -a /dev/loop0: [0904]:35656625 (/storage/backup/auto/home.sqfs.img) /dev/loop1: [0904]:35656626 (/storage/backup/auto/mail.sqfs.img)
我也沒有在好的系統上看到 LO_FLAGS_AUTOCLEAR。但我確實看到了 umount 的不同。
我重新安裝
util-linux-ng
了 - 它沒有幫助。此軟體包沒有更新,也從未更新過。也許它與核心有關。我想知道為什麼它在 64 位作業系統上執行良好。我可能會安裝一個 32 位 VM 來測試它是否會這樣做。- 使固定 -
問題是我在系統複製期間使用 CentOS 7 的實時 CD 將 /etc/mtab 連結到 /proc/mounts 並且我忘記了它。我不得不重新安裝 grub,所以我 chroot 到作業系統並建立了連結,因為 grub-install 不起作用。我忘了恢復它。我通過以下方式解決了這個問題:
rm -f /etc/mtab && cat /proc/mounts |grep -v rootfs > /etc/mtab
所以它現在有效:
root@home auto# smount os.sqfs.img mnt/os root@home auto# losetup -a /dev/loop0: [0816]:7090072 (/home/squash/web.img) /dev/loop1: [0816]:7864675 (/home/backup/auto/os.sqfs.img) /dev/loop4: [0816]:7864569 (/home/backup/auto/web.sqfs.img) root@home auto# umount mnt/os root@home auto# losetup -a /dev/loop0: [0816]:7090072 (/home/squash/web.img) /dev/loop4: [0816]:7864569 (/home/backup/auto/web.sqfs.img)
這是我在 CentOS 6 中包含的 util-linux-ng 2.17.2 的原始碼中收集到的:
在小於 2.6.37 的核心上,Linux 要求
/etc/mtab
為循環掛載的文件系統寫入一個條目,以便稍後自動清除循環設備。如果/etc/mtab
在掛載時不可寫或條目已從中刪除,/etc/mtab
則不會自動清除循環設備。在核心 >= 2.6.37 上,核心會記住循環設備備份儲存路徑,並且不需要在/etc/mtab
.我能夠在 CentOS 6.10 上通過
/etc/mtab
將chattr +i /etc/mtab
. 僅僅刪除它是不夠的;它將至少使用部分安裝表重新創建。這不是正常操作中應該發生的事情,因此如果您發現此文件已被設置為不可變,您應該尋找管理員錯誤或安全漏洞。如果
/etc/mtab
在您的舊 Linux 系統上不存在或不完整,您可以從/proc/mounts
. 但是不要在現代 Linux 系統上執行此操作,/etc/mtab
取而代之的是一個符號連結,/proc/self/mounts
用於與期望在該位置安裝表的古代程式碼向後兼容。