Centos

循環設備不會在解除安裝時自動分離

  • April 28, 2019

我有一個備份腳本,我在其中解除安裝了一個 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 的循環設備。

最近我有兩個主要變化:

  1. 我將核心更新為 2.6.32-754.11.1.el6.i686
  2. 我將作業系統移至 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/mtabchattr +i /etc/mtab. 僅僅刪除它是不夠的;它將至少使用部分安裝表重新創建。這不是正常操作中應該發生的事情,因此如果您發現此文件已被設置為不可變,您應該尋找管理員錯誤或安全漏洞。

如果/etc/mtab在您的舊 Linux 系統上不存在或不完整,您可以從/proc/mounts. 但是不要在現代 Linux 系統上執行此操作,/etc/mtab取而代之的是一個符號連結,/proc/self/mounts用於與期望在該位置安裝表的古代程式碼向後兼容。

引用自:https://serverfault.com/questions/963740