Проверить перемонтирование?

Vim имеет встроенную функцию справки:

:help tabpagenr()
:help 'ruler'
:help 'statusline'

Чтобы отобразить количество страниц вкладок в строке состояния, вы можете добавить % {tabpagenr ('$' )} в вашу строку состояния или rulerformat параметры. Например,

:set ruler
:let &rulerformat='%39(%-6{strpart(&ft,0,5)}%5.5b%6.6(<%B>%) %5.5l,%-7.7(%.3c%.4V%) %6{tabpagenr(''$'')}T%)'

С другой стороны, Vim, который я использую, не позволяет мне открывать более 10 вкладок. в то же время ...

2
19.07.2018, 00:39
2 ответа

Если у вас есть доступ к chroot, есть хак , который работает на последних ядрах . По крайней мере, это работает на Linux v4.17. Я не думаю, что он совместим с оболочкой -, но с python все в порядке.

(Обратите внимание: вы можете получить возможность chroot, если у вас есть доступ к пространствам имен пользователей. Используйте unshare -rm --propagation slaveили аналогичный.)

# mount --bind / /mnt
# mount --make-slave /mnt    # don't propagate submounts back to /
# mount --bind / /mnt

Теперь у нас есть овермаунт, давайте исследуем его.

# python3
...
>>> import os
>>> os.chdir("/")
>>> os.system("grep mnt proc/self/mountinfo")
231 73 253:0 / /mnt rw,relatime shared:1 - ext4 /dev/mapper/alan_dell_2016-fedora rw,seclabel
352 231 253:0 / /mnt rw,relatime shared:281 - ext4 /dev/mapper/alan_dell_2016-fedora rw,seclabel
0

>>> os.chroot("/mnt")
>>> os.system("cat proc/self/mountinfo")
352 231 253:0 / / rw,relatime shared:281 - ext4 /dev/mapper/alan_dell_2016-fedora rw,seclabel
0

Этот результат показывает, что есть доступная файловая система, смонтированная на /mnt, и это файловая система с идентификатором монтирования 352 и т. д.

0
27.01.2020, 22:18

После реализации алгоритма sourcejedi я столкнулся с серьезным препятствием, поскольку он давал мне ложные срабатывания, то есть объявление видимой точки монтирования скрытой. Возьмем этот набор точек монтирования с их путями, идентификаторами и родительскими идентификаторами:

  • ID :2, "/"
  • ID :3, "/a/b", ParentID :2
  • ID :4, "/a/b/c", ParentID :3
  • ID :5, "/a/b/c/e/f", ParentID :4
  • ID :40, "/a/b/c", ParentID :4
  • ID :5, "/a", ParentID :2
  • ID :50, "/a/b/c/e/f", ParentID :5

Должны быть видны только точки монтирования с идентификатором :2 "/", идентификатором :5, "/a" и идентификатором :50 "/a/b/c/e/f". В моей реализации алгоритма sourcejedi шаг 3 дает мне ложное срабатывание для идентификатора точки монтирования :50. Я долго размышлял, как правильно получить PRE и PAR в этом случае, предполагая, что PRE должен рассчитываться на "представлении VFS ", то есть PRE — это путь монтирования, который может относиться к нескольким точкам монтирования. Более того, существует PRE, который может ссылаться только на точки монтирования из другой иерархии, и эта комбинация может вызвать срабатывание шага 3.

Учитывая, что VFS ядра Linux разрешает пути в inodes, проходя по узлам VFS, начиная с корня " вниз ", поэтому, вероятно, безопаснее сделать то же самое для определения того, является ли точка монтирования скрытый или нет (, в отличие от того, чтобы выяснить это, пройдя вверх по иерархии, начиная с рассматриваемой точки монтирования ).Недостатком является то, что нам (более или менее )необходимо определить перемонтирование для всего дерева точек монтирования, прежде чем мы сможем безопасно определить, действительно ли конкретная точка монтирования перемонтирована/скрыта.

Моя реализация (на Golang)выглядит следующим образом и успешно проходит приведенный выше тест; в основном это работает следующим образом:

  • Начиная с точки монтирования по пути монтирования "/" :
    • проверка перемонтирования «в -месте», где путь P (дочерний (MP ))одного из дочерних элементов текущей точки монтирования совпадает с путем P (MP )текущей точки монтирования.
      • да:пометить все дочерние точки монтирования (рекурсивно с их дочерними элементами )текущей точки монтирования скрытыми, за исключением дочерней точки монтирования, которая перемонтирует текущую точку монтирования . Затем рекурсивно проверьте дочернюю точку монтирования и сделайте это позже.
      • нет:продолжить
    • проверка дочерних элементов, перекрывающих других дочерних, путем сравнения их путей :ISPREFIX (P (ith -дочерний (MP )),P (jth -дочерний (MP ))):
      • да:рекурсивно пометить j-й -дочерний (MP )как скрытый (перемонтированный ), а также все его (великие )дочерние элементы.
      • нет:продолжить.
    • для всех дочерних (MP )которые не скрыты (overmounted ):рекурсивно проверить их по этому алгоритму.

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

1
26.03.2021, 08:55

Теги

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