В Дисках приложение (Дисковой утилиты) в 14,04, что делает авточеткая установка?

Я играю с некоторыми образами дисков через устройства закольцовывания (например. /dev/loop0). При просмотре в Дисках (Дисковая утилита) приложение там установка, маркировал "Auto-clear", который в настоящее время устанавливается на ПРОЧЬ.

Что делает эта установка? Действительно ли это характерно для устройств закольцовывания?

(И как я, возможно, нашел ответ сам? Испытанные Диски> Справка, но это, кажется, не поддерживает поиск разумным способом, и я не знал который из выбора верхнего уровня выбрать (.. оглавление кто-либо?))

5
задан 25 June 2015 в 14:16

3 ответа

Да, это характерно для циклических устройств. Это означает, что, когда циклическое устройство размонтировано, это будет автоматически разъединено из отступающего файла.

2
ответ дан 23 November 2019 в 10:27

Я не эксперт по циклическим устройствам, но я могу обойти Вас через то, что я сделал для обнаружения некоторых вещей.

После поиска "автоясного цикла" в известной поисковой системе, я нашел - кроме этого вопроса - патч , который добавил опцию к дисковой утилите гнома.

я не мог действительно понять код, но я решил, что ключевая роль, вероятно, включила функцию udisks_loop_call_set_autoclear.

я искал это, нашел Справочник UDisks и видел, что он вызвал что-то позвонившее SetAutoclear, который это оказывается, наборы "Автоясным" свойство. Который, по-видимому, означает:

ЕСЛИ ЭТО ПРАВДА, ядро автоматически очистит циклическое устройство когда последние более близкие завершения устройство. Это обычно происходит, когда циклическое устройство размонтировано.

Поиск "ясного циклического устройства" (или поиск man losetup для 'ясного') не был чрезмерно полезен, таким образом, в этой точке я предполагаю "ясный", просто синоним для "отсоединения".

я ничего не мог найти об автоотсоединяющихся циклах в странице справочника, так решенный, возможно, это происходит на уровне монтирования.

Рассмотрение man mount и поиск 'цикла', я нашел это предложение:

Начиная с Linux 2.6.25 саморазрушения циклических устройств поддерживается, означая, что любое циклическое устройство, выделенное монтированием, будет освобождено umount независимо от/etc/mtab.

я предполагаю, что "саморазрушение" является в основном другим синонимом для "автоясного".

Так с выпуска ядра 2008 года, любые циклы, созданные автоматически mount, будут очищены автоматически при размонтировании. Но по-видимому можно обойти это путем зеркального отражения переключателя в Дисковой утилите Gnome.

я предполагаю, что существует способ управлять этим из командной строки также, и это было бы ответом, который я захочу дать Вам, но я не могу легко найти его.

я должен был бы, вероятно, пробраться через большее количество кода (возможно, ищут другие проекты, где подобные функции вызваны), или узнайте больше о циклических устройствах или ядре.

0
ответ дан 23 November 2019 в 10:27

Минимальный выполнимый пример

Сначала мы создаем тестовую файловую систему, как объяснено здесь:

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 для него циклом-t ext2 по-умолчанию-o

и затем когда 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

Автоматический losetup в используемой файловой системе

man losetup говорит:

-d Отсоедините файл или устройство, связанное с указанным циклическим устройством (устройствами). Обратите внимание, что начиная с ядра Linux v3.7 использует "ленивое разрушение устройства". Операция отсоединения больше не возвращает ошибку EBUSY, если устройство активно используется системой, но это отмечено автоясным флагом и уничтожено позже.

и мы проверяем с:

$ 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 прежде 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#44613896

Протестированный на Ubuntu 18.04.

1
ответ дан 23 November 2019 в 10:27

Другие вопросы по тегам:

Похожие вопросы: