В приложении Диски (Дисковая утилита) в 14.04, что делает параметр автоочистки?
Я играю с некоторыми образами дисков через петлевые устройства (например, /dev/loop0). При просмотре в приложении Диски (Дисковая утилита) есть настройка с надписью "Автоочистка", которая в настоящее время установлена на ВЫКЛ.
Что делает этот параметр? Это специфично для петлевых устройств?
(И как я мог найти ответ сам? Пробные диски> Справка, но, похоже, он не поддерживает разумный поиск, и я не знал, какой из вариантов верхнего уровня выбрать (.. таблица содержимое кого-нибудь?))
3 ответа
Да, это характерно для петлевых устройств. Это означает, что когда устройство петли отключается, оно автоматически отсоединяется от файла резервной копии.
Минимальный исполняемый пример
Сначала мы создаем тестовую файловую систему, как описано здесь:
mkdir sysroot
dd if=/dev/urandom of=sysroot/myfile bs=1024 count=1024
virt-make-fs --format=raw --type=ext2 sysroot sysroot.ext2
Сейчас:
$ mkdir mnt
$ # mount can deduce "-o loop -t ext2" nowadays.
$ sudo mount sysroot.ext2 mnt
$ # Mount worked fine.
$ cmp mnt/myfile sysroot/myfile
$ losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 1 0 /home/ciro/sysroot.ext2 0 512
$ # I don't trust userland.
$ cat /sys/devices/virtual/block/loop0/loop/autoclear
1
$ sudo umount
$ losetp
$
Поэтому мы видим, что mount:
- создает петлевое устройство
- по умолчанию устанавливает для него AUTOCLEAR -o loop -t ext2
а потом когда umount видит AUTOCLEAR установлен, он автоматически уничтожает файл.
Пример минимального счетчика
Создав петлевое устройство вручную с losetup, мы можем видеть, что происходит, когда AUTOCLEAR не установлен:
$ sudo losetup /dev/loop0 sysroot.ext2
losetup: sysroot.ext2: Warning: file does not fit into a 512-byte sector; the end of the file will be ignored.
$ losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 0 0 /home/ciro/sysroot.ext2 0 512
$ cat /sys/devices/virtual/block/loop0/loop/autoclear
0
$ sudo mount /dev/loop0 mnt
$ cmp mnt/myfile sysroot/myfile
$ sudo umount mnt
$ losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 0 0 /home/ciro/sysroot.ext2 0 512
$ sudo mount /dev/loop0 mnt
$ sudo umount -d mnt
$ losetup
Итак, мы видим, что:
umountбез вариантов не очистили петлевые устройства для насumount -dдействительно очистил это
В качестве альтернативы, мы также можем отсоединить петлевое устройство с помощью:
sudo mount /dev/loop0 mnt
sudo umount mnt
sudo losetup -d /dev/loop0
Автоматическое отключение используемой файловой системы
man losetup говорит:
-dОтсоедините файл или устройство, связанное с указанными петлевыми устройствами. Обратите внимание, что начиная с Linux v3.7 ядро использует "ленивое уничтожение устройства". Операция отсоединения больше не возвращает ошибку EBUSY, если устройство активно используется системой, но помечается флагом autoclear и позже уничтожается.
и мы проверяем с помощью:
$ sudo losetup /dev/loop0 sysroot.ext2
$ sudo mount /dev/loop0 mnt
$ cat /sys/devices/virtual/block/loop0/loop/autoclear
0
$ sudo losetup -d /dev/loop0
$ cat /sys/devices/virtual/block/loop0/loop/autoclear
1
$ # Still mounted.
$ cmp mnt/myfile sysroot/myfile
$ sudo umount mnt
$ losetup
$
Итак, мы видим, что если вы делаете losetup -d Befor umount это устанавливает autoclear автоматически.
Низкоуровневый вид
Быстрый:
sudo strace mount sysroot.ext2 mnt
показывает, что основными системными вызовами являются:
openat(AT_FDCWD, "/dev/loop0", O_RDWR|O_CLOEXEC) = 4
ioctl(4, LOOP_SET_STATUS64, {lo_offset=0, lo_number=0, lo_flags=LO_FLAGS_AUTOCLEAR, lo_file_name="/home/ciro/sysroot.ext2", ...}) = 0
mount("/dev/loop0", "/home/ciro/test/libguestfs/mnt", "ext2", MS_MGC_VAL, NULL) = 0
так что мы видим, что losetup операции в основном выполняются через ioctl,
Интересующий источник ядра v4.17:
include/uapi/linux/loop.h: содержит видимый пользовательский интерфейс API, включая, в частности,ioctlструктураstruct loop_info64в которомLO_FLAGS_AUTOCLEARставитсяdrivers/block/loop.hсодержит фактическую реализацию
Посмотрите на этот минимальный пример, если вы не знакомы с ioctl: https://stackoverflow.com/questions/2264384/how-do-i-use-ioctl-to-manipulate-my-kernel-module/44613896
Проверено на Ubuntu 18.04.
Я не специалист по петлевым устройствам, но я могу рассказать вам о том, что я сделал, чтобы выяснить некоторые вещи.
После поиска "auto-clear loop" в известной поисковой системе, я нашел - помимо этого вопроса - патч, добавляющий эту функцию в утилиту gnome-disk.
Я не мог действительно понять код, но я решил, что важная часть, вероятно, связана с функцией udisks_loop_call_set_autoclear,
Я искал это, нашел Справочное руководство по UDisks и увидел, что оно вызвало нечто, называемое SetAutoclear, которое, как выясняется, устанавливает свойство AutoClear. Что, очевидно, означает:
Если ИСТИНА, ядро автоматически очистит устройство цикла, когда последний ближе закроет устройство. Обычно это происходит, когда устройство петли отключено.
Поиск "устройства очистки петли" (или поиск man losetup для 'clear') не было чрезмерно полезно, поэтому на данный момент я предполагаю, что 'clear' является просто синонимом слова 'detach'.
Я не смог найти ничего об автоматическом отсоединении петель в man-странице, поэтому решил, что это возможно на уровне монтирования.
Смотря на man mount и в поисках "петли", я нашел это предложение:
Поскольку в Linux 2.6.25 поддерживается автоматическое уничтожение петлевых устройств, это означает, что любое петлевое устройство, выделенное с помощью mount, будет освобождено umount независимо от /etc/mtab.
Я предполагаю, что "самоуничтожение" - это еще один синоним "автоочистки".
Таким образом, начиная с версии ядра 2008, любые циклы, созданные автоматически mount будет очищен автоматически при размонтировании. Но, очевидно, вы можете обойти это, щелкнув переключатель в Gnome Disk Utility.
Я предполагаю, что есть способ контролировать это и из командной строки, и это был бы ответ, который я хотел бы дать вам, но я не могу легко найти его.
Я, вероятно, должен был бы пройтись по большему количеству кода (возможно, искать другие проекты, где вызываются аналогичные функции), или узнать больше об устройствах цикла или ядре.