Информация о свободном пространстве для FS в системе AIX

Модули безопасности Linux предназначены для управления доступом к таким ресурсам, как файлы:

LSM was designed to provide the specific needs of everything needed to successfully implement a mandatory access control module... LSM inserts "hooks" (upcalls to the module) at every point in the kernel where a user-level system call is about to result in access to an important internal kernel object such as inodes and task control blocks.

Чтобы реализовать это, я думаю, вам придется создать драйвер устройства, который будет передавать такие события, как «open()был вызван. VLC открывает zip-файл с видео в нем» пользователю -space, который разархивирует соответствующий файл и вернет имя разархивированного файла, которое ваш LSM-модуль затем передаст фактическому вызову ядра open. А затем в соответствующем вызове close()вы передадите это событие из вашего модуля LSM в процесс пользовательского пространства -, чтобы он мог удалить разархивированный видеофайл.

Это не тривиальное предприятие. Среди прочего, вам нужно быть очень осторожным, чтобы не создать огромные дыры в безопасности :"Эй, эту штуку можно использовать для перезаписи /etc/shadow!"

0
20.08.2019, 15:19
1 ответ

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

.
  1. учитывая файловую систему, извлечь LV изlsfs
  2. с LV, извлеките VG изlslv
  3. с помощью VG извлеките свободное место изlsvg

Вот скрипт:

#!/bin/sh

# input: a filesystem
# output: free MB in the containing VG

if [ "$#" -ne 1 ]
then
  printf "Usage: %s [ fs ]\n" "$0" >&2
  exit 1
fi

if ! /usr/sbin/lsfs -c "$1" > /dev/null 2>&1
then
  printf "Error: filesystem %s not found\n" "$1" >&2
  exit 2
fi

lv=$(/usr/sbin/lsfs -c "$1" |
        awk -F: 'NR == 2 {
                           split($2, fields, "/");
                           print fields[3]
                         }')
vg=$(LANG=C lslv "$lv" 2>/dev/null | awk '/VOLUME GROUP/ { print $6 }')
copies=$(LANG=C lslv "$lv" 2>/dev/null | awk '/^COPIES:/ {print $2}')
mb=$(LANG=C /usr/sbin/lsvg "$vg" |
  awk -F: '/FREE PP/ {match($3, /\([[:digit:]]*/); print substr($3, RSTART+1, RLENGTH-1)}')
printf "%d Mb available\n" "$((mb / copies))"

Для описания некоторых разделов кода, которые могут быть неочевидными:

  • сценарий awkдля lsfsразбивает вывод на двоеточия и работает только со строкой 2 (, поскольку строка 1 является заголовком ). Значение в поле 2 похоже на /dev/opcon, поэтому мы разбили его на массив fieldsна основе косой черты -. Первый элемент пуст (ничего перед первым /), второй элемент — dev, а третий элемент — opcon, имя LV, которое нам нужно.
  • скрипт awkдля lsvgвыделяет свободную -пробельную строку; третье поле, разделенное двоеточием -, представляет собой текст после FREE PPs:, например. 217 (222208 megabytes). Мы вызываем match()в этом поле, чтобы соответствовать (, за которым следуют некоторые цифры. Здесь мы предполагаем успех! Поскольку совпадение начинается с открывающей скобки, когда мы извлекаем цифры для свободного мегабайта,мы пропускаем один после RSTART и вычитаем один из RLENGTH.

Если вы планируете использовать выходные данные этого скрипта как часть другого конвейера, рассмотрите возможность настройки инструкции printfдля вывода только цифр без части «Доступно МБ\n».

1
28.01.2020, 02:39

Теги

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