|
Bog BOS: Linux с точки зрения системного администратора
|
Последнее изменение файла: 2024.11.15
Скопировано с www.bog.pp.ru: 2024.11.21
Bog BOS: Linux с точки зрения системного администратора
- Выбор дистрибутива (отдельная статья)
- Ядро
- Утилиты работы с модулями ядра module-init-tools (CentOS5 и 6)
- Утилиты работы с модулями ядра kmod (CentOS7 и выше)
- Подбор оборудования: UEFI, ЦП, память, PCI, PCI Express, ATA, SATA, SCSI, SAS, разделы, RAID, CD/DVD и др.
- RPM: поиск, установка и управление пакетами программ (отдельная статья)
- yum: установка и обновление программ из репозитариев (отдельная статья)
- Установщик anaconda (отдельная статья)
- Примеры установки (много)
- Загрузка Linux: последовательность шагов, загрузчики (GRUB, GRUB2), initd, systemd (отдельная статья)
- Русский язык
- Настройки
- Сеть
- X11
- Печать
- Процессы, потоки и сигналы
- Пользователи и группы
- Возможности (capabilities)
- файловые системы
- Монтирование файловых систем: bind, shared
- OverlayFS
- VFS: атрибуты и расширенные атрибуты файлов, права доступа ACL
- cgroups v1
- cgroup v2
- Пространства имён (namespaces)
- Файловые системы ext2/ext3/ext4
- Планировщики запросов ввода/вывода
- swap, compcache, zram, zswap
- Сервера и демоны интернет
- Программы для работы с видео (отдельная статья)
- Как выпутываться из проблем
- Где взять дополнительную информацию
Основой любого дистрибутива является ядро Linux (некоторые даже
предлагают называть Линуксом только его ядро, а ядро с обслуживающими программами
предлагают называть GNU/Linux; если к GNU/Linux добавить прикладные программы,
то получится дистрибутив).
Официальные ядра нумеруются в виде: версия.модификация.ревизия.
Нечётные модификации (2.3, 2.5) предназначены исключительно для тестирования разработчиками,
чётные (2.2, 2.4, 2.6) - для обычного применения. Хотя лично я не рекомендую
использовать на сервере ядра с чётным номером модификации, но начальных
ревизий (2.6.0 - 2.6.5) - будут проблемы.
Разработчики дистрибутивов поставляют в своих продуктах
сильно модифицированные ядра. Например, Red Hat поставляет ядра модификации 2.4
с некотроми функциями из 2.6 (NPTL и некоторые другие). Так что, если какая-то программа
требует ядро 2.6, а у вас ядро 2.4, то ещё не всё потеряно... С другой стороны
многие "заплатки" улучшающие официальное ядро, неприменимы к ядрам из дистрибутива.
Времена, когда приходилось самостоятельно устанавливать
новое "свежеиспеченное" ядро, надеюсь уже прошли. Сейчас лучше положиться
на составителя дистрибутива. Однако, необходимость быть в курсе грядущих
изменений осталась.
Сайты, следящие за изменениями в ядре:
Что нового в 2.4:
Что нового в 2.6:
Обновление ядра вручную
Обновление ядра из rpm - старая школа
- подготовить все необходимые пакеты (скачать и положить в локальную директорию)
- на всякий случай сделать загрузочный диск
- rpm -Uvh kernel-utils-xyz kernel-headers-xyz kernel-source-xyz
- rpm -ivh kernel-xyz [kernel-ibcs-xyz] [kernel-pcmcia-cs-xyz]
- сделать новый initrd (только если при загрузке потребуется драйвер, сделанный в
виде модуля, современные rpm ядра делают это самостоятельно при установке)
- дополнить /etc/conf.modules (/etc/modules.conf)
- lilo -v или отредактировать /boot/grub/grub.conf
(современные rpm ядра делают это самостоятельно при установке)
- перезагрузиться (shutdown -r now)
Обновление ядра из rpm с помощью yum - новая школа
- предполагается, что имеется свой или чей-нибудь ещё репозитарий
yum для данного дистрибутива и клиент yum настроен на него
- yum update kernel*
- перезагрузиться (shutdown -r now)
Сборка ядра в CentOS7
- всё делаем в ~/rpmbuild под обычным пользователем
- mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
- echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
- поставить пакеты: rpm-build, redhat-rpm-config, asciidoc, hmaccalc, perl-ExtUtils-Embed, pesign, xmlto, audit-libs-devel, binutils-devel, elfutils-devel, elfutils-libelf-devel, ncurses-devel, newt-devel, numactl-devel, pciutils-dedvel, python-devel and zlib-devel
- скопировать SRC пакет с vault
- установить его (не под root-ом)
- cd ~/rpmbuild/SPECS
- rpmbuild -bp --target=$(uname -m) kernel.spec
- исходники распакованы в ~/rpmbuild/BUILD/kernel.../linux...
kdump позволяет сохранить содержимое памяти (/proc/vmcore) и dmesg
при аварийном завершении работы ядра для последующего анализа.
Утилиты работы с модулями ядра module-init-tools обеспечивают автоматическую
загрузку необходимых модулей ядра 2.6 и более нового.
Сиволы "-" в именах и синонимов молчаливо заменяются на "_" и обратно при необходимости.
Утилита depmod создаёт описание зависимостей
между модулями - какой сервис (symbols), требуемый одному модулю, обеспечивается другим модулем -
читает модули в каталоге /lib/modules/версия-ядра, результат записывает в modules.dep в том же каталоге.
Каталог /etc/depmod.d содержит конфигурационные файлы (depmod.conf), управляющие порядком просмотра модулей.
Версию ядра и модуль можно указать явно в командной строке. Ключи:
- --all (читать все модули)
- --quick (читать только модули, более новые чем modules.dep)
- --basedir каталог (для обработки модулей, лежащих в нестандартном месте)
- --errsyms --filesyms System.map (выдавать сообщения о несуществующих символах)
- --dry-run
- --verbose
Утилита modinfo выводит информацию об указанном модуле: имя файла (-n), лицензия (-l), описание (-d), автор (-a),
от каких модулей зависит, версия, параметры (-p), синонимы.
Можно указать версию ядра (-k) и разделение полей нулями (-0) вместо переводов строки.
Утилита lsmod выводит список загруженных модулей (/proc/modules), также выводит размер,
счётчик использований и кем используется (к сожалению, только при использовании модулями).
Утилита insmod загружает указанный модуль. Можно явно указать имя файла и параметры.
Ошибки необходимо смотреть с помощью dmesg (если не случилось "kernel panic").
Утилита rmmod выгружает указанный модуль. Ключи:
- --verbose
- --force (требуется CONFIG_MODULE_FORCE_UNLOAD при сборке ядра; позволяет выгрузить используемый
или помеченный как недопустимый для выгрузки модуль)
- --wait (используемый модуль изолируется от новых использований и выгружается после освобождения)
- --syslog
Утилита modprobe загружает и выгружает указанные модули с учётом зависимостей из modules.dep
и настроек из /etc/modprobe.conf и /etc/modprobe.d/, а также из командной строки загрузки ядра в форме
имя-модуля.опция. Ошибки необходимо смотреть с помощью dmesg (если не случилось "kernel panic").
Можно указать параметры модуля. Ключи:
- --verbose
- --config /etc/modprobe.conf (MODPROBE_OPTIONS)
- --showconfig (собрать и показать конфигурацию - 20 тысяч строк)
- --dry-run
- --ignore-install (игнорировать команду install в конфигурации для указанного модуля)
- --ignore-remove (игнорировать команду remove в конфигурации для указанного модуля)
- --quiet
- --remove (выгрузить указанные модули и все модули, от которых они зависит, оставшиеся без использования)
- --wait (только с --remove; используемый модуль изолируется от новых использований и выгружается после освобождения)
- --force (удалить всю информацию о версии модуля и его зависимостях с надеждой на загрузку)
- --all (загрузить все модули, указанные в командной строке)
- --syslog
- --set-version версия-ядра
- --show-depends (выводит последовательность команд insmod для загрузки зависимостей, а также alias и install)
- --use-blacklist (использовать команды blacklist из конфигурации)
Настройки modprobe берутся из файла /etc/modprobe.conf и файлов *.conf в каталоге /etc/modprobe.d/.
Рекомендуется создавать отдельный файл для каждой ситуации дабы они не мешали друг другу.
Каждая строка содержит команду, пустые строки и строки, начинающиеся с "#", являются комментариями.
Символ "\" в конце строки является символом продолжения на следующей строке.
Команды:
- alias шаблон имя-модуля # задаёт синонимы для имён модулей, если имя загружаемого модуля соответствует шаблону, то
используется указанный справа модуль; нельзя делать синонимы синонимов;
синонимы могут быть встроены в сами модули - эта информация используется в последнюю очередь
- options имя-модуля параметр ... # при прямой или по зависимости загрузке модуля использовать параметры;
параметры модулей накапливаются по цепочке - modprobe, alias и options
- install имя-модуля команда ... # выполнить указанную команду вместо загрузки указанного модуля;
перед выполнением параметры записываются в переменную окружения CMDLINE_OPTS
- remove имя-модуля команда ... # выполнить указанную команду вместо выгрузки указанного модуля
- blacklist имя-модуля # игнорировать встроенные в указанный модуль синонимы
Утилиты работы с модулями ядра kmod обеспечивают автоматическую
загрузку необходимых модулей ядра 2.6 и более нового. Сделаны с использованием библиотеки libkmod (kmod-libs)
Сиволы "-" в именах и синонимов молчаливо заменяются на "_" и обратно при необходимости.
Утилита depmod создаёт описание зависимостей
между модулями - какой сервис (symbols), требуемый одному модулю, обеспечивается другим модулем -
читает модули в каталоге /lib/modules/версия-ядра, результат записывает в modules.dep (modules.dep.bin) в том же каталоге.
Также создаются список символов modules.symbols (modules.symbols.bin)
и список имён устройств modules.devname (для udev для создания файлов в /dev) в том же каталоге.
Каталог /etc/depmod.d (/usr/lib/depmod.d/*.conf, /run/depmod.d/*.conf) содержит конфигурационные файлы (depmod.conf),
управляющие порядком просмотра модулей.
Версию ядра и модуль можно указать явно в командной строке. Ключи:
- --all (читать все модули)
- --quick (читать только модули, более новые чем modules.dep)
- --basedir каталог (для обработки модулей, лежащих в нестандартном месте)
- --errsyms --filesyms System.map (выдавать сообщения о несуществующих символах)
- --errsyms --symvers (выдавать сообщения о несогласованных номерах версий с Module.symvers)
- --dry-run
- --verbose
- -w (выдавать предупреждения о версиях, двойных зависимостях и т.д.)
Утилита modinfo выводит информацию об указанном модуле: имя файла (-n), лицензия (-l), описание (-d), автор (-a),
от каких модулей зависит, версия, параметры (-p), синонимы.
Можно указать версию ядра (-k) и разделение полей нулями (-0) вместо переводов строки.
Утилита lsmod выводит список загруженных модулей (/proc/modules), также выводит размер,
счётчик использований и кем используется (к сожалению, только при использовании модулями).
Утилита insmod загружает указанный модуль. Можно явно указать имя файла и параметры.
Ошибки необходимо смотреть с помощью dmesg (если не получилось "kernel panic").
Утилита rmmod выгружает указанный модуль. Ключи:
- --verbose
- --force (требуется CONFIG_MODULE_FORCE_UNLOAD при сборке ядра; позволяет выгрузить используемый
или помеченный как недопустимый для выгрузки модуль)
- --wait (используемый модуль изолируется от новых использований и выгружается после освобождения)
- --syslog
Утилита modprobe загружает и выгружает указанные модули с учётом зависимостей из modules.dep.bin
и настроек из /etc/modprobe.conf и /etc/modprobe.d/*.conf (/lib/modprobe.d/*.conf, /run/modprobe.d/*.conf),
а также из командной строки загрузки ядра в форме
имя-модуля.опция и modprobe.blacklist=список-модулей.
Ошибки необходимо смотреть с помощью dmesg (если не случилось "kernel panic").
Можно указать параметры модуля. Ключи:
- --all (загрузить все модули, указанные в командной строке)
- --use-blacklist (использовать команды blacklist из конфигурации)
- --config /etc/modprobe.d (MODPROBE_OPTIONS)
- --showconfig (собрать и показать конфигурацию - 20 тысяч строк)
- --force (удалить всю информацию о версии модуля и его зависимостях с надеждой на загрузку)
- --ignore-install (игнорировать команду install в конфигурации для указанного модуля)
- --ignore-remove (игнорировать команду remove в конфигурации для указанного модуля)
- --dry-run
- --quiet
- --resolve-alias (вывести имена всех модулей, соответсвующих синониму)
- --remove (выгрузить указанные модули и все модули, от которых они зависит, оставшиеся без использования)
- --set-version версия-ядра
- --show-depends (выводит последовательность команд insmod для загрузки зависимостей, а также alias и install)
- --syslog
- --verbose
Настройки modprobe берутся из файла /etc/modprobe.conf и файлов *.conf в каталогах /etc/modprobe.d/,
/lib/modprobe.d/ и /run/modprobe.d/.
Рекомендуется создавать отдельный файл для каждой ситуации дабы они не мешали друг другу.
Каждая строка содержит команду, пустые строки и строки, начинающиеся с "#", являются комментариями.
Символ "\" в конце строки является символом продолжения на следующей строке.
Команды:
- alias шаблон имя-модуля # задаёт синонимы для имён модулей, если имя загружаемого модуля соответствует шаблону, то
используется указанный справа модуль; нельзя делать синонимы синонимов;
синонимы могут быть встроены в сами модули - эта информация используется в последнюю очередь
- options имя-модуля параметр ... # при прямой или по зависимости загрузке модуля использовать параметры;
параметры модулей накапливаются по цепочке - modprobe, alias и options
- install имя-модуля команда ... # выполнить указанную команду вместо загрузки указанного модуля;
перед выполнением параметры записываются в переменную окружения CMDLINE_OPTS; считается устаревшим
- remove имя-модуля команда ... # выполнить указанную команду вместо выгрузки указанного модуля
- blacklist имя-модуля # игнорировать встроенные в указанный модуль синонимы
- softdep имя-модуля pre: модуль ... post: модуль ... # опциональная зависимость указанного модуля;
модули, перечисленные после "pre:" загружаются до указанного модуля;
модули, перечисленные после "post:" загружаются после указанного модуля
Когда-нибудь наступят светлые дни, когда изготовители
оборудования будут сначала писать драйверы под Linux, а потом уж под
20 версий MS Windows. Но сейчас перед покупкой "железа" необходимо
предварительно проверить, есть ли под него драйверы для Linux. Крайне
желательно, чтобы эти драйверы входили в состав дистрибутива
(поставить драйвер самому можно - если он не требуется при установке
дистрибутива - но Вы узнаете много нового и интересного).
Для RedHat проверить наличие драйвера можно на
сайте компании.
К сожалению, производители оборудования очень любят выпускать разные
устройства под одним маркетинговым именем или одно и то же устройство
под разными. Так что доверять чужому опыту надо осторожно. Рекомендуется
поискать в телеконференциях как положительные, так и отрицательные отзывы.
Ссылки на списки оборудования, совместимого с Linux.
Память
decode-dimms.pl из пакета lm_sensors позволяет интерпретировать содержимое SPD.
EDAC (Error Detection and Correction)
- мониторинг ошибок памяти, состоит из модуля ядра edac_mc (k8_edac, e752x_edac, e7xxx_edac, edac_mc) и
пакета edac-utils.
Управление через /sys/devices/system/edac/mc/.
Отчёты с помощью утилиты edac-util из пакета edac-utils ("edac-util -v --report=full").
Для привязки ошибок к физическим модулям памяти можно использовать скрипт edac-ctl,
но материнская плата д.б. описана в /etc/edac/labels.db, а их там немного.
What are Machine Check Exceptions (or MCE)? (mcelog)
Расшифровка вывода /proc/meminfo
Что каждый программист должен знать о памяти (Ulrich Drepper, Перевод: Капустин С.В.)
ATA и SATA
ATA (IDE, EIDE, ATA33 и другие фирменные названия)
Краткие сведения
Конфигурация и получение информации о ATA дисках: hdparm и
dmraid.
Для нормальных устройств рекомендуется:
hdparm -c 1 -d 1 -m 16 # включить 32-битный режим, использование
DMA, обмен по 16 секторов
Получение информации от S.M.A.R.T. (Self Monitoring, Analysis and Reporting
Technology) для ATA (SATA) и SCSI (SAS, FC, iSCSI) устройств возможно
с использованием пакета smartmontools (ранее smartsuite):
- smartctl опции устройство # позволяет получить текущую информацию, запустить самотестирование и т.д.,
в RHEL 7.2 версия 6.2 (версия 6.3: поддержка AACRAID; версия 6.4: поддержка usbprolific);
кроме "стандартных" контроллеров AHCI поддерживаются RAID-контроллеры 3ware, HighPoint, Areca, HP Smart Array (cciss, hpsa, hpahcisr);
в качестве устройства можно указывать /dev/hdX, /dev/sdX, /dev/sgX (соответствие можно узнать по "lsscsi -g"),
/dev/disk/by-id/X (по серийному номеру или WWN),
/dev/disk/by-path/X (по адресу контроллера и устройства);
опции:
- --info (-i) # вывод информации об устройстве и его возможностях (модель, серийный номер, WWN, версия прошивки,
ёмкость, размер сектора логический и физический, скорость вращения, версия стандарта,
есть ли поддержка SMART и включена ли она)
- -i -n never # вывод информации об устройстве и его возможностях, а также текущий режим сохранения энергии
- --identify[=[w][nvb]] # очень подробная информация об устройстве и его возможностях (=wb)
- --scan # сканирование устройств, определение типа и вывод списка
- --scan-open # сканирование устройств, определение типа с реальным автодетектированием ("-d test") и вывод списка
- --quietmode={errorsonly|silent|noserial}
- --device=тип-устройства (-d) # явное указание типа устройства и канала:
- auto (автоопределение по имени устройства, типу контроллера, USB ID)
- test (автоопределение и попытка открыть устройство с проверкой результата, само действие не выполняется)
- ata
- scsi
- sat[,auto][,длина] # SAT (SCSI to ATA Translation, ANSI INCITS 431-2007, не путать с STP), длина команды может быть 12 или 16 байт
- usbcypress[,код команды] # переходник Cypress USB to PATA, можно сломать устройство неверным кодом команды трансляции (0x24)
- usbjmicron[,p][,x][,порт] # переходник JMicron USB to PATA/SATA; 48-битные ATA команды (например, "-l xerror") не туннелируются
(включается по ",x"); указание номера порта (0 или 1) необходимо для 2-дисковых устройств;
для старых Prolific PL2507/3507 необходимо указывать "-d usbjmicron,0", для новых - "-d usbjmicron,p"
- usbsunplus # переходник SunplusIT USB to SATA
- marvell # подключение SATA с через контроллер Marvell
- megaraid,номер-диска # подключение к контроллерам Avago (LSI) из серии MegaRAID (Intel SRCS28X, Dell PERC, LSI MegaRAID SATA300-8X,
LSI MegaRAID SATA150-6, LSI Logic MegaRAID 320-1, LSI Logic MegaRAID SAS 9266-8i.
не подходит к LSI SAS1078 Fusion-MPT), диски могут нумероваться непоследовательно и не с нуля;
в качестве устройства можно указывать любой /dev/sdX, подключённый к тому же контроллеру
- 3ware,номер-диска # подключение к контроллерам 3ware (/dev/tweX для серий 6000, 7000 и 8000; /dev/twaX для серии 9000;
/dev/twlX для серии 9750 (LSI))
- areca,номер-диска # подключение к контроллерам Areca SATA, в качестве устройства необходимо указывать соответствующий /dev/sgX
- areca,номер-слота/номер-ящика # подключение к контроллерам Areca SAS
- cciss,номер-диска # подключение к контроллерам HP Smart Array типа cciss, в качестве устройства необходимо указывать /dev/cciss/cXdX
- hpt,номер-контроллера/номер-канала/номер-порта # подключение к контроллерам HighPoint RocketRAID
- --nocheck={never|sleep|standby|idle} (-n) # не будить устройство, находящееся в указанном режиме сохранения энергии,
лучше явно указать тип устройства ключом "-d", иначе оно может быть разбужено в процессе автоопределения
- --smart={on|off} (-s) # online; непрерывное обновление атрибутов SMART, помеченных в колонке UPDATED как Always
- --offlineauto={on|off} (-o) # offline; регулярное обновление всех атрибутов SMART (из спецификации SFF-8035i 2.0);
атрибуты, помеченные в колонке UPDATED
как Offline в противовес Always, обновляются только в результате подобного тестирования ("--offlineauto=on" или "-t offline")
- --saveauto={on|off} (-S) # автосохранение значений атрибутов, режим не меняется при выключении питания
- --set=aam,{уровень|off} # AAM (Automatic Acoustic Management): 128 - самый тихий, 254 - самый шумный
- --set=apm,{уровень|off} # APM (Advanced Power Management): ниже 128 позволяют остановить мотор, выше 128 - только запарковать головки
- --set=lookahead,{on|off} # режим предварительного чтения
- --set=standby,{уровень|off|now} # таймер остановки мотора (IDLE) при отсутствии работы (таблица в стандарте), прочитать нельзя
- --set=wcache,{on|off} # кеширование записи
- --set=wcreorder,{on|off} # переупорядочивание кеша записи (не влияет на NCQ и LCQ)
- --set=rcache,{on|off} # кеширование чтения
- --get={all|aam|apm|lookahead|security|security-freeze|wcache|wcreorder|rcache}
- --all (-a) # вывод информации SMART (эквивалент "-H -i -c -A -l error -l selftest -l selective" для SATA)
- --xall (-x) # вывод информации SMART и прочей статистики (эквивалент "-H -i -g all -c -A -f brief -l xerror,error -l xselftest,selftest
-l selective -l directory -l scttemp -l scterc -l devstat -l sataphy" для SATA)
- --health (-H) # всё хорошо?
- --capabilities (-c)
- --attributes (-A)
- --format={old|brief|hex[,{id|val}]} (-f) # формат вывода атрибутов
- --log=тип-журнала (-l)
- error - журнал ошибок
- xerror[,количество-ошибок][,error] # расширенный журнал ошибок (для устройств более 128GiB)
- selftest # журнал самотестирования
- xselftest[,количество-ошибок][,selftest] # расширенный журнал самотестирования (для устройств более 128GiB)
- selective # журнал избирательного самотестирования
- directory # каталог журналов
- background # журнал фоновых сканирований
- scttemp # информация о температуре (SCT - SMART Command Transport) и график изменений
- scttempsts # температура: текущая, пределы в текущем сеансе, пределы по жизни, количество выходов за границы
- scttemphist # график изменения температуры
- scttempint,минут[,p] # очистка таблицы температур и установка интервала записи истории температуры
- scterc[,чтение,запись] # вывести значение и описание SCT Error Recovery Control: TLER для WD, CCTL для Hitachi, ERC для Seagate;
значения в десятых секунды; для RAID - "70,70"
- devstat[,страница] # статистика использования устройства (Hitachi, Intel), страница 0 - оглавление
- sataphy[,reset] # счётчики ошибок
- sasphy[,reset] # счётчики ошибок
- ssd # процент изношенности
- --vendorattribute (-v) # позволяет задать формат вывода атрибута (см. /usr/share/smartmontools/drivedb.h)
- --firmwarebug={none|nologdir|samsung|samsung2|samsung3|xerrorlba|swapid} (-F) # метод обхода ошибок прошивки
- --test=тип-теста (-t) # запуск теста
- offline # обновить значение всех атрибутов
- short # краткое самотестирование в фоновом режиме (читаемость и производительность, результат см. "-l selftest")
- long # полное самотестирование в фоновом режиме (читаемость и производительность, результат см. "-l selftest")
- conveyance # не повредили ли диск при транспортировке
- select,ПервыйБлок-ПоследнийБлок # тестирование до 5 интервалов логических блоков, max - номер последнего блока
- select,ПервыйБлок+КоличествоБлоков # тестирование до 5 интервалов логических блоков,
redo - предыдущее значение, next - следующий блок за предыдущим интервалом
- --captive (-C) # запуск теста в блокирующем режиме
- --abort (-X) # прервать тест не в блокирующем режиме
smartd # сервис периодической проверки состояния устройств (по умолчанию - каждые полчаса);
по умолчанию сканируются "/dev/hd[a-t]", "/dev/sd[a-z]", "/dev/sd[a-c][a-z]";
сообщает на syslog (LOG_INFO для изменений атрибутов, LOG_CRIT для проблем) и почту;
сигнал USR1 - проверить немедленно; сигнал HUP - перечитать конфигурацию; ключи (/etc/sysconfig/smartmontools):
- --help
- --configfile=/etc/smartmontools/smartd.conf
- --interval=секунд # по умолчанию 30 минут
- --logfacility=источник # daemon
- --quit=условие-завершения
- nodev # нет устройств для мониторинга или ошибки конфигурации при запуске, по умолчанию
- errors # нет устройств для мониторинга или ошибки конфигурации при запуске или чтении
- nodevstartup # аналогично nodev, но не останавливаться если устройств не осталось при изменении конфигурации
- never
- onecheck
- --warnexec=/etc/smartmontools/smartd_warning.sh
- --drivedb=/usr/share/smartmontools/drivedb.h
- --debug
В настройках smartd (/etc/smartmontools/smartd.conf или /etc/smartd.conf) каждая строка задаёт параметры обработки
[потенциального] устройства (комментарии начинаются с '#'), в первом поле указывается имя файла устройства
или строка DEVICESCAN (smartd пытается самостоятельно обнаружить все [P|S]ATA и SCSI устройства (/dev/hd[a-l] и /dev/sd[a-z]),
в сложных случаях не советую) или DEFAULT (задаёт директивы по умолчанию), остальные поля содержат директивы обслуживания устройства:
- -f # сообщать о падении нормализованного значения атрибута ниже предела
- -i атрибут # игнорировать падение указанного атрибута
- -p # сообщать об изменении нормализованного значения атрибута типа Prefail
- -u # сообщать об изменении нормализованного значения атрибута типа Usage
- -t # сокращение для "-p -u"
- -I атрибут # игнорировать изменение указанного атрибута
- -r атрибут[!] # при слежении за атрибутом сообщать "сырое" значение; '!' - при изменении нормализованного значения генерировать событие
- -R атрибут[!] # отслеживать изменения "сырого" значения атрибута; '!' - при изменении "сырого" значения генерировать событие
- -C атрибут[+] # сообщать о наличии секторов, ожидающих замены; для отключения "-C 0"; "+" - сообщать только об увеличении
- -U атрибут[+] # сообщать о наличии секторов, не прочитавшихся при автономном тестировании;
для отключения "-U 0"; "+" - сообщать только об увеличении
- -H # проверка общего статуса и извещение по syslog (LOG_CRIT)
- -l {error|xerror|selftest} # проверка увеличения счётчика ошибок
- -a # сокращение для "-H -f -p -u -l error -l selftest -C 197 -U 198"
- -W разница[,граница-предупреждения[,граница-аварийная]] # сообщать об изменении температуры или достижении предельного значения
- -d тип-устройства # см. описание --device=тип-устройства для smartctl; дополнительно типы ignore и removable
- -n {never|sleep|standby|idle}[,макс-пропущенных-проверок][,q] # не будить устройство, находящееся в указанном режиме сохранения энергии,
лучше явно указать тип устройства ключом "-d", иначе оно может быть разбужено в процессе автоопределения
- -o {on|off} # см. описание --offlineauto для smartctl
- -S {on|off} # см. описание --saveauto для smartctl
- -m список-адресов-email # кого извещать о проблемах
- -M способ-извещения
- once # одно сообщение о каждой проблеме (по умолчанию)
- daily # извещать 1 раз в день
- diminishing # удваивать интервал при каждом повторении, начиная с 1 дня
- test # для тестирования почтовой системы
- exec путь-к-программе # /etc/smartmontools/smartd_warning.sh;
использовать указанную программу вместо mail (устанавливаются переменные окружения
SMARTD_MAILER, SMARTD_DEVICE, SMARTD_DEVICETYPE (из директивы "-d"), SMARTD_DEVICESTRING (может содержать пробелы),
SMARTD_DEVICEINFO (одной строкой и содержит пробелы), SMARTD_FAILTYPE, SMARTD_ADDRESS (-m), SMARTD_MESSAGE (1 строка),
SMARTD_FULLMESSAGE, SMARTD_TFIRST (время первого сообщения), SMARTD_TFIRSTEPOCH (время первого сообщения),
SMARTD_PREVCNT (число повторений), SMARTD_NEXTDAYS (дней до следующего сообщения))
- -T {normal|permissive} # толлерантность к недостаткам реализации
- -F {none|nologdir|samsung|samsung2|samsung3|xerrorlba|swapid} # метод обхода ошибок прошивки
- -v формат-сырого-значения-атрибута # лучше положиться на БД устройств
/usr/lib/systemd/system/smartd.service - описание юнита сервиса smartd
/etc/sysconfig/smartmontools - ключи smartd при запуске сервиса
update-smart-drivedb - обновление БД устройств (предупреждает об известных проблемах с устройствами и прошивками;
задаёт формат вывода атрибутов); читает с http://sourceforge.net/p/smartmontools, пишет в /usr/share/smartmontools/drivedb.h)
Попытка горячей замены SATA диска не удалась, хотя оборудование позволяет
(и шасси, и
материнская плата).
То есть новый диск работает, но все параметры (в частности, размер) остаются от старого.
Перепробовал:
- echo "scsi remove-single-device 3 0 0 0" > /proc/scsi/scsi
- echo "0 0 0" > /sys/class/scsi_host/host3/scan
- echo 1 > .../device/delete (кстати, путает номер устройства ;)
SCSI
Краткие сведения
Конфигурирование SCSI-устройств: scsiinfo (scsiinfo, scsiformat, scsi-config).
Именование дисков: /dev/sdyN
Если драйвер конкретного SCSI-контроллера встроен в ядро (не модуль),
то параметры можно передавать через /etc/lilo.conf. Например, чтобы отключить
работу с очередями для устройств с идентификаторами 1 и 2, подключенных
к контроллеру ncr53c8xx, надо вставить строку:
append = "ncr53c8xx=tags:8/t1t2q1"
То же самое достигается после загрузки командой (если, конечно, удастся
загрузиться ;):
echo "settags 2 1" > /proc/scsi/ncr53c8xx/0
Если драйвер для SCSI-контроллера скомпилирован как модуль, то аналогичный
эффект достигается включением в /etc/conf.modules строки:
alias scsi_hostadapter ncr53c8xx
options ncr53c8xx ncr53c8xx=tags:8/t1t2q1
и не забыть сделать mkinitrd, если он необходим при загрузке.
Диски
Именование дисков: /dev/xxyN, где
- xx - либо hd (ATA), либо sd (SCSI, SATA, USB)
- y - номер диска
- ATA
- a - первый IDE диск
- b - второй IDE диск
- и т.д.
- SCSI
- a -первый SCSI диск
- b - второй SCSI диск
- и т.д.
- z
- aa
- ...
- N - номер раздела (от 1 до 4 - номера primary или extended разделов,
от 5 - номера логических разделов)
Linux может работать с таблицами разделов в формате MBR и GPT.
Работа с программным RAID и LVM.
Утилита badblocks из пакета e2fsprogs позволяет проверить диск
на "плохие блоки" (не поддерживает устройства более 16 ТБ - CentOS 5.5).
Подготовка к эксплуатации диска с сектором 4 КБ
Мышки
Обязательно иметь мышь с тремя кнопками, иначе замучаешься тексты редактировать.
Настройка: mouseconfig. Для обычной старой последовательной мышки
с 3 кнопками подходит "Mouse System" или "Generic Serial Mouse (Microsoft
Serial)" без эмуляции 3ей кнопки. У меня одна и та же мышка Genius EasyMouse
(FCC ID: FSUGMZE3, а как их еще различать?) на одном компе работает только
в режиме MouseSystem, а на другом только как "Generic 3 button serial mouse".
Поддерживается работа USB мышек, имитирующих PS/2 (ImPS/2), например,
Microsoft Wheel Mouse Optical 1.1A USB (2 кнопки и колесико прокрутки,
Product=Microsoft 3-Button Mouse with IntelliEye(TM))
под видом Microsoft IntelliMouse (USB). При этом работа колесика прокрутки в X
имитируется нажатием виртуальных 4 и 5 кнопок (Option "ZAxisMapping" "4 5"),
при этом прокрутка работает во всех опробованных мною программах:
Mozilla, gvim, gnome-terminal, xchat, Gimp, xterm.
USB клавиатура (BTC USB Multimedia Keyboard 9000AU) работает
нормально (русские наклейки не совсем соответствуют, мультимедиа клавиши
не работают). Посмотреть код нажатой клавиши можно с помощью программ
xev и showkey.
многопортовая плата на базе Oxford Semiconducter OX16PCI
RPM: поиск, установка и управление пакетами программ
Установка дистрибутивов Red Hat
Примеры установок для различных версий и ситуаций (установщик anaconda):
Зависимости пакетов от библиотек и средств программирования.
gnumeric -> guile -> umb-scheme
kernelcfg, netcfg -> tkinter -> tix, python
tix -> tk -> tcl
Tclx и itcl никем не используются.
Особенности настройки различных версий Red Hat смотрите в примерах установок.
Документация
Консоль
Документация
-
пакет console-tools и документация из него (/usr/doc/console-tools* и man)
Предварительное замечание. ReHat заменила в 6.0 реализацию драйвера консоли
kbd на console-tools (потом обратно ;), так что старые рекомендации по русификации консоли
стали неприменимы.
Рекомендации данные здесь неприменимы к старым системам.
Если при установке RH 6.2 выбрать Russian/ru-yawerty, то все будет настроено
само собой (в частности, устанавливается LANG=ru_RU.KOI8-R - очень прикольно
смотрятся устаревшие переводы man-ов на русский).
в /etc/sysconfig/i18n
- LANG="ru_RU.KOI8-R"
- SYSFONT="cyr-sun16"
- SYSFONTACM="koi8-r"
Драйвер клавиатуры
Клавиатура генерирует сканкоды (scancode), которые преобразуются в коды
клавиш (keycode) с помощью таблицы преобразования, задаваемой
setkeycodes.
Коды клавиш преобразуются в символы с помощью таблицы keymap,
которая устанавливается
программой loadkeys. В RHL есть надстройка в виде kbdconfig,
которая позволяет выбрать keymap из списка, имеющихся в наличии (/usr/lib/kbd/keymaps/i386/qwerty).
Я использую ru-yawerty.kmap.gz (koi8-r, раскладка ЯВЕРТЫ, твердый
знак на подчеркивании, переключение по правому ALT). Имя ru-yawerty
заносится
в /etc/sysconfig/keyboard, который используется при загрузке из
/etc/rc.d/init.d/keytable.
Можно вызывать вручную: loadkeys ru-yawerty. Для работы обычных
8-битных (не UNICODE) программ этого достаточно.
Драйвер экрана
Разработчики нынешней версии ядра перешли на использование UNICODE (UCS2)
в драйвере консоли, поддержка национальных алфавитов отстала (во всяком
случае всякие FAQs, HOWTO и советы, оставшиеся от прошлых времен не помогают;
шрифты и таблицы перекодировок просто глючат). Механизм RHL 6.0 действует
так: при загрузке вызывается /etc/rc.d/init.d/keytable (там же встроена
поддержка клавиатуры), которая вызывает /sbin/setsysfont. setsysfont
в свою очередь выполняет (если есть) /etc/sysconfig/i18n, ожидая
что та определит переменные SYSFONT (имя файла со шрифтом, берется
из /usr/lib/kbd/consolefonts) и UNIMAP (имя файла с таблицей
соответствия, берется из /usr/lib/kbd/consoletrans). После чего
выполняет
consolechars -f $SYSFONT --sfm $UNIMAP
в качестве SYSFONT я беру koi8-8x16, в качестве UNIMAP - koi8-r.
Так что и клавиатура и экран работают в koi8-r и не надо ничего перекодировать
(в новой версии использование koi8-r не ломает таблички MidnightCommander,
в
RH 6.0 вместо русской буквы 'В' выводится тире с точками, в RH 6.2
- поправлено). Есть и другие шрифты (koi8-8x8, koi8-8x14, alt-8x8, alt-8x14,
alt-8x16, Cyr_a8x8, Cyr_a8x14, Cyr_8x16), но таблица UNIMAP есть только
для koi8-r. Иногда setsysfont (consolechars) не срабатывает с первого раза,
приходится повторять. В 2.2.12 вообще перестал работать
(клавиатура переключается, но вместо русских букв на экран выдается псевдографика,
а вместо псевдографики - русские буквы). В 2.2.14 работает
без проблем.
X11
Растровые шрифты. В принципе какой-то комплект входит в поставку,
но в RH 6.0 я взял более свежий с
kiarchive.
Встать в /usr/X11R6/lib/X11/fonts и распаковать. Появятся поддиректории
cyrillic/{75dpi|100dpi|misc}.
Шрифты из поставки можно удалить. В RH 6.2 я взял шрифты из дистрибутива.
Type1 шрифты. Взять с
kiarchive(pfb-шрифты).
А лучше взять шрифты вместе с pfm-метрикой в
gpi
(тогда fonts.dir и fonts.scale придется сделать самому). Можно еще взять
afm-метрику в
gpi.
Создать в /usr/X11R6/lib/X11/fonts/cyrillic поддиректорию Type1
и положить шрифты туда. Из fonts.dir-scale.add
сделать fonts.dir
и fonts.scale (не забыть добавить 16 первой строчкой). Шрифты в
формате pfa изготовляются из pfb-шрифтов программой pfbtops.
xfs. В RHL 6.0 все шрифты берутся от xfs (X font server).
Запускается в /etc/rc.d/init.d/xfs (по SIGHUP перезагружает конфигурационный
файл). Конфигурационный файл - /etc/X11/fs/config. Команда catalogue
определяет список директорий, из которых font server будет брать шрифты.
Вписать нужный cyrillic/...dpi в начало списка, затем cyrillic/misc, cyrillic/другойdpi,
cyrillic/Type1. Перезапустить xfs (/etc/rc.d/init.d/xfs stop; /etc/rc.d/init.d/xfs
start). Только не надо делать это при работающем X сервере, он этого не
любит.
locale. В XFree86 3.3. (X11R6) уже должен быть locale ru_RU.KOI8-R.
Если нет, то можно взять на chg.ru
(X11R5,
X11R6).
Чтобы его включить надо установить переменную LANG равной ru_RU.KOI8-R
(например, в ~/.bashrc). Я попробовал... Gnome явно пытается говорить по
русски, В заголовках окон у него это получается, а
вот в остальных местах он пытается использовать ISO5589-5, которого у меня
нет, пришлось отключить. В RH 6.2 (XFree86 3.3.6) русский язык уже
почти везде нормально смотрится (на этот раз кроме
заголовков окошек :).
Ввод. Правильный метод. Использование Cyrillic_* keysyms в XKB.
Возникают проблемы со старыми программами. В XFree86 3.3.3 ошибка, приводящая
к использованию ISO8859-5 таблиц вместо KOI8-R. Есть
заплатка,
позволяющая это дело поправить (если, конечно, есть желание самому собирать
XFree86). Для того, чтобы включить русский ввод надо добавить
XkbKeymap "xfree86(ru)"
в секцию Keyboard файла XF86Config и установить переменную
окружения LANG=ru_RU.KOI8-R. К сожалению, RHL 6.0 как раз включает ошибочную
версию XFree86 3.3.3. К тому имеются проблемы с шрифтами у Gnome/enlightment
Ввод. Правильный метод в RH 6.2. Правый Alt работает как ModeShift
(русские буквы вводятся, пока на нее жмешь). В XF86Config в секции Keyboard
записываем (слова в кавычках являются именами файлов в соответствующих
поддиректориях /usr/X11R6/lib/X11/xkb, слова в скобках - именами секций
в соответствующих файлах):
- LeftAlt Meta
- RightAlt ModeShift
- ScrollLock ModeLock (не работает)
- RightCtl Control
- XkbKeymap "xfree86(ru)"
- XkbRules "xfree86"
- XkbModel "pc101"
- XkbLayout "ru" (раскладка "йцукенг" - как в MS Windows, кроме символов
над цифрами)
- закоментарить XkbKeycodes, XkbTypes, XkbCompat, XkbSymbols, XkbGeometry
Улучшения для правильного метода в RH 6.2.
-
Можно keymap/xfree86 (секция ru) поменять en_US(pc105)+ru на ru(winkeys),
чтобы в русском режиме вводились символы как на наклейках над цифрами.
-
на моей клавиатуре оказались "лишние" кнопки с окошками, которые я приспособил
для постоянного включения/выключения русского режима. В файле /usr/X11R6/lib/X11/xkb/symbols/ru
добавил определение для левой кнопки с окошком:
key <LWIN>{ symbols[Group1]= [ ISO_Next_Group ] };
key <RWIN>{ symbols[Group1]= [ ISO_Next_Group ] };
-
переделать файл /usr/X11R6/lib/X11/xkb/symbols/ru
под "яверты"
Ввод. Обманный Xmodmap. Подстановка "улучшенного"
Xmodmap
в /usr/X11R6/lib/X11/xinit/.Xmodmap, который подменяет стандартную раскладку
ISO8859-1 на KOI8-R. Может быть придется где-то вручную вызывать xmodmap
/usr/X11R6/lib/X11/xinit/.Xmodmap (это должен делать xinitrxc или ~/.xinitrc,
но всякое бывает). Прикладные программы после этого считают, что они имеют
дело с обычными латинскими символами, а при вводе после нажатия CapsLock
происходит преобразование в соответствии с клавиатурной раскладкой ЯВЕРТЫ.
Нарушает все концепции интернационализации в X11. У меня не заработало
в XFree86 3.3.3 (в прежних версиях работало отлично).
Ввод. Использование специальной программы перекодировки. Я опробовал
Xruskb
А. Лукьянова. Есть rpm в contrib. Единственный метод, который заработал
у меня в RH 6.0. Опять-таки должны возникать проблемы с "правильными" прикладными
программами. Запуск:
xrus yawerty-koi8.xmm
Переключение по кнопке или двум shift-ам.
Менеджеры окон и рабочего стола.
gnome/enlightment - нельзя выбирать Themes/BrushedMetal, иначе не будет
русских букв в заголовках окон (используется шрифт
lucida?).
Приложения под X11
gnome-terminal: setting->preferences->font->browse. В фильтрах ставим,
что шрифт должен иметь charset=koi8-r, после чего выбираем какой-нибудь
из шрифтов типа курьер (они моноширинные).
ghostscript. Копируем все .pfm, .afm и .pfb файлы из созданной ранее
cyrillic/Type1
в
/usr/share/fonts/default/ghostscript. Берем в
gpi
gs-Fontmap.add и добавляем его в конец /usr/share/ghostscript/5.10/Fontmap
(оригинал сохранить). Затем закоментировать в Fontmap алиасы для Helvetica,
Courier и Times, раскоментировать алиасы на соответствующие русские шрифты
(там два курьера, выбрать CourierCyrPS, см. про Netscape). Еще советуется
запускать с ключем -dNOPLATFONTS, но у меня gv и так с ним зпускается.
Преобразование ps в pcl для печати дл HP LaserJet:
gs -q -sDEVICE=ljet4 -r600x600 -sPAPERSIZE=a4 -dNOPAUSE -dSAFER
-dNOPLATFONTS -sOutputFile=-
Netscape 4.6: Edit->Preferences->Fonts. Для кодировки koi8-r выбираем
Times(cronyx) и Curier (cronix).
Почему-то netscape
не любит шрифтов Type1 (ни pfb, ни pfa, ни с метрикой, ни без нее).
Проблема при печати - он использует только встроенные метрики шрифтов и
русские буквы плывут. Есть
заплатка,
которая правит бинарник netscape, записывая туда метрики CourierCyrPS и
TimesCyrMT (любой версии, у меня сработало на 4.6/4.72). Естественно, теперь
нельзя удалять русские Type1 шрифты ;). Также при печати нет подчеркиваний,
цветов и оформления страницы (дата, имя файла и т.д.).
Конфигурирование
Пересборка ядра
Все делать из /usr/src/linux (если ядро из поставки). Если был сделан upgrade
пакета kernel_headers, то м.б. придется сделать ссылки для /usr/include/asm
и /usr/include/linux.
- make mrproper (удалить весь мусор от предыдущей конфигурации). Если
хочется сохранить предыдущую конфигурацию, то сказать: make dep; make clean.
- конфигурация ядра (не советую делать SCSI-драйвера модулями; увы
приходится это делать, если надо писать на ATAPI CD-RW)
- make config (в виде ответов на вопросы: Y, N или M), надежно
(ничего не забудешь поменять ;), 500
вопросов, на половину из которых не знаешь что сказать.
- make menuconfig (в виде меню), удобно (нужен ncurses_devel).
- make xconfig (под X-Windows), очень удобно :)
- make oldconfig (все ответы из .config)
- make dep
- make bzImage (не надо слепо следовать устаревшей инструкции и
делать make boot, он не влезет в загрузчик)
- make modules
- insmod loop до перемещения модулей, а то не найдет loop0
- удаляем совсем старую копию модулей (если она есть)
rm -rf /lib/modules/2.2.5-22-old
(нужен для mkinitrd)
- делаем текущий набор модулей старым
mv /lib/modules/2.2.5-22 /lib/modules/2.2.5-22-old
- инсталируем новый набор модулей (в /lib/modules/2.2.5-22)
make modules_install
- если все-таки сделал SCSI в виде модуля (или еще какой-нибудь модуль
нужен при загрузке; ide-scsi не нужен), то пересобери initrd (отредактировать
/etc/conf.modules (/etc/modules.conf в RedHat 7.0)
- вставить alias scsi_hostadapter имя-драйвераи соответствующие
options имя-драйвера имя-драйвера="параметры";
проверить alias eth0 - и выполнить
mkinitrd /boot/имя-нового-initrd 2.2.5-22
после чего отредактировать /etc/lilo.conf). Также необходимо
сделать, если раньше был модуль SCSI, а теперь его убрал или включил в ядро.
- копируем получившийся arch/i386/boot/bzImage в /boot/bzImage.new
(переименовав старый, если надо)
- копируем получившийся System.map в /boot/System.map (переименовав старый?),
klogd сначала пытается смотреть в /boot/System.map; если версия ядра не
совпадает, то в /System.map, а если и там не совпадает, то в /usr/src/linux/System.map
- добавляем новую секцию в /etc/lilo.conf со ссылками на новое ядро и м.б.
initrd (обязательно сохранив возможность загрузки старого ядра, System.map,
modules?, где взять module-info для нового ядра?)
- /sbin/lilo -v
- перезагружаемся - DMA все-равно приходится включать вручную через hdparm,
ибо не любит он WD :(
- /usr/src/linux занимает теперь 70МБ (RH 6.2 - 80 MB, RH 7.0 - 106 MB)
- скомпилированный emu10k1 не грузится, приходится брать модуль из дистрибутива
Создание initramfs для последующей загрузки
mkinitrd
dracut
linuxconf
источник
Поддерживает различные интерфейсы с пользователем:
- командная строка
- а/ц окна
- X11 (древовидное меню)
- www (позволяет удаленное администрирование, выключен по умолчанию)
Общие ощущения, как от Unixware 1.0: здорово, красиво, но ненадежно. Если
помнишь, как это вручную делается, то лучше сделать вручную. Так и есть!
Linuxconf ведет свою базу конфигурации и некоторые обычные конфигурационные
файлы генерирует исходя из нее при загрузке (например, sendmail.cf!), так
что вносить измения в них вручную безсмысленно. Есть мнение, что его надо
отключить (начальник д.б. один).
Управляет списком пользователей, групп, файловых систем (в т.ч. сетевых),
конфигурация локальной сети и PPP, сетевые клиенты и серверы, LILO.
control panel
Запускается командой control-panel в xterm. Является площадкой для запуска
отдельных графических средств конфигурации (printtool, kerneld, netcfg,
run level editor, time and date, modem configuration).
chkconfig
Манипуляция файлами в /etc/rc.d (какие сервисы запускать и останавливать
при переходе с уровня на уровень). Криво сделан. Проще вручную сделать,
но кругом натыкано проверок с помощью chkconfig. Он действует в терминах:
включен/выключен. На самом деле для сервиса м.б. как процедура включения,
так и выключения в любых комбинациях. В результате он выдает ответ "запущен
сервер или нет" в зависимости от того, какой файл создан в директории последним
- K или S!
Ключи:
- --list (получить список сервисов)
- --add имя (добавить сервис в список отслеживаемых)
- --del имя
- --level уровень имя [ on | off | reset
] (поднять/опустить/сбросить сервис на указанном уровне)
отдельные утилиты
- /usr/sbin/mouseconfig
- /usr/sbin/timeconfig, timetool, date, setclock, hwclock, adjtimex
- сервисы: /usr/sbin/ntsysv или /sbin/chkconfig
- mkbootdisk --device /dev/fd0 версия (хочет
vmlinuz, а не bzImage)
- Xconfigurator или vi /etc/X11/XF86Config (про существование
Interlace-режимов народ уже забыл :(
- создание и удаление пользователей, смена пароля: useradd, userdel, passwd, system-config-users (redhat-config-users)
- kbdconfig
Настройка TCP/IP
Для проверки настройки сети можно воспользоваться утилитами ping, traceroute и nmap.
Кстати, ping позволяет собирать часть маршрута, по которому прошёл пакет (-R)
и этот маршрут не совпадает с маршрутом от traceroute.
Полезными инструментами для изучения происходящего в сети являются программы
"аутопсии" пакетов tcpdump и ethereal (wireshark?).
Суперсервисы inetd и xinetd.
tcpwrapper (tcpd, libwrap.so, /etc/hosts.allow, /etc/hosts.deny,
hosts_access(5), hosts_options(5)).
Документация:
Сетевой экран реализован в различных версиях Linux следующими средствами:
Документация
- pppd.8, pppstats.8, char.8
- PPP-FAQ (1996)
- PPP-HOWTO (март 1997)
- /usr/doc/ppp-2.3.7
Ядро должно быть сконфигурировано с поддержкой PPP (netdriver/ppp, модули
ppp, slhc, bsd_comp
В RedHat 6.2 rp3 настраивает PPP почти нормально (правда, я не пробовал
настраивать диалог). Конфигурационный файл - "/etc/wvdial.conf".
rp3 аварийно завершается, если слишком быстро
нажать stop/start. Обрыва линии не замечает, так что приходится
прописывать в /etc/ppp/options lcp-echo-interval и lcp-echo-failure.
Адреса DNS-серверов берет от сервера доступа.
В RedHat 6.0 linuxconf и control-panel имеют недоработки в конфигурировании
PPP-доступа в интернет :( Так что я сделал так:
- добавляем в /etc/resolv.conf имя нашего DNS-сервера
nameserver 195.161.72.28
- убедиться, что /dev/modem указывает на нужное устройство (у меня COM2 -
/dev/ttyS1)
- завел в control-panel/network интерфейс ppp0, а затем отредактировал
конфигурационные файлы ручками
- /etc/ppp/options (не забывать про ~/.ppprc)
- lock #чтобы никто больше не лез к тому же самому порту во время
работы pppd
- modem crtscts #нормальная синхронизация и сигналы
- mtu 576 mru 576 # стандартный размер блока (1500) мешает одновременно
работать с telnet и ftp
- asyncmap 00000000 # использовать все символы
- defaultroute # поднимать маршрутизацию после установления соединения
- debug kdebug 1 # потом можно выключить
- lcp-echo-interval 20 lcp-echo-failure 3 # при
разрыве связи pppd почему не получает извещения об этом, приходится
непрерывно проверять целостность соединения через LCP echo.
Может
приладить програмку, которая будет смотреть /proc/tty/driver/serial и рубить
pppd при пропадании сигнала?
- /etc/sysconfig/network-scripts/chat-ppp0 (у меня модем Zyxel
Elite 2864), содержит
expect-send пары для chat
- 'TIMEOUT' '2'
- 'ABORT' 'BUSY'
- 'ABORT' 'ERROR'
- 'ABORT' 'NO CARRIER'
- 'ABORT' 'NO DIAL TONE'
- '' 'ATI2&F'
- 'OK' 'AT*E1&S1S13=2S42=64S52=96'
- 'OK' 'ATDP9329765'
- 'TIMEOUT' '45'
- 'CONNECT' ''
- 'TIMEOUT' '15'
- 'Username:' 'имя'
- 'Password:' '\qпароль'
- /etc/sysconfig/network-scripts/ifcfg-ppp0 по вкусу (например, уменьшить
RETRYTIMEOUT)
- после подъема/опускания канала pppd вызывает /etc/ppp/ip-up и /etc/ppp/ip-down,
которые при необходимости тоже можно настроить (параметры: интерфейс, tty,
скорость, localip, remoteip, ipparam)
- создать в /etc/ppp скрипты для запуска ppp (названия условны):
- deol-up: /etc/sysconfig/network-scripts/ifup-ppp /etc/sysconfig/network-scripts/ifcfg-ppp0
- deol-down: /etc/sysconfig/network-scripts/ifdown-ppp /etc/sysconfig/network-scripts/ifcfg-ppp0
- вызывать deol-up/deol-down ручками, вставить в crontab или в графическое
меню - дело вкуса (только с правами надо разобраться)
- а где же pppdump?
The Linux Graphics Stack
запуск ("Ной родил Иакова, Иаков родил...")
Начинается все со startx: добавляет xauth для доступа данного
пользователя через unix и localhost к X-серверу и вызывает xinit.
Т.к. никто их оттуда (.Xauthority и .ICEauthority) не удаляет,
то через некоторое время запуск X начинает тормозить (пытается обратиться
к серверу доступа через указанные в этих файлах порты, а там уже никого
нет). Пришлось в собственный скрипт перед запуском startx добавить
обнуление этих файлов).
xinit убеждается в наличии /etc/X11/xinit/Xclients и вызывает
его.
Xclients пытается определить какой desktop установлен и запускает
gnome-session/strtkde/Another Level/AfterStep/...
gnome-session (--help)...
X сервер
Ключ "--nolisten tcp" отменяет прослушивание порта 6000 для общения
с клиентскими программами по TCP/IP. После этого клиентские программы на
этом же хосте, но из-под другого пользователя не запускаются.
Для Gnome необходимо отредактировать DisallowTCP в /etc/X11/gdm/gdm.conf
Подключение к xdm (сервер XDMCP) из F10
Xnest :2 -query имя-хоста -from наш-адрес (экраны 0 и 1 заняты;
надо открыть порт TCP/6002 на своём хосте; "-broadcast" соединяет с первым
попавшимся xdm/gdm/kdm; "-indirect" выдаёт список, но соединяет только с собой;
установка русского языка для сеанса недопустима; завершить сеанс невозможно)
Включение XDMCP
В /etc/gdm/custom.conf убедиться что "WaylandEnable=false" и перед добавить в секцию [xdmcp] строку
Enable=true
Затем перезапустить gdm ("systemctl restart gdm.service") - все процессы в графических сеансах умрут!
Теперь на клиентской машине можно выполнить (дисплей :1 обычно доступен по нажатию Ctrl-Alt-F8)
X :1 -query имя-хоста
VNC
Пакеты vnc и vnc-server (realvnc) обеспечивают возможность просмотра и создания удалённого рабочего стола.
Создание удалённого рабочего стола: зайти ssh на удалённый хост (не д.б. установлена DISPLAY),
отредактировать по вкусу $HOME/.vnc/xstartup
и создать удалённый рабочий стол командой "vncserver [:номер-сеанса] -geometry ШиринаxВысота -depth 24 -listen tcp"
(запускается виртуальный X сервер, при первом запуске запрашивается пароль и запоминается в $HOME/.vnc/passwd).
Пример xstartup:
#!/bin/sh
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
# xsetroot -solid grey
# autocutsel-s PRIMARY -fork
vncconfig -iconic &
gnome-session
# startkde
# GNOME_SHELL_SESSION_MODE=classic gnome-session
# exec cinnamon-session &
# /usr/bin/mate-session
# xfce4-session &
# icewm-session &
Подключение к ранее созданному рабочему столу: "vncviewer адрес::номер-сеанса -FullColor".
Отключение от удалённого стола не разрушает его - виртуальный X сервер и все его клиенты продолжают работать.
Можно иметь несколько одновременных подключений к одному и тому же удалённому столу.
Изменение размера экрана без прерывания сеанса:
xrandr --verbose # посмотреть идентификатор и режимы
xrandr --output идентификатор --mode режим
Переключение языка ввода русский/английский производится на клиенте.
Сервер получает уже готовые символы русского языка, потому на сервере переключатель языка ввода необходимо удалить.
Протокол VNC поддерживает только ISO-8859-1 (Latin1) при передаче clipboard.
Всё остальное преобразуется в ASCII строки вида "\u0430", обратное преобразование:
python -c "print unicode(raw_input(), 'unicode-escape');"
Пакет vino обеспечивает встроенный в Gnome VNC сервер (настроить удалённый рабочий стол в настройках сети, порт 5900).
Пакет vinagre обеспечивает VNC клиент для Gnome.
RDP
Сервер - пакеты xrdp и xorgxrdp. Клиент rdesktop (пропал в CentOS7) и freerdp.
Менеджеры окон
Рабочий стол
Gnome
Количество глюков просто поражает, особенно если запускать на одном
экране приложения для нескольких пользователей.
Запуск панели, если она грохнулась: gnome-panel.
Каждая программа из комплекта gnome имеет привычку прислушиваться к
tcp порту из клиентского интервала. Это даже не дыра, а открытые ворота
в системе безопасности. На многократно заданный вопрос один из авторов
заявил: "gnome(ORBit) специально предназначен для работы в сетевом окружении
и порты он будет прослушивать всегда, а наша система безопасности - непробиваема".
Предполагается, что по этому порту программа получает команды от session-manager
(попытка отключить его с помощью ключа запуска --sm-disable или заменой
запуска gnome-session на gnome-wm ни к чему не привела - порты открываются
в любом случае). Таким образом любой осталоп может сконнектиться на этот
порт и "пообщаться" с программой, что иногда вызывает ее аварийное завершение
(если постараться, то и очередной buffer overflow exploit найти можно).
Под горячую руку я закрыл доступ к любым серверным программам на интервале
клиентских портов (фильтруя SYN пакеты), но говорят, что можно закрыть
это безобразие через tcpwrapper (host_access(5)).
xterm
Проблема при работе в linux из xterm под Solaris: не выходит из режимов
реверса и подчеркивания (less)
- infocmp xterm (в Solaris)
- записать в файл в linux (например, xterm-sol.ti)
- отредактировать имя терминала (например, xterm-sol)
- tic -v xterm-sol.ti (в linux, с правами root)
- при каждом заходе из Solaris в linux делать: export TERM=xterm-sol
(или встроить в .bash_profile разбор откуда мы пришли по DISPLAY или -
в RH 6.2 - по REMOTEHOST)
Печать
Ссылки:
- Printing-HOWTO
- Printing-Usage-HOWTO
Пакеты printtool, rhs-printfilters и lpr обеспечивают вполне сносные средства
для настройки и печати.
Установка сетевого принтера.
Печать буклетов по 4 страницы на лист (по 8 на двух сторонах):
- pdftops -paper A4 -expand primer.pdf primer.ps
- gv primer.ps (отметить нужные страницы и сохранить в primer.1m.ps)
- pstops -pa4 '2:0L@.707(21cm,0)+1L@.707(21cm,14.85cm)' primer.1m.ps primer.2m.ps
- pstops -pa4 '2:0L@.7(21cm,-0.6cm)+1L@.7(21cm,13.9cm)' primer.2m.ps primer.4m.ps
- gv primer.4m.ps (печать)
Процессы, потоки и сигналы
При создании процесса он получает PID (Process ID) - уникальный номер в пределах своего пространства имён процессов.
Сохраняется после выполнения execve().
PPID (Parent process ID) - идентификатор процесса, создавшего текущий с использованием fork().
Сохраняется после выполнения execve().
SID (session ID) - идентификатор сессии, наследуется от родителя. Может быть изменён setsid(2) - SID образуется из PID (лидер сессии).
Сохраняется после выполнения execve().
Сессия - группа процессов с одинаковым SID. Все процессы сессии имеют общий управляющий терминал. Терминал может управлять только одной сессией.
PGID (Process group ID) - идентификатор группы процессов (job), наследуется от родителя. Может быть изменён setpgid(2).
Сохраняется после выполнения execve().
Оболочка создаёт отдельную группу для каждой команды или трубопровода (pipeline, "|").
Процесс, чей PID совпадает с PGID, является лидером группы.
Все процессы группы имеют одинаковый SID. В сессии может быть только одно задание (job) переднего плана (foreground), остальные - фоновые (background).
Только задание переднего плана может читать с терминала, фоновое задание тормозится при попытке чтения с терминала (SIGTTIN).
Сигналы с терминала (например, ^C) посылаются заданию переднего плана.
Первоначально (до glibc 2.4) в Linux были реализованы LinuxThreads, в настоящее время (Linux 2.6, glibc 2.3.2) - NPTL (Native POSIX Threads Library).
Отображение 1:1 с потоками планирования ядра. В NPTL синхронизация потоков производится
с использованием futex.7(fast user-space locking, в редких случаях ядро всё же используется) и сигналов 32 и 33 (нельзя использовать в приложении).
futex используется для реализации mutex, условных переменных, блокировок чтения и записи, барьеров и семафоров.
Определение используемой версии: getconf GNU_LIBPTHREAD_VERSION.
Выбор старой реализации: переменная окружения LD_ASSUME_KERNEL=2.2.5.
Все потоки процесса имеют одинаковое значение идентификаторов процесса с точки зрения приложения и могут различаться в ядре
(NPTL борется с этим с помощью обёртки вокруг системных вызовов - меняет идентификаторы для всех остальных потоков,
записывая задание в глобальную память и посылая сигнал).
Потоки разделяют общую глобальную память, аттрибуты (PID, PPID, GID, SID, управляющий терминал, uid, gid, дескрипторы открытых файлов,
блокировки, тип реакции (disposition) на сигналы, umask, текущий и корневой каталоги, таймеры, nice (не реализовано в NPTL?), лимиты ресурсов, счётчики ресурсов),
но имеют собственные: стек, идентификатор потока (уникальны только внутри процесса),
маску сигналов, errno, альтернативный стек сигналов, политика и приоритет реального времени,
возможности, привязку ЦП.
Сигналы делятся на стандартные и сигналы реального времени (от SIGRTMIN до SIGRTMAX, от 32 до 64).
Сигналы реального времени с одним номером образуют очередь, причём порядок гарантируется (сигнал с младшим номером приоритетнее), стандартные - сливаются.
С сигналом реального времени можно передавать данные, автоматически передаются PID и uid.
Типы реакции на сигналы (disposition): завершить процесс, игнорировать сигнал, завершить сигнал и бросить корку, остановить процесс, продолжить процесс.
Тип реакции на определённый сигнал можно изменить sigaction.2 или signal.2, в том числе можно задать функцию обработки сигнала.
Каждый поток имеет маску сигналов, что позволяет блокировать передачу сигнала. Поток может получить список ожидающих сигналов.
Сигнал процессу направляется произвольному потоку, который не заблокировал сигнал этого типа.
Таблица сигналов (номера даны для x86/arm):
- SIGHUP (1) - завершить - завершение управляющего процесса
- SIGINT (2) - завершить - прерывание с клавиатуры
- SIGQUIT (3) - завершить и core - выход
- SIGILL (4) - завершить и core - незаконная инструкция
- SIGTRAP (5) - завершить и core - точка трассировки или остановки
- SIGABRT (6) - завершить и core - сигнал от abort.3
- SIGIOT (6) - завершить и core - ловушка IOT
- SIGBUS (7) - завершить и core - неверный доступ к памяти (память выделили, но там проблема)
- SIGFPE (8) - завершить и core - ошибка плавающей точки
- SIGKILL (9) - завершить - нельзя перехватить, игнорировать или блокировать
- SIGUSR1 (10) - завершить - сигнал пользователя 1
- SIGSEGV (11) - завершить и core - неверная ссылка на память (не выделили память?)
- SIGUSR2 (12) - завершить - сигнал пользователя 2
- SIGPIPE (13) - завершить - пишем в пустоту
- SIGALRM (14) - завершить - сигнал от alarm.2
- SIGTERM (15) - завершить - сигнал завершения
- SIGSTKFLT (16) - завершить - сбой стека сопроцессора (не используется)
- SIGCHLD (17) - игнорировать - потомок завершён или остановлен
- SIGCONT (18) - продолжить - продолжить остановленное
- SIGSTOP (19) - остановить - остановить процесс; нельзя перехватить, игнорировать или блокировать
- SIGTSTP (20) - остановить - остановить ввод с терминала
- SIGTTIN (21) - остановить - ввод для фонового процесса
- SIGTTOU (22) - остановить - вывод для фонового процесса
- SIGURG (23) - игнорировать - срочное событие сокета
- SIGXCPU (24) - завершить и core - исчерпан лимит ЦП
- SIGXFSZ (25) - завершить и core - исчерпан лимит размера файла
- SIGVTALRM (26) - остановить - виртуальный будильник
- SIGPROF (27) - остановить - завершение таймера профилировщика
- SIGWINCH (28) - игнорировать - изменение размера окна
- SIGPOLL (29) - завершить - событие
- SIGIO (29) - завершить - ввод-вывод доступен
- SIGPWR (30) - сбой питания (а оборудование есть?)
- SIGSYS (31) - завершить и core - неверный системный вызов
Обработка сигнала может вклиниваться в обработку системного вызова и библиотечной функции.
После обработки сигнала системный вызов может начать обработку с начала или вызвать ошибку EINTR
(выбор см. sigaction.2 SA_RESTART и кровавые подробности в signal.7 и signal-safety.7).
EINTR может возникать при остановке и возобновлении процесса для небольшого количества
системных вызовов и библиотечных функций (работа с сокетами, семафорами, futex).
Утилита kill (не путать с командой оболочки kill) посылает указанный сигнал (по умолчанию TERM)
указанным по PID или имени процессам или группам процессов. Можно указать идентификатор потока, но сигнал всё равно будет
послан процессу (первому попавшемося потоку этого процесса, не заблокировавшему сигнал).
Процесс 0 - это все процессы текущей группы. Процесс -1 - это все процессы, кроме PID1.
Процесс -число - это группа процессов с лидером "число". Ключи:
- --signal {имя|номер}
- --list # вывести список имён сигналов
- --table # вывести список имён и номеров сигналов
- --all # не ограничиваться процссами с текущим uid
- --pid # вывести номера pid, определённых по имени; сигнал не посылать
- --queue значение # использовать sigqueue.3 вместо kill.2
Пользователи и группы
Каждый процесс ассоциируется с пользователем (uid) и группами (gid) - номера.
Реальный uid и gid определяют владельца процесса.
Эффективный uid (euid) и gid (egid) определяют права доступа к разделяемым ресурсам.
Сохранённые set-user-ID и set-group-ID - копии эффективных euid и egid.
Позволяют получать и сбрасывать привилегии переключаясь между euid/egid и реальным uid и gid.
Файлсистемный uid и gid определяют права доступа к файлам (не POSIX!).
Обычно совпадают с euid и egid (но setfsuid() и setfsgid() - рекомендуется перестать использовать).
Идентификаторы дополнительных (supplementary) групп - набор дополнительных gid, которые определяют права доступа к файлам.
Все идентификаторы наследуются при fork, pid/gid и дополнительные группы сохраняются при execve(),
euid/egid и сохранённые могут изменяться при execve().
Идентификаторы используются при вычислении прав, лимитов процесса.
Все потоки процесса имеют одинаковое значение идентификаторов.
Информация хранится в файлах (/etc/passwd - passwd.5; /etc/shadow - shadow.5; /etc/group - group.5; /etc/gshadow - gshadow.5), NSS.
/etc/login.defs (login.defs.5) определяет настройки /etc/shadow и утилит shadow-utils (не passwd!) и т.п.;
каждая строка содержит имя параметры, пробел и значение; параметры:
- UMASK # начальный umask; по умолчанию 022
- HOME_MODE # права доступа к домашнему каталогу
- PASS_* # контроль допустимых паролей
- UID_MIN
- UID_MAX
- SYS_UID_MIN
- SYS_UID_MAX
- GID_MIN
- GID_MAX
- SYS_GID_MIN
- SYS_GID_MAX
- USERDEL_CMD # выполнять при удалении пользователя
- CREATE_HOME
- DEFAULT_HOME # разрешать вход при отсутствии домашнего каталога (в "/")
- USERGROUPS_ENAB # удалять группу пользователя при удалении пользователя
- ENCRYPT_METHOD {DES|MD5|SHA256|SHA512}
- SHA_CRYPT_MAX_ROUNDS
- ENV_PATH # значение переменной окружения PATH
- ENV_SUPATH
- ENV_TZ
- ENVIRON_FILE имя-файла # файл содержит строки "имя=значение"
- FAIL_DELAY секунд # задержка после неудачного входа
- FAKE_SHELL
- FTMP_FILE имя-файла # utmp
- ISSUE_FILE имя-файла # содержимое выводится перед запросом входа
- LASTLOG_ENAB # вести /var/log/lastlog
- LOG_OK_LOGINS
- LOG_UNKFAIL_ENAB # записывать в журнал имена неудачников
- LOGIN_RETRIES
- LOGIN_TIMEOUT
- MAIL_CHECK_ENAB # проверять почтовый ящик при входе
- MAIL_DIR # каталог для почтых ящиков
- MAIL_FILE # почтовый ящик в домашнем каталоге
- MOTD_FILE список-файлов # содержимое выводится после входа
- NOLOGINS_FILE имя-файла # содержимое выводится при запрете входа
- SULOG_FILE имя-файла # записывать деятельность su в этот файл
- SU_WHEEL_ONLY # только члены группы 0 могут становиться 0
- SYSLOG_SG_ENAB # записывать деятельность sg в syslog
- SYSLOG_SU_ENAB # записывать деятельность su в syslog
- ULIMIT
/etc/shells (shells.5) определяет список допустимых оболочек.
Утилиты:
- id [имя-пользователя ...] # вывести информацию о пользователе:
- --real # выводить реальные номера вместо эффективных
- --name # выводить имена вместо номеров
- --user # euid
- --group # egid
- --groups # все группы (egid и дополнительные)
- --context # контекст SELinux
- groups [имя-пользователя ...] # вывести список групп, члееном которых состоит пользователь
- login # начать сеанс; заправшивать имя и пароль;
ключи:
- -p # не инициализировать окружение
- -h имя-хоста # используется /etc/pam.d/remote вместо /etc/pam.d/login
- sulogin # вызывается init в режиме одиночного использования; запрашивается пароль root; ключи:
- --force # если проблемы с файлами /etc/passwd и /etc/shadow, то не спрашивать пароль
- --login-shell
- --timeout секеунд
- su [имя-пользователя [аргумент ...]] # по умолчанию интерактивная оболочка и пользователь root;
выполнить команду с другими реальными идентификаторами пользователя и группы;
убивает всех при получении сигнала SIGINT, SIGQUIT или SIGTERM;
настройки в /etc/login.defs и /etc/default/su;
ключи:
- --command=команда
- --group=имя-группы
- --supp-group=дополнительная-группа # только для пользователя root
- --login | - # инициализация окружения, смена текущего каталога на домашний, ? начать сеанс
- --preserve-environment
- --pty # создать псевдотерминал для новой сессии
- --shell=оболочка # иначе используется оболочка из переменной окружения SHELL или из /etc/passwd или /bin/sh
- runuser -u пользователь команда аргументы ... # выполнить команду с другими реальными идентификаторами пользователя и группы;
по умолчанию интерактивная оболочка и пользователь root;
настройки в /etc/login.defs и /etc/default/runuser;
может выполняться только от root; не запрашивает пароль; /etc/pam.d/runuser и /etc/pam.d/runuser-l; ключи:
- --command=команда
- --group=имя-группы
- --supp-group=дополнительная-группа
- --login | - # инициализация окружения, смена текущего каталога на домашний, ? начать сеанс
- --preserve-environment
- --shell=оболочка # иначе используется оболочка из переменной окружения SHELL или из /etc/passwd или /bin/sh
- setpriv программа [аргументы] # выполнить программу с другими привилегиями;
не запрашивает пароль, не начинает новый сеанс; ключи:
- {--ruid|--euid|--reuid} идентификатор-пользователя # установить реальный, эффективный или оба uid; возможности не меняются
- {--rgid|--egid|--regid} идентификатор-группы # установить реальный, эффективный или оба gid; возможности не меняются;
не забудьте поменять список дополнительных групп
- --clear-groups # очистить список дополнительных групп
- --groups список-дополнительных-групп # установить список дополнительных групп
- --keep-groups # не трогать список дополнительных групп
- --init-groups # инициализировать список дополнительных групп из настроек пользователя
- --dump [--dump] # вывести текущие привилегии (euid/egid, возможности и т.д.)
- --list-caps # вывести список известных возможностей
- --inh-caps {+|-}возможность[,...]
- --ambient-caps {+|-}возможность[,...]
- --bounding-set {+|-}возможность[,...]
- --no-new-privs # с этим битом привилегии в дальнейшем не добавляются, бит невозможно сбросить
- --securebits {+|-}{noroot|noroot_locked|no_setuid_fixup|no_setuid_fixup_locked|keep_caps_locked}[,...] #
установить или сбросить биты безопасности; keep_caps всегда сбрасывается
- --pdeathsig {keep|clear|сигнал} # установить сигнал смерти
- --selinux-label метка
- --apparmor-profile профиль
- newgrp [-] [имя-группы] # изменить реальный идентификатор группы; может потребоваться ввести пароль группы; "-" вызывает инициализацию окружения
- sg [-] [имя-группы [-c] команда] # выполнить команду с указанным реальным идентификатором группы
- useradd userdel usermod passwd chfn chsh chage chpasswd newusers # работа со списком пользователей
- pwck # проверить корректность файлов passwd и shadow
- pwconv pwunconv grpconv grpunconv # конвертация /etc/passwd, /etc/group, /etc/shadow, and /etc/gshadow
- groupadd groupdel groupmod gpasswd chgpasswd groupmems # работа со списком групп
- lastlog [--user имя] # вывести список последних входов (/var/log/lastlog); показываются текущие пользователи
Возможности (capabilities)
Когда-то давно в целях проверки прав (авторизация) процессы делились на 2 категории:
процессы с euid 0, которым разрешалось всё без дальнейшей проверки, и процессы с euid не равным 0,
права которых проверялись исходя из euid, egid и дополнительных групп.
Сейчас права суперпользователя (euid 0) разделяются на возможности (capabilities).
Наличие определённой возможности у потока даёт право на соответствующие действия:
- CAP_AUDIT_CONTROL - управление аудитом: включить, выключить, изменить правила
- CAP_AUDIT_READ - чтение журнала аудита через сокет
- CAP_AUDIT_WRITE - запись в журнал аудита
- CAP_BLOCK_SUSPEND - блокировка перехода системы в режим ожидания
- CAP_CHOWN - полные права изменения uid/gid файла
- CAP_DAC_OVERRIDE - обход проверки всех прав доступа к файлам (DAC - discretionary access control)
- CAP_DAC_READ_SEARCH - обход проверки права на чтение и выполнение для каталогов
- CAP_FOWNER - обход проверки на владельца файла
- CAP_FSETID - не сбрасывать флаги suid/guid при модификации файла
- CAP_IPC_LOCK - право н блокировку памяти
- CAP_IPC_OWNER - обход проверки прав для IPC
- CAP_KILL - обход проверки прав на посылку сигналов
- CAP_LEASE - lease (?) на произвольные файлы
- CAP_LINUX_IMMUTABLE - право установить флаги FS_APPEND_FL и FS_IMMUTABLE_FL для inode (?)
- CAP_MAC_ADMIN - настройка MAC (Mandatory Access Control)
- CAP_MAC_OVERRIDE - не проверять MAC (Mandatory Access Control)
- CAP_MKNOD - право выполнять mknod
- CAP_NET_ADMIN - право управлять сетью
- CAP_NET_BIND_SERVICE - право работать с привилегированными портами (ниже 1024)
- CAP_NET_BROADCAST - широковещательные и груповые операции
- CAP_NET_RAW - работа с сырыми (RAW) и пакетными сокетами
- CAP_SETGID - манипуляции с GID
- CAP_SETFCAP - установка произвольных возможностей для файла (?)
- CAP_SETPCAP - добавлять любую возможность из набора ограничений в набор наследования, сбрасывать набор ограничений, изменять бит безопасности
- CAP_SETUID - манипуляции с UID
- CAP_SYS_ADMIN - масса возможностей
- CAP_SYS_BOOT - право на перезагрузку и kexec
- CAP_SYS_CHROOT - право на chroot()
- CAP_SYS_MODULE - право на загрузку и выгрузку модулей ядра
- CAP_SYS_NICE - право на изменение nice, приоритетов, политики реального времени для любых процессов;
привязка ЦП; параметры планировщика ввода-вывода; миграция страниц
- CAP_SYS_PACCT - использование acct.2
- CAP_SYS_PTRACE - право на ptrace.2 на произвольный процесс; обмен данными с памятью любого процесса
- CAP_SYS_RAWIO - доступ к портам ввода-вывода, /proc/kcore, FIBMAP, MSRs, /proc/bus/pci, /dev/mem, /dev/kmem, cciss
- CAP_SYS_RESOURCE - доступ к резервному месту в ext2, обход квотирования, увеличение лимитов и пр.
- CAP_SYS_TIME - право на установку часов, аппаратных часов
- CAP_SYS_TTY_CONFIG - операции над виртуальными терминалами
- CAP_SYSLOG - привилегированные операции на syslog
- CAP_WAKE_ALARM - право взводить будильник
Для каждого потока устанавливается 3 набора возможностей, которые наследуются при fork
и которые можно посмотреть в /proc/идентификатор-процесса/task/идентификатор-потока/status (/proc/идентификатор-процесса/status для главного потока процесса):
- эффективные (e, CapEff) определяют текущие права потока
- разрешённые (p, CapPrm) к переводу в эффективные, только их можно добавлять в наследуемые не имея возможности CAP_SETPCAP
- наследуемые (i, CapInh, inheritable) после выполнения execve.2;
наследуемые возможности добавляются к разрешённым при выполнении программы, имеющей эти возможности в наследуемых
Выражения списка возможностей составляются из групп возможностей через пробел,
группа состоит из списка имён возможностей через запятую, знака операции ("+" (добавить), "=" (установить) через пробел)
и символа набора (eip). Например 3 группы: "= cap_sys_chroot+ep cap_net_bind_service+eip" (обнуление, добавление cap_sys_chroot
в наборы эффективных и разрешённых, добавление cap_net_bind_service во все наборы).
Ограничивающий - Capability bounding (CapBnd) - набор возможностей потока, который является фильтром для эффективного набора.
Внешний - Ambient (CapAmb, с ядра 4.3) - набор возможностей потока, описать смысл словами невозможно,
используйте для новых значений наборов формулы из capabilities.7.
Наследуется по fork.2 и сохраняется при execve.2.
Биты можно сбросить с помощью prctl.2 (требуется возможность CAP_SETPCAP), но нельзя взвести.
К исполняемому файлу может быть привязан набор возможностей в виде расширенного атрибута файлов security.capability
(ext*, XFS, btrfs, OverlayFS). Посмотреть можно с помощью "getfattr --name=security.capability -d имя-файла" (выдаёт чудное значение вида
"security.capability=0sAAAAAgAwAAAAAAAAAAAAAAAAAAA=") или getcap (выдаёт описанное выше выражение "cap_net_admin,cap_net_raw+p")
Для изменения набора для файла требуется возможность CAP_SETFCAP.
Разрешённый набор файла (первоначально forced) замещает разрешённый набор потока (?),
наследуемый набор файла (первоначально allowed) вычисляется AND с наследуемым набором потока для вычисления нового набора наследумых (?).
Эффективный набор файла (в другом месте говориться, что всего 1 бит) - новые разрешённые возможности устанавливаются как эффективные.
Привязанный к файлу набор возможностей замещает действия suid/sgid битов, при отсутствии привязки к файлу набора возможностей suid/sgid биты продолжают действовать.
Игнорируются, если файловая система смонтирована с nosuid или процесс под трассировкой ptrace.
Если поток имеет права суперпользователя, то все биты в разрешённых и наследуемых наборах, привязанных к файлу, считаются равными 1.
Эффективный и разрешённый наборы потока маскируются ограничивающим набором даже для суперпользователя и suid программ.
Новые значения наборов при выполнении execve.2 вычисляются как результат побитовых операций для несуперпользователя:
- ambient сбрасывается для привилегированного файла, не изменяется для остальных
- permitted = (inheritable ∧ F(inheritable)) | F(permitted) ∧ bounding) | новый ambient
- effective = F(effective) ? новый permitted : новый ambient
- inheritable не изменяется
- bounding не изменяется
Новые значения наборов при использовании библиотеки libcap:
- если поток не имеет CAP_SETPCAP, то новый наследуемый набор д.б. подмножеством "старый наследуемый ∧ старый разрешённый"
- новый наследуемый набор д.б. подмножеством "старый наследуемый ∧ старый ограничивающий"
- новый разрешённый набор д.б. подмножеством старого разрешённого
- новый эффективный набор д.б. подмножеством старого эффективного
К этому безобразию (интересно - понимают ли сами авторы понатворённое? заплаточники!) добавляются флаги (биты) безопасности для потока (в формате Verilog ;),
ограничивающие права суперпользователя (PR_SET_SECUREBITS и PR_GET_SECUREBITS в prctl.2; кстати, там ещё много кровавых подробностей):
- secure-keep-caps (SECBIT_KEEP_CAPS) - позволяет сохранить возможности в эффективном и разрешений наборах при изменении uid с 0 на не 0;
флаг обнуляется при execve.2; не действует при установке флага SECBIT_NO_SETUID_FIXUP (PR_SET_KEEPCAPS в prctl.2)
- secure-no-suid-fixup (SECBIT_NO_SETUID_FIXUP) - не менять эффективный, разрешённый и внешний наборы при изменении uid в 0 и обратно
- secure-noroot (SECBIT_NOROOT) - не давать возможностей при выполнении suid программ и вызове execve.2 потоком с uid 0
- secure-no-ambient-raise (SECBIT_NO_CAP_AMBIENT_RAISE) - не разрешать подъём битов внешнего набора возможностей с помощью PR_CAP_AMBIENT_RAISE в prctl.2
Флаги безопасности наследуются и сохраняются при execve.2, кроме SECBIT_KEEP_CAPS, который сбрасывается.
Для каждого флага безопасности имеет дополнительный флаг с _LOCKED: SECBIT_KEEP_CAPS_LOCKED, SECBIT_NO_SETUID_FIXUP_LOCKED,
SECBIT_NOROOT_LOCKED, SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED. Установка флага ..._LOCKED запрещает изменение базового флага.
Отдельно стоящий бит no-new-privs - привязанные к файлу возможности и suid/sgid не позволят получить разрешений с помощью execve.2,
которые поток не смог бы получить без них; не может быть сброшен, наследуется потомками fork.2 и clone.2, сохраняется execve.2.
И ещё масса исключений (например, изменение uid с 0 на не 0 сбрасывет наборы возможностей эффективный, разрешённый и внешний,
если нет возможности SECBIT_KEEP_CAPS или SECBIT_NO_SETUID_FIXUP; если uid меняется на 0, то разрешённый набор копируется в эффективный; и др.).
Утилиты:
- setpriv программа ... # запустить указанную программу с изменёнными наборами возможностей, не использует PAM, не запрашивает пароль,
используется для сброса привилегий, ключи:
- {--ruid|--euid|--reuid} идентификатор-пользователя # установить реальный, эффективный или оба uid; возможности не меняются
- {--rgid|--egid|--regid} идентификатор-группы # установить реальный, эффективный или оба gid; возможности не меняются;
не забудьте поменять список дополнительных групп
- --clear-groups # очистить список дополнительных групп
- --groups список-дополнительных-групп # установить список дополнительных групп
- --keep-groups # не трогать список дополнительных групп
- --init-groups # инициализировать список дополнительных групп из настроек пользователя
- --dump [--dump] # вывести текущие привилегии (euid/egid, возможности и т.д.)
- --list-caps # вывести список известных возможностей
- --inh-caps {+|-}возможность[,...]
- --ambient-caps {+|-}возможность[,...]
- --bounding-set {+|-}возможность[,...]
- --no-new-privs # с этим битом привилегии в дальнейшем не добавляются, бит невозможно сбросить
- --securebits {+|-}{noroot|noroot_locked|no_setuid_fixup|no_setuid_fixup_locked|keep_caps_locked}[,...] #
установить или сбросить биты безопасности; keep_caps всегда сбрасывается
- --pdeathsig {keep|clear|сигнал} # установить сигнал смерти
- --selinux-label метка
- --apparmor-profile профиль
- capsh # окружение для исследования работы с возможностями, ключи:
- --print # вывести текущие привилегии (euid/egid, возможности, флаги безопасности и т.д.)
- -- [аргументы] # запустить /bin/bash (для указания команды можно использовать "-c 'команда'")
- == # выполнить capch с оставшимися аргументами, полезна для исследования работы execve
- --caps=выражение # эффективный набор? (синтаксис в cap_from_text.3)
- --drop=список-возможностей # требуется CAP_SETPCAP
- --inh=выражение # наследуемый набор
- --user=имя-пользователя # эффективный набор очищается
- --modes # вывести список режимов libcap - (PURE1E, PURE1E_INIT, NOPRIV)
- --mode=режим-libcap # использовать один из рекомендуемых наборов битов и флагов
- --inmode=режим-libcap # убедиться что текущий набор битов и флагов соответствует режиму
- --uid=идентификатор-пользователя # использовать setuid.2, требуется сделать подготовку самостоятельно
- --cap-uid=идентификатор-пользователя # использовать cap_setuid.3, подготовка автоматическая
- --is-uid=идентификатор-пользователя # проверить соответствие
- --gid=идентификатор-группы # использовать setgid.2, требуется сделать подготовку самостоятельно
- --is-gid=идентификатор-группы # проверить соответствие
- --groups=список-групп
- --keep={0|1} # SECBIT_KEEP_CAPS
- --secbits=битовая-маска-флагов-безопасности # формат маски в strtoul.3
- --chroot=путь # требуется CAP_SYS_CHROOT
- --forkfor=секунд # сделать fork.2 и заснуть, для экспериментов
- --killit=сигнал # послать сигнал после fork.2
- --decode=битовая-маска # дешифровка вывода /proc/идентификатор-процесса/status
- --supports=возможность # проверить наличие реализации указанной возможности
- --has-p=возможность # проверить наличие возможности в наборе разрешённых
- --has-ambient # проверить наличие реализации внешнего набора возможностей
- --has-a=возможность # проверить наличие возможности в наборе внешних
- --addamb=возможность # добавить возможность в набор внешних
- --delamb=возможность # удалить возможность из набора внешних
- --noamb # сбросить все возможности из набора внешних
- getcap имя-файла ... # вывести возможности, привязанные к файлу (cap-программы в базе: clockdiff, arping, newgidmap, newuidmap;
suid-программы в базе: at, chage, chfn, crontab, gpasswd, mount, newgrp, passwd, pkexec, su, umount,
grub2-set-bootflag, mount.nfs, pam_timestamp_check, unix_chkpwd); ключи:
- -r # пройтись рекурсивно рекурсивно
- -v # вывести имя файла, даже если возможности не привязаны
- -n # вывести ненулевые идентификаторы суперпользователей пространств имён пользователей, привязанные к этому файлу
- setcap {возможности|-|-r} имя-файла ... # установить возможности, привязанные к файлу;
выражение для списка возможностей как в cap_from_text.3 (описано выше);
"-" - читать с stdin до пустой строки; "-r" - удалить привязку возможностей из файла;
пустой набор и отсутствие набора неравнозначны;
ключи:
- -v # проверить что указанные возможности привязаны к файлу
- -n корневой-uid # пространство имён пользователей с указанным корневым uid
- -q # не болтать
- filecap [-a | имя-каталога | имя-файла [возможность ...] ] # пакет libcap-ng-utils;
вывести или установить возможности, привязанные к файлу; -a - по всей системе, начиная с /
- netcap # пакет libcap-ng-utils; вывести возможности процессов, связанных с сетью, и номера портов;
если не все возможности из набора ограничений установлены, то вывести "+"
- pscap [-a] # пакет libcap-ng-utils; вывести возможности процессов; если не все возможности из набора ограничений установлены, то вывести "+";
для процессов из подчинённых пространств имён пользователей выводится "*"; -a - включать процесс init
- captest # пакет libcap-ng-utils; вывести возможности текущего процесса и дочернего; ключи:
- --drop-all # сбросить все возможности
- --drop-caps # сбросить 3 основых набора
- --id # изменить uid и gid на 99, сбросить дополнительные группы, очистить ограничивающий набор
- --text # вывести в текстовом виде
- --lock # проверить работу флагов ..._LOCK
В двух словах о привилегиях Linux (capabilities)
Файловые системы
Список поддерживаемых типов файловых систем можно получить из файла /proc/filesystems
(не забудьте подгрузить модуль из /usr/lib/modules/версия-ядра/kernel/fs/):
- adfs - файловая система RiscOS (Acorn)
- affs - файловая система AmigaOS
- anon_inodefs (?)
- autofs - автоматическое монтирование
- bfs - boot file system для SCO UnixWare
- binfmt_misc - распознавание различных форматов исполняемых файлов и автоматический запуск эмуляторов и виртуальных машин
(/proc/sys/fs/binfmt_misc: status=enabled, register для добавления нового формата исполняемого файла)
- btrfs
- cachefiles - кеширование сетевой файловой системы с помощью локальной файловой системы (/dev/cachefiles)
- ceph - распределённая файловая система
- cmsfs - файловая система IBM (только чтение)
- cgroup - виртуальная файловая система, обеспечивающая возможность распределения ресурсов (control groups, /cgroup):
ЦП, память, блочные устройства; управление через /sys/fs/cgroup: cgroup.procs и tasks - процессы в группе
- cpuset - виртуальная файловая система, обеспечивающая возможность распределения ресурсов ЦП (/dev/cpuset);
ныне надстройка над cgroup
- coda - распределённая файловая система (развитие AFS - Andrew File System, AFS-2)
- cramfs - файловая система для ROM (только чтение, файл не более 16 MB,
файловая система не более 256 MB, сжатие файлов)
- debugfs - виртуальная файловая система, используется для простого доступа ко внутренним структурам при отладке ядра
("mount -t debugfs none /sys/kernel/debug")
- devfs - виртуальная файловая система, обеспечивающая доступ к драйверам устройств (/dev, devfsd)
- devpts - виртуальная файловая система для доступа к псевдотерминалам pts ("mount devpts /dev/pts -t devpts")
- devtmpfs - виртуальная файловая система, обеспечивающая доступ к драйверам устройств (/dev), улучшенный devfs
- dlm - Distributed Lock Manager (?), /proc/cluster/config/dlm/, /proc/cluster/dlm_*, /proc/cluster/lock_dlm/
- eCryptfs - шифрование файлов
- efs - старая файловая система SGI IRIX
- exofs (EXtended Object File System) - метаданные ext2 и внешнее объектное хранилище для данных, разработка Panasas
- extfs - первая версия стандартной файловой ситсемы Linux (не используется)
- ext2fs (ext2) - стандартная файловая система Linux, версия 2,
в настоящее время используется лишь под /boot
- ext3fs (ext3) - стандартная файловая система Linux, версия 3, журнализация
- ext4fs (ext4) - стандартная файловая система Linux, версия 4, экстенты
- fat - базовая часть файловой системы DOS (используется msdos fs, vfat и umsdos)
- freevxfs - имитация файловой системы Veritas
- fscache - кеширование сетевой файловой системы с помощью локальной файловой системы (используется cachefs)
- fuse - файловая система в пространстве пользователя
- fuse.gvfsd-fuse
- fusectl
- gfs, gfs2 - распределённая файловая система от Red Hat
- GlusterFS - распределённая файловая система
- hfs - файловая система Apple
- hpfs - файловая система OS/2
- hugetlbfs (?)
- inotifyfs - виртуальная файловая система для управления механизмом извещений об изменениях файлов inotify:
/proc/sys/fs/inotify (max_user_watches, max_queued_events), /sys/kernel/slab/inotify_event_cache,
/sys/kernel/slab/inotify_watch_cache
- iso9660 (isofs) - стандартная файловая система на CD-ROM ISO 9660 (aka High Sierra File System, hsfs) (утилиты)
- jffs, jffs2 - журнализируемая файловая система для бездисковых систем
- jfs - файловая системы из AIX (IBM)
- lustre
- minix - устаревшая файловая система ОС Minix (предшественик Linux)
- MSDOS fs - файловая система MSDOS (строится над fat)
- ncpfs (?)
- nfs - сетевая файловая система NFS
- ntfs - файловая система Windows NT
- openpromfs (?)
- overlay (OverlayFS) - псевдо файловая система над объединением других файловых систем
- pipefs (rpc_pipefs?) - например, используется для NFS (/var/lib/nfs/rpc_pipefs)
- procfs (proc) - виртуальная файловая система, обеспечивающая
информацию о процессах и состоянии ОС и позволяющая менять ее параметры (proc.5); опции монтирования:
- hidepid=уровень-скрытности # для /proc/идентификатор-процесса
- 0 - ничего не скрывать от других пользователей
- 1 - содержимое каталогов /proc/идентификатор-процесса от других пользователей недоступно
- 2 - каталоги /proc/идентификатор-процесса других пользователей невидимы (существование процесса можно открыть по "kill -0 идентификатор-процесса")
- gid=идентификатор-группы # давать членам этой группы доступ к чужим /proc/идентификатор-процесса
- qnx4 - файловая система ОС QNX4
- ramfs - файловая система в виртуальной памяти (лучше tmpfs?)
- reiserfs - журнализируемая файловая система на основе сбалансированного дерева
- romfs - файловая система ROM
- rootfs (?)
- squashfs - сжатая файловая система для LiveCD (только чтение)
- securityfs (?) - /selinux (?)
- smbfs - сетевая файловая система SMB (CIFS)
- sockfs (?)
- sysfs - виртуальная файловая система, обеспечивающая информацию об оборудовании и ОС (/sys)
- sysv - файловая система System V/Xenix/V7/Coherent
- tmpfs (ранее shmfs) - файловая система в виртуальной памяти; обеспечивает доступ
к разделяемой памяти POSIX (внутренняя точка монтирования, shmget.2, shm_overview.7, sem_overview.7) и glibc (/dev/shm),
а также /run, /run/user/идентификатор-пользователя, /tmp; размер меняется динамически;
утилита free показывает суммарный размер всех tmpfs как shared;
может сбрасываться в swap; при размонтировании содержимое теряется;
поддерживаются расширенные атрибуты, но user не разрешаются;
опции монтирования:
- size=размер # верхний предел; можно в %; может быть изменён при перемонтировании; по умолчанию - половина ОП
- nr_blocks=размер-в-блоках # верхний предел; размер блока - PAGE_CACHE_SIZE
- nr_inodes=количество-inode
- mode=права-доступа # к корневому каталогу
- uid=идентификатор-пользователя
- gid=идентификатор-группы
- mpol={default|prefer:узел|bind:список-узлов|interleave|interleave:список-узлов} # политика выделения памяти из NUMA узлов
- huge={never|always|within_size|advise|deny|force} # выделять большими страницами
- udf - файловая система DVD/CDRW (утилиты)
- ufs - файловая система BSD, SunOS, FreeBSD, NetBSD, OpenBSD, NeXTstep
- umsdos - имитация файловой системы Unix над файловой системой MS-DOS -
длинные имена, права доступа и т.д. (строится над fat и MSDOS fs)
- usbdevfs (usbfs) - виртуальная файловая система, которая
обеспечивает доступ к дереву файлов /proc/bus/usb (devices,
drivers, номер-шины/номер-устройства) для получения информации о USB-подсистеме
- vfat - файловая система Windows 95/98 (строится над fat): codepage=cp437,iocharset=iso8859-1,utf8,shortname=mixed
- xfs - журналируемая масштабируемая файловая система
Монтирование файловой системы
Перед использованием файловой системы её необходимо смонтировать - подсоединить дерево файлов подключаемой файловой системы
на место указанного каталога текущей файловой системы (содержимое каталога становится недоступным;
владелец и права доступа устанавливает mount исходя из параметров) - точку монтирования, образуя единое дерево:
"mount блочное-устройство каталог". Если устройство или каталог не указаны, то mount извлекает их из /etc/fstab.
Файловая система может быть смонтирована несколько раз, возможно в тот же самый каталог, под ответственность пользователя.
Сетевая файловая система NFS использует сетевое имя вместо имени устройства.
Специальные файловые системы (например, proc) используют всякое вместо имени устройства.
mount без параметров выдаёт список смонтированных файловых систем (ключ "-l" добавляет в вывод метки томов).
Типы точек монтирования определяют связи между ними (sharedsubtree.txt) при распространении (propagation) сообщений о событиях монтирования под ними:
- shared - клонированные с помощью --bind или clone.2точки монтирования образуют группу,
монтирование и размонтирование внутри группы автоматически распространяется на всех участников
- slave (делается из shared) - получает сообщения о монтированиях от главной точки монтирования (shared), но не может отправлять сообщения
- shared в одной группе и slave для другой (делается из slave)
- private - не распространяет и не получает сообщения
- unbindable - private и не может быть клонировано с помощью --bind
Сообщения о событиях с самой точкой монтирования определяется типом родительской точки монтирования.
Если родительская точка монтирования не shared, то умолчанию точка монтирования получает тип private
(systemd переделывает корень в shared, а unshare - всех в private).
Ключи mount:
- --help
- --version
- --verbose
- --fstab путь-к-fstab # можно указать имя каталога, в котором будут искаться файлы *.fstab
- {-a|--all} # монтировать по порядку всё найденное в /etc/fstab без опции noauto
- --fork # монтировать --all параллельно
- -O опции-фильтра-для-all # фильтровать монтируемые по ключу --all файловые системы по: _netdev, no_netdev
- -t список-типов-файловой-системы[.подтип] # или фильтр для --all (можно использовать префикс no); по умолчанию пытается определить автоматически;
первоначально типы читаются из /etc/filesystems (обычно в конце стоит "*", что вызывает чтение из /proc/filesystems);
могут вызываться вспомогательные программы "/sbin/mount.тип блочное-устройство каталог [-t тип.подтип] [-o опции] [-svfn]"
- {mount.nfs | mount.nfs4 } имя-сервера:путь точка-монтирования ключи -o NFS-опции
- mount.cifs //сервер/раздача точка-монтирования ключи -o опции
- mount.fuse # см. fusermount
- mount.glusterfs
- --label метка # искать блочное устройство по метке
- --show-labels # показать метки блочных устройств
- --uuid идентификатор # искать блочное устройство по UUID
- --internal-only # не вызывать /sbin/mount.тип
- --source # поясняет, что единственный параметр представляет собой устройство
- --target # поясняет, что единственный параметр представляет собой каталог
- --no-mtab # не писать в /etc/mtab
- {-r|--read-only}
- {-w|--rw|--read-write}
- {-o|--options} список-опций # предварительно извлекаются опции из /etc/fstab, если указан только 1 параметр команды mount
- --fake # имитация монтирования
- --no-canonicalize # не преобразовывать (повторно) пути
- --rbind старый-адрес новый-адрес # в /etc/fstab записывается как "старый-адрес новый-адрес none rbind";
дополнительно смонтировать часть имеющейся файловой иерархии (в т.ч. отдельный файл), включая подмонтированные файловые системы в новый-адрес;
механизм позволяет выходить за границы chroot;
старый и новый адрес равнозначны и могут быть отмонтированы;
в /etc/mtab и /proc/mounts не содержат слова bind (и старого адреса);
опции копируются от старой точки монтирования;
mount новее v2.31 (RHEL8) игнорирует bind из /etc/fstab при перемонтировании;
тип монтирования для нового адреса определяется сложным образом, см. таблицу 5c в sharedsubtree.txt
(тип "обычного" монтирования определяется из этой же таблицы исходя что блочное устройство всегда private);
можно монтировать на себя: "mount --rbind foo foo",
после чего сделать новую точку монтирования разделяемой и использовать совместно в новом пространстве имён файловых систем
- --bind старый-адрес новый-адрес # аналогично --bind, но не включая подмонтированные файловые системы;
опции копируются от старой точки монтирования, если не использовать дополнительно "-o bind,опции",
где в списке опций могут быть только ro, nosuid, nodev, noexec, noatime, nodiratime, relatime;
тип монтирования для нового адреса определяется сложным образом, см. таблицу 5b в sharedsubtree.txt;
- --move старый-адрес новый-адрес # передвинуть дерево со старого адреса (д.б. неразделяемой точкой монтирования) на новый;
тип монтирования для нового адреса определяется сложным образом, см. таблицу 5d в sharedsubtree.txt;
- {--make-shared|--make-slave|--make-private|--make-unbindable} точка-монтирования # изменение типа монтирования без рекурсии;
не читает /etc/fstab до util-linux 2.23; --make-private выносит точку монтирования из группы так что следующий --make-shared создаёт новую группу
- {--make-rshared|--make-rslave|--make-rprivate|--make-runbindable} точка-монтирования #
изменение типа монтирования рекурсивно по дереву; не читает /etc/fstab до util-linux 2.23
Универсальные опции (VFS-OPTION):
- async - весь ввод-вывод асинхронный
- atime - обновлять время последнего доступа при каждом доступе (не действует в новых ядрах?)
- noatime (подразумевает nodiratime) - не обновлять время последнего доступа при каждом доступе
- auto - монтировать при использовании ключа --all
- noauto - не монтировать при использовании ключа --all
- context=, fscontext=, defcontext=, rootcontext= - SELinux
- defaults - rw, suid, dev, exec, auto, nouser, async
- dev - файловая система может содержать специальные файлы устройств
- nodev - файловая система не может содержать специальные файлы устройств
- diratime (по умолчанию) - обновлять время последнего доступа к inode каталога при каждом доступе
- nodiratime - не обновлять время последнего доступа к inode каталога при каждом доступе
- dirsync - обновления каталога в синхронном режиме (creat, link, unlink, symlink, mkdir, rmdir, mknod, rename)
- exec - разрешить прямой запуск выполняемых файлов
- noexec - запретить прямой запуск выполняемых файлов
- group (подразумевает nosuid, nodev) - позволяет монтировать члену группы устройства без прав суперпользователя
- iversion - при каждом изменении inode увеличивать значение поля i_version
- noiversion - при каждом изменении inode не увеличивать значение поля i_version
- mand - разрешать обязательные блокировки на файловой системе
- nomand - не разрешать обязательные блокировки на файловой системе
- _netdev - требуется доступ к сети
- nofail - не вызывать ошибку при отсутствии устройства
- relatime (по умолчанию с 2.6.30) - время доступа к inode обновляется только если ранее
оно было меньше времени создания или изменения или меньше времени доступа на сутки
- norelatime - не relatime (а что?)
- strictatime - обновлять время последнего доступа при каждом доступе по настоящему
- nostrictatime - использовать умолчания ядра (а что?)
- lazytime - обновлять времена доступа, изменения, создания inode в ОП; переносится на постоянное хранение
при синхронизации, изменении inode, изгнании из ОП, после 24 часов
- nolazytime - не lazytime
- suid - учитывать suid, sgid и привязанные к файлу биты возможностей
- nosuid - не учитывать suidи прочее
- silent - ?
- loud - ?
- owner (подразумевает nosuid, nodev) - позволяет монтировать владельцу устройства без прав суперпользователя
- remount - перемонтирование, позволяет изменить опции файловой системы
- ro - только чтение
- rw - чтение и запись
- sync - весь ввод-вывод синхронный (медленно)
- user (подразумевает noexec, nosuid, nodev) - позволяет монтировать пользователю без прав суперпользователя (только в /etc/fstab);
без опции users размонтировать может только смонтировавший
- nouser (по умолчанию) для монтирования требуются права суперпользователя
- users (подразумевает noexec, nosuid, nodev) - позволяет любому монтировать и отмонтировать файловую систему
- X-* - интерпретируется приложением; не хранится в mtab, не передаётся программе mount.тип и mount.2
- X-mount.mkdir[=права] - создавать каталог точки монтирования при необходимости; по умолчанию права - 0755
- x-* - интерпретируется приложением, например systemd (x-systemd.growfs, x-systemd.makefs, x-systemd.automount);
хранится в mtab, ? не передаётся программе mount.тип и mount.2
Вместо блочного устройства можно указывать обычный файл c использованием опции "-o loop[=устройство-типа-петля]",
обычно /dev/loopНОМЕР (будет создано автоматически или взято первое свободное).
Утилита losetup позволяет работать с устройствами типа петля, ключи:
- [устройство] # вывести информацию об устройстве
- --list [--all] # вывести список устройств
- --associated имя-файла [-o смещение] # вывести информацию об устройствах
- [--offset смещение-в-файле] [--sizelimit размер] [--sector-size размер] [--partscan] [--read-only] [--show] {--find|имя-устройства} файл # создать устройство
- -c имя-устройства # привести устройство в соответсвие с размером файла
- [--detach-all | --detach устройство] # отсоединить устройство; начиная с ядра 3.7 ленивое (ставится флаг, отсоединение в фоновом режиме);
предварительно необходимо размонтировать файловую систему
Файл /etc/fstab содержит описания файловых систем, к которому команды mount и umount обращаются при отсутствии указания устройства или точки монтирования.
Описания расположены построчно в последовательном порядке. Комментарии начинаются с символа "#".
Поля в строке разделяются пробелами или табуляциями:
- источник (source): блочное устройство или удалённая файловая система или LABEL=метка-файловой-системы или UUID=уникальный-идентификатор-файловой-системы
или PARTLABEL=метка-раздела или PARTUUID=уникальный-идентификатор-раздела
- точка монтирования (target): каталог в существующей файловой системе или none (для swap)
- список типов и подтипов файловой системы или swap или none (для --bind или --move)
- список опций
- частота вызова dump
- очерёдность запуска fsck; 0 - не запускать fsck; 1 - для корневой файловой системы; 2 - для прочих
Файл /etc/mtab (блокировка /etc/mtab~, временный файл /etc/mtab.tmp) содержит список смонтированных файловых систем: устройство каталог тип ключи.
Корневая файловая система может быть недоступна на запись.
/etc/mtab не отражает пространства имён.
Файл /proc/mounts (файловая система типа proc смонтирована на каталог /proc) содержит список смонтированных файловых систем:
устройство каталог тип ключи.
Файл /proc/self/mounts содержит список точек монтирования в пространстве имён точек монтирования процесса:
устройство каталог тип ключи.
Файл /proc/self/mountinfo содержит список точек монтирования в пространстве имён точек монтирования процесса:
идентификатор точки монтирования (единая нумерация для всех пространств имён монтирования),
идентификатор родительской точки монтирования (при ипользовании chroot может быть вне поля видимости),
major:minor, имя корневого каталога, точка монтирования относительно корневого каталога,
универсальные опции монтирования, тип распространения информации о событиях монтирования
(shared - принадлежность группе, master - эта точка монтирования получает сообщения от группы, propagate_from (master недоступен из текущего корня), unbindable)
и номер группы (нумерация едина для всех пространств имён монтирования),
"-", тип файловой системы, блочное устройство, опции монтирования.
Файл /proc/self/mountstats содержит список точек монтирования в пространстве имён точек монтирования процесса:
"device блочное-устройство mounted on точка-монтирования with fstype тип-файловой-системы".
Для некоторых типов файловых систем (NFS) выдаётся подробная информация и статистика использования.
Переменные окружения:
- LIBMOUNT_FSTAB - имя файла /etc/fstab (игнорируется при использовании suid)
- LIBMOUNT_MTAB - имя файла /etc/mtab (игнорируется при использовании suid)
- LIBMOUNT_DEBUG=all
- LIBBLKID_DEBUG=all
- LOOPDEV_DEBUG=all
Размонтирование (отсоединение файловой системы из иерархии файловых систем, удаление точки монтирования) осуществляется командой umount.
В качестве параметров можно использовать как имя какталога, так и имя блочного устройства.
Нельзя размонтировать используемую файловую систему, например, сам umount может использовать libc, который открывает файл locale
на размонтируемой файловой системе.
Размонтирование леса точек монтирования - см. таблицу 5c в sharedsubtree.txt.
Ключи:
- --help
- --verbose
- --all # не размонтируются файловые системы типов proc, devfs, devpts, sysfs, rpc_pipefs, nfsd
- --all-targets # размонтироваь все точки монтирования в текущем пространстве имён точек монтирования для указанной файловой системы
- --detach-loop # после размонтирования удалить устройство типа петли
- --fake # сделать всё (очистка /etc/mtab), кроме реального размонтирования
- --force # в Linux действует только на NFS
- --internal-only # не вызывать /sbin/umount.тип {каталог|устройство} [-t тип.подтип]; в ассортименте umount.nfs[4]
- --lazy # реальное размонтирование произойдёт по завершению процесса, но больше никто файлы на размонтируемой файловой системе не откроет,
а файловую систему не смонтирует
- --no-mtab # не писать в /etc/mtab
- --recursive
- --read-only # если размонтирование не удалось, то перейти в режим только чтение
- --types [no]список-типов
Возможные препятствия к размонтированию (можно использовать ключ "-f" или "-l"):
- какой-то процесс держит файл открытым, надо найти (lsof, fuser) и убить процесс
- какой-то процесс сделал open(O_CREAT)+unlink+mmap+close, такой файл не виден по lsof; можно искать в /proc/*/smaps по слову deleted
- экспортируется в NFS (заблокировать экспорт и остановить NFS и rpcidmapd, umount /proc/fs/nfsd) или smbd
- GlusterFS
- ещё какой-то модуль ядра (iscsi: tgt или iec, exportfs, fscache, lockd?)
- проверить multipathd
- проверить smartd
- проверить loop-устройства ("losetup -a")
- проверить swap-файлы
- не было ли "mount --bind"?
- аппаратные проблемы с устройством, ядро не может сбросить "грязные" страницы
- просмотреть /proc/*/root (был использован chroot)
- просмотреть /proc/*/mounts (и mountstats и mountinfo)
- просмотреть /proc/*/cwd (текущий каталог внутри размонтируемой файловой системы)
- ? символьные линки снаружи внутрь (lsof +D имя-файла)
- encfs
- проблемы с FUSE
- проблема с пространством имён точек монтирования (lsns)
Утилита findmnt выводит дерево смонтированных файловых систем или ищет [несмонтированную] файловую систему.
Ключи:
- --help
- --all # не фильтровать вывод
- --ascii # рисовать дерево символами ASCII
- --bytes # выводить объём в байтах
- --df # эквивалент "-o SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%,TARGET"
- --direction {forward|backward} # ?
- --evaluate # преобразовать LABEL, UUID, PARTUUID или PARTLABEL в имя устройства
- --tab-file имя-файла # имя файла вместо /etc/fstab или /etc/mtab или /proc/self/mountinfo
- --first-only # вывести первую подходящую файловую систему
- --invert # отрицание критерия поиска
- --json
- --kernel # искать в /proc/self/mountinfo;
документация обещает, что здесь нет точек монтирования пространства пользователя - неправда
- --list # выводить списком
- --mtab # искать в /etc/mtab; список может включать точки монтирования пространства пользователя
- --task идентификатор-процесса # использовать пространство имён точек монтирования указанного процесса
- --noheadings
- --options список-опций # фильтр
- --output [+]список-колонок # --help выдаёт полный список колонок вывода
- --pairs # вывод в формате ключ="значение"
- --poll[={mount|umount|remount|move},...] # мониторинг изменений; можно использовать дополнительные колонки ACTION, OLD-TARGET, OLD-OPTIONS;
"findmnt --poll=remount -t extt -O ro"
- --timeout милисекунд # ограничить время мониторинга
- --submounts # рекурсивный вывод выбранной файловой системы
- --raw
- --source {устройство|maj:min|LABEL=метка|UUID=идентификатор|PARTLABEL=метка|PARTUUID=идентификатор} # задать источник явно
- --fstab # искать в /etc/fstab
- --mountpoint точка-монтирования
- --target точка-монтирования-или-файл-внутри
- --types [no]список-типов
- --tree # выводить деревом
- --uniq # пропускать монтирование над точкой монтирования
- --notruncate
- --nofsroot # не выводить каталог в колонке SOURCE для клонированных (bind) файловых систем
- --verify [--verbose]
- --vfs-all # выводить опции по умолчанию для VFS-OPTIONS
Утилита fusermount монтирует и размонтирует файловую систему FUSE (Filesystem in Userspace). Ключи:
- точка-монтирования
- -o опции-монтирования # см. mount.fuse.8
- -u # размонтирование
- -z # размонтировать когда-нибудь потом
Утилита guestmount позволяет смонтировать гостевую файловую систему (файловую систему виртуальной машины и почие образы) с помощью FUSE.
Права суперпользователя не требуются (д.б. владельцем точки монтирования). Смонтированная файловая система не видна другим пользователям по умолчанию.
Ключи (guestfish.1):
- --add {файл | URI} # что монтируем
- --domain домен-libvirt [--connect URI] # что монтируем
- {--inspector | --mount устройство-монтирования-с-точки-зрения-гостя[:точка-монтирования[:опции[:тип]]]} # -i - определить автоматически (virt-inspector.1)
- --format={raw|qcow2|...} # формат образа
- --no-fork
- --no-sync # не делать sync при размонтировании
- --ro
- --rw
- -o опции-FUSE # guestmount --fuse-help
- allow_other # смонтированная файловая система будет видна другим, и поменять в /etc/fuse.conf
- uid=идентификатор # отобразить все гостевые идентификаторы пользователей в указанный
- gid=идентификатор
- use_ino # использовать номера inode из гостевой системы
Утилита guestunmount размонтирует указанную гостевую файловую систему.
Изменение метки файловой системы: ext2/ext3/ext4 (до 16 символов) - "e2label устройство метка" или "tune2fs -L метка устройство".
Утилиты работы с разделами: blkid, lsblk, blockdev.
Псевдофайловая система overlay (OverlayFS)
overlay - псевдо файловая система над объединением каталогов - верхнего и нижних:
если имя существует в верхнем и нижнем каталогах и это файл, то виден файл из верхней, а если это подкаталог,
то верхний и нижние подкаталоги сливаются (приоритет у верхнего);
метаданные и расширенные атрибуты берутся от верхнего каталога.
Используется dentry в объединённой файловой системе (в ОП, отдельный кеш для каждого процесса),
так что внешние изменения в списке файлов не будут замечены процессом, пока он не обновит кеш.
При реализации используется механизм расширенных атрибутов файлов trusted.overlay.
Нижняя файловая система не обязана иметь права на запись (в неё ничего не пишется) и может быть также типа overlay
(используются расширенные атрибуты "trusted.overlay.overlay...");
верхняя файловая система должна иметь возможность создания расширенных атрибутов trusted.*, NFS не подходит, если нужна запись (?).
Нижние каталоги могут быть использованы в нескольких объединённых файловых системах.
Верхний и рабочий каталог не могут быть использованы несколькими объединёнными файловыми системами (не всегда проверяется системой).
Нижние каталоги могут быть в режиме "только данные": метаданные и st_ino/st_dev не видны в объединённой файловой системе (datadir).
Имеется поддержка fs-verity.
Нельзя изменять верхний и нижние каталоги объединённой файловой системы напрямую во время работы (не проверяется!).
Нельзя изменять нижние каталоги вообще! если используются опции metacopy, index, xino, redirect_dir.
st_atime не обновляется, если файл читается из нижнего каталога.
Проблемы с mmap в режиме MAP_SHARED для файлов из нижнего каталога.
Не запрещается (ETXTBSY) писать в выполняемый файл для файлов из нижнего каталога.
Удаление подкаталога (whiteout) реализуется как символьное устройство 0:0 в верхнем каталоге - он не показывается и не даёт доступа к подкаталогу нижнего.
Удаление подкаталога (opaque) реализуется установкой расширенного атрибута trusted.overlay.opaque равным "y" - он показывается, но не даёт доступа к подкаталогу нижнего.
При записи в файл нижнего каталога или изменения метаданных (например, создание жёсткой копии!) он копируется в верхний каталог (называется copy_up),
что предварительно может потребовать создания подкаталогов для него.
Представление о файлах из разных частей может быть неоднородно, например stat.2 возвращает реальное значение поля st_dev и оно различно,
если верхние и нижние каталоги относятся к различным файловым системам,
то каталоги будут возвращать информацию об объединённой файловой системе, файлы - о различных составных частях.
st_ino уникальны только совместно с st_dev (см. xino) и могут неожиданно изменяться.
Опции монтирования (без upperdir и workdir будет возможно только чтение):
- lowerdir=список-каталогов-через-двоеточие # приоритет слева направо, слои "только данные" отделяются "::"
- upperdir=верхний-каталог
- workdir=пустой-каталог # должен быть в той же файловой системе, что и верхний каталог;
используется для временного хранения файлов при переключении между уровнями
- xino={on|auto} # on - формировать идентификатор объекта из st_ino и fsid, что обеспечивает его уникальность;
не всегда работает для файловых систем с 64-битными inode;
auto - с использованием указателей файлов NFS (file handles) можно обеспечить неизменяемость идентификаторов объектов
- redirect_dir={on|follow|off|nofollow} # переименование подкаталога в нижней системе или объединённого без этой опции приводит к EXDEV;
при включённом redirect_dir для ссылки на переименованный каталог используется расширенный атрибут trusted.overlay.redirect;
on - создавать и читать; follow - не создавать, но читать; off - не создавать, читать только при redirect_always_follow; nofollow - никогда не читать
- index=on # при первом монтировании формируется расширенный атрибут trusted.overlay.origin для корня верхнего каталога (UUID и указатели файлов нижнего),
который позволяет проверить правильность монтирования в следующий раз;
без index файл с несколькими жёсткими ссылками ломает их во время copy_up
- metacopy={on|off} # при операциях над метаданными (chown и т.п.), вызывающих copy_up, копировать только метаданные
и помечать расширенным атрибутом trusted.overlayfs.metacopy; несовместимо с redirect_dir и nfs_export
- nfs_export # каждый копируемый подкаталог индексируется указателями файлов от inode из нижнего каталога и подкаталога верхнего каталога
(для каждого copy_up обычного файла в индексном каталоге создаётся файл с именем в виде преобразованного указателя файлов как жёсткая ссылка на верхний inode);
для подкаталога в индексе используется расширенный атрибут trusted.overlay.upper, содержащий указатели файлов от верхнего подкаталога;
при отсутствии верхнего каталога требуется redirect_dir=nofollow;
объединённую файловую систему можно экспортировать по NFS (нельзя использовать subtree_check при экспорте);
во время монтирования проверяются все индексы, что может занять значительное время;
требуется index=on для монтирования с возможностью записи
- uuid={auto|null|off|on} # null и off - использовать в индексах 0 вместо UUID подлежащей файловой системы, что отключает проверку монтирования,
UUID объединённой файловой системы равен 0, fsid берётся от верхнего каталога;
on - генерируется UUID объединённой файловой системы и используется как fsid, хранится в расширенном атрибуте trusted.overlay.uuid
- verity={off|onn|require} # использование верификации fs-verity
- volatile # не гарантируется сохранность данных при при авариях; создаётся $workdir/work/incompat/volatile/
- userxattr # использовать user.overlay. вместо trusted.overlay.; требуется для монтирования непривилегированным пользователем
Параметры модуля ядра overlay:
- check_copy_up # удалён
- index # умолчание для опции index
- metacopy # умолчание для опции metadata only copy
- nfs_export # умолчание для опции nfs_export
- redirect_always_follow # следовать по trusted.overlay.redirect даже при выключенном redirect_dir
- redirect_dir # умолчание для опции redirect_dir
- redirect_max # 256; максимальная длина trusted.overlay.redirect
- xino_auto # включать xino автоматически
Использование overlay полно сюрпризов, особенно с NFS и XFS (64bit).
VFS: атрибуты и расширенные атрибуты файлов, права доступа ACL
Различные файловые системы в Linux как локальные ext2/ext3/ext4,
xfs, btrfs,
ZFS, так и сетевые NFS и GlusterFS
ведут себя схожим образом благодаря поддержке стандартов системного API POSIX.1-2017 (ISO/IEC/IEEE 9945:2009/Cor 2:2017),
описывающих интерфейсы между ОС и прикладной программой, а также основанных на них библиотечные функции.
В частности, были стандартизованы операции над файлами (каталогами).
Второй составляющей унификации ядра Linux является VFS (virtual file system, виртуальная файловая система, Documentation/filesystems/vfs.txt) - подсистема
ядра Linux, обеспечивающая единообразный доступ прикладных программ к различным типам файловых систем,
общий кеш, система блокировок, регистрация, монтирование, квотирование, синхронизация, замораживание.
Существенными объектами VFS являются:
- file_system_type - зарегистрированный тип файловой системы
- super_operations (Superblock Object) - смонтированная файловая система
- dcache (Directory Entry (dentry) Cache) - совокупность унифицированных описаний каталога (dentry) в ОП,
создаются при необходимости из описания каталога файловой системы, удаляются при недостатке места;
содержит список имён файлов и ссылки на их inode
- inode - унифицированное описание файла в ОП, создаётся по необходимости из описания файла файловой системы, удаляются при недостатке места
- структура описания файла (ссылка в таблице fd, filedescriptor)
- кеш страниц (Address Space Object) - управление страницами и отображениеями в адресное пространства процессов
Файловая система POSIX представляет собой единую иерархию файлов и содержащих файлы каталогов от корня ("/").
Иерархия может изменяться с помощью монтирования дополнительных поддеревьев в точку монтирования и демонтирования.
Каждый файл и каталог имеют непустое имя (имеется ограничение по длине) внутри содержащего его каталога и абсолютное (полное) имя - путь от корня.
- Абсолютный путь представляет собой строку, начинающуюся с '/', в этом случае прохождение пути начинается с корневого каталога процесса.
Корневой каталог процесса наследуется от родительского процесса, перемещается внутрь дерева с помощью chroot.2 или устанавливается
при создании пространства имён монтирования при клонировании (clone.2) процесса.
- Относительный путь не имеет символа '/' в начале, в этом случае проходление пути начинается с текущего каталога процесса.
Текущий каталог процесса наследуется от родительского процесса, меняется с помощью chdir.2 (cd.1).
Абсолютный путь получается конкатенацией текущего каталога, '/' и относительного пути, таким образом мы свели к предыдущему случаю.
- Прохождение абсолютного пути производится последовательным прохождением вдоль каталогов пути, разделённых символом '/', вплоть до последней подстроки.
- Текущий каталог должен существовать на каждом отрезке.
- Прохождение каждого отрезка требует от процесса наличия прав поиска в текущем каталоге ('x').
- Промежуточный отрезок должен быть каталогом (становится новым текущим каталогом прохождения) или символьной ссылкой
- вычисляется рекурсивно (может содержать абсолютный или относительный путь, содержащий символьные ссылки;
имеется ограничение глубины - было 8, теперь 40 (Linux 4.2))
до изменения текущего каталога прохождения
- если результат является каталогом, то он становится новым текущим каталогом прохождения)
-
- Последний отрезок может быть символьной ссылкой, вычисляется аналогично предыдущему случаю,
если системный вызов не работает неосредственно с символьной ссылкой.
- В зависмости от запроса проверяется допустимый тип файла: каталог или не каталог.
- Последний отрезок не всегда должен существовать, например, при создании.
Каждый каталог имеет виртуальные файлы "." (текущий каталог) и ".." (родительский каталог). "/.." - это тоже самое, что "/." и "/".
Если путь завершается '/', то к нему молчаливо добавляется ".".
inode в ОП содержит информацию (не содержит имя файла):
- логический номер устройства, содержащего файловую систему (st_dev - major:minor)
- уникальный в пределах файловой системы номер inode (st_ino)
- тип файла и права доступа (st_mode)
- uid владельца файла (st_uid)
- gid группы владельца файла (st_gid)
- для файла типа устройство тип устройства и экземпляр (st_rdev)
- размер (st_size)
- время создания (stx_btime, поддерживается?)
- время изменения содержимого файла (st_mtime)
- время изменения inode (st_ctime)
- время доступа (st_atime)
- число жёстких ссылок на файл (st_nlink)
- описание размещения
- состояние блокировки
- указатели в списках хеш, dentry, буфера
- данные о пространстве, mmap и т.п.
- данные квотирования
- данные о блокировках
- ссылки на суперблок, таблицы функций работы с файлами, inode и пр.
- данные, характерные для файловой системы определённого типа
Типы файлов:
- "обычный" файл (f)
- каталог (d)
- символьная ссылка (l)
- символьное (c) и блочное (b) устройство (создание - mknod, тип устройства (Major, число 8 бит) и экземпляр (Minor, 8число 8 бит)
- именованый канал FIFO (p)
- сокет (s)
Права (простые, обычные) доступа к файлу в основе состоят из 3 групп (euid (u: в теории fsuid) совпадает с владельцем файла;
g: egid (в теории fsgid) или одна из дополнительных групп совпадает с группой файла, но не владелец; a: не владелец и не из группы)
по 3 бита в каждой: чтение (r), запись (w), прохождение (x, для каталогов) и выполнение (x, для остальных).
При работе суперпользователя (uid 0) права доступа не проверяются.
При наличии возможности CAP_DAC_OVERRIDE права доступа не проверяются,
но для выполнения требуется наличие хоть 1 из битов выполнения.
При наличии возможности CAP_DAC_READ_SEARCH выдаётся право на чтение файлов и прохождение каталогов.
Бит set-user-ID (u+s) устанавливает euid равным владельцу файла при выполнении execve.2.
Бит set-group-ID (g+S) для каталога приказывает при создании файла наследовать gid от каталога, а не от egid.
Подобное поведение может также регулироваться (ext4 и XFS) ключами монтирования grpid/bsdgroups (nogrpid/sysvgroups).
Для файла - отменяет обязательную блокировку файла (записи), устанавливает egid равным группе владельца файла при execve.2.
Бит sticky (+t) для каталога запрещает удалять или переименовывать файл (каталог) невладельцам.
Для файла - когда-то блокировал файл в swap.
Бит (+X) прохождение или выполнение разрешается только, если файл имеет разрешение на прохождение/выполнение для кого-нибудь (?).
Жёсткая ссылка (hard link): возможность иметь ссылки на один и тот же inode из нескольких dentry образует
виртуальный (дополнительная информация не хранится) механизм жёстких ссылок.
Утилита ln.1 позволяет создавать дополнительные жёсткие ссылки на файл, но не на каталог и в пределах файловой системы.
Символьная ссылка содержит текстовую строку - путь к файлу. Права доступа всегда 0777 (однако, см. /proc/идентификатор/fd/*).
Некоторые утилиты (функции) работают с самой символьной ссылкой, а некоторые с файлом, на который она указывает.
К тому же поведение менялось со временем, читайте документацию (symlink.7)!
Основные утилиты работы с файлами:
- stat: вывести статус файла (поля inode), права доступа к самому файлу не требуются
- ls: вывести список файлов
- mkdir: создать каталог; ключи: --mode=права-доступа, --parents
- mknod имя-файла {c|b} major minor: создать специальный файл (устройство)
- mkfifo: создать именованный pipe
- ln целевой-файл имя-ссылки: создать ссылку; ключи: -s (символьная ссылка)
- rm: удалить файл, ключи: -i (запросить подтвержение), -I (запросить подтверждение 1 раз), -r (рекурсивно)
- rmdir: удалить пустой каталог, ключи: --parents
- mv старое-имя новое-имя: переименование файла; если новое-имя - это каталог, то указанные прежде файлы перемещаются в каталог;
ключи: -i (запросить подтвержение)
- namei: трассировка символьных ссылок
- find: поиск файла по различным критериям
- chown владелец[:группа] имя-файла: поменять владельца файла;
только суперпользователь (CAP_CHOWN) может поменять владельца;
только владелец файла может изменить группу файла на группу, в которую он входит;
если владелец исполняемого файла изменяется не суперпользователем (?), то set-user-ID сбрасывается;
при изменении владельца или группы исполняемого файла сбрасываются все возможности;
ключи: --changes (вывести изменения), --no-dereference -P (поменять владельца ссылок),
--from=текущий-владелец[:текущая-группа], -R (рекурсивно)
- chgrp группа имя-файла: поменять группу файла;
только владелец файла может изменить группу файла на группу, в которую он входит (CAP_CHOWN?);
при изменении владельца или группы исполняемого файла сбрасываются все возможности;
если группа исполняемого файла изменяется не суперпользователем (?), то set-group-ID сбрасывается;
ключи: --changes (вывести изменения), --no-dereference -P (поменять группу ссылок), -R (рекурсивно)
- chmod права-доступа имя-файла: изменить права доступа к файлу; права доступа к символьным ссылкам не изменяются (изменяются права к целевым файлам);
для обычных файлов сбрасывается бит set-group-ID, если egid
или одна из дополнительных групп не соответствует группе владельца файла (CAP_FSETID);
аналогично игнорируются биты set-user-ID и set-group-ID, если их попытаться установить;
права доступа: euid процесса должен равняться владельцу файла или процесс должен иметь CAP_FOWNER;
ключи: --changes (вывести изменения), -R (рекурсивно)
- umask [маска] (встроен в bash): чтение или запись маски прав доступа при создании файла;
маска определяет права, которые будут не даны
В файловой системе ext4 (XFS, btrfs, частично zfs) обычные файлы и каталоги (inode) имеют следующие атрибуты (флаги) файлов
(изменить - chattr [-R] [-v версия] [-V] режим имя-файла;
посмотреть - lsattr, ключи: -R - обойти рекурсивно, -a - выводить файлы, имя которых начинается на '.',
-d - выводить атрибуты каталога, а не его содержимого, -l - выводить длинные имена атрибутов, -v - номер версии файла (что это)):
- a - можно только добавлять; требуется CAP_LINUX_IMMUTABLE; не надо рассматривать это всерьёз
- A - не обновлять atime при доступе
- c - прозрачное сжатие данных; не реализовано в ext4
- C - не использовать изменения в стиле copy-on-write
- d - не резервировать с помощью dump.8
- D - синхронная запись в каталог (аналог опции монтирования dirsync)
- e - при хранении файла используются экстенты; атрибут нельзя изменить
- E - зашифрованный файл; атрибут нельзя изменить
- F - имена файлов в каталоге нечувствительны к регистру букв
- i - файл нельзя удалить, переименовать, открыть на запись, изменить метаданные; требуется CAP_LINUX_IMMUTABLE;
не надо рассматривать это всерьёз
- I - каталог индексирован хешем; атрибут нельзя изменить
- j - журналировать данные при монтировании с опцией data={ordered|writeback}; требуется CAP_SYS_RESOURCE
- N - данные встроены (inline) в inode; атрибут нельзя изменить
- P - уважение к идентификаторам проектов
- s - зачищать нулями при удалении файла; не реализовано в ext4
- S - синхронная запись изменений (аналог опции монтирования sync)
- t - не использовать tail-merging (в ext4 его и так нет)
- T - не стараться группировать подкаталоги в группу блоков
- u - обеспечить возможность восстановления после удаления; не реализовано в ext4
- V - fs-verity; атрибут нельзя изменить
Кроме обычных атрибутов и флагов некоторые типы файловых систем
(ext4, btrfs, xfs, zfs)
поддерживают расширенные атрибуты (xattr),
представляющие собой набор пар имя:значение, привязанных к файлу (inode). Значение может быть пустым.
Используются для реализации SELinux, возможностей,
OverlayFS, ACL и прочего в будущем.
Имя атрибута (ASCII? до 255 байт) - это строка, которая состоит из имени пространства, точки и имени атрибута (может содержать '.'),
завершается '\0' ("security.selinux\0"). Значение - произвольный набор байт (?), не более 64 КиБ.
Файловые системы могут накладывать свои ограничения, например, в ext4 все расширенные атрибуты должны поместиться в блок (4096 байт),
в btrfs - в nodesize (по умолчанию - 16 КиБ).
Используются следующие пространства:
- security (security.selinux, security.capability); используются модулями безопасности ядра;
права доступа определяются политиками модулей для своего атрибута;
если модуль не загружен, то читать могут все, а писать может поток с правами CAP_SYS_ADMIN
- system (system.posix_acl_access); используется ядром для работы ACL; права доступа определяются политикой файловой системы
- trusted (trusted.overlay); доступны только потокам с правами CAP_SYS_ADMIN
- user; права доступа к обычным файлам и каталогам определяются правами доступа владельца к файлу или для каталогов со sticky-битом (?)
Утилиты для работы с расширенными атрибутами
- getfattr выводит расширенные атрибуты указанного файла, ключи:
- --name=имя # выводится значение указанного атрибута
- --dump [--only-values] # выводятся имена и значения всех расширенных атрибутов
- --encoding={base64|text|hex} # формат вывода значений
- --no-dereference, -L, -P # управление обработкой символьных ссылок (не проходить, проходить, пропускать)
- --match=регулярное-выражение # фильтр на имена расширенных атрибутов; по умолчанию, "^user\\."; "-" - отключить фильтр
- --absolute-names # не удалять головной '/' из имени файла
- -R # рекурсивно
- setfattr позволяет установить значение расширенного атрибута, ключи:
- --name=имя
- --value=значение [--raw] # текст в двойных кавычках или 0x, за которым идёт шестнадцатеричное число, или 0s, за которым идёт строка base64
- --remove=имя # удаление расширенного атрибута
- --no-dereference # не проходить символьную ссылку
- --restore=имя-файла # в файл предварительно д.б. сохранён вывод getfattr --dump
- attr работает с расширенными атрибутами XFS (имя слева расширяется строкой "user.";
ключ -R позволяет работать с именами из пространства "root."; ключ -S - из пространства security;
ключ -L делает проход по символьной ссылке), ключи:
- -l [-q] # вывести список расширенных атрибутов в "user.*"
- -s имя [-V значение] [-q] # установить значение расширенного атрибута
- -g имя [-q] # вывести значение
- -r имя # удалить атрибут
Простые права доступа к файлам могут быть дополнены обработкой ACL (Access Control Lists) исходя из POSIX 1003.1e.
При всех изменениях простых прав и ACL система поддерживает соответствие между ними.
ACL делятся на ACL доступа (access) для любых файлов и ACL умолчаний (default) для каталогов
(определяют права доступа к файлам внутри каталога, если права не назначены явно с помощью ACL, и используются при создании файла).
Каждый ACL состоит из набора элементов, которые определяют права пользователей и групп пользователей на чтение, запись и выполнение (проход для каталогов).
Элемент состоит из типа (user, group, other, mask), квалификатора (имя пользователя, uid или имя группы, gid)
и списка разрешений ('rwx', отсутствующие права заменяются символом '-'), разделённых ':'.
Типы:
- ACL_USER_OBJ - права доступа для владельца (user::...); должен быть ровно один элемент такого типа;
ACL_MASK не применяется;
если euid процесса соответствует владельцу файла, то результат проверки окончателен
- ACL_USER - права доступа для пользователя, задаваемого квалификатором (user:имя-пользователя:...); квалификаторы д.б. уникальны;
если euid процесса соответствует одному из квалификаторов, то результат проверки окончателен с учётом ACL_MASK
- ACL_GROUP_OBJ - права доступа для группы владельца файла (group::...); должен быть ровно один элемент такого типа;
если egid или дополнительная группа процесса соответствует группе владельца файла, то результат проверки окончателен с учётом ACL_MASK
- ACL_GROUP - права доступа для группы, задаваемой квалификатором (group:имя-группы:...); квалификаторы д.б. уникальны;
если egid или дополнительная группа процесса соответствует одному из квалификаторов, то результат проверки окончателен с учётом ACL_MASK
- ACL_OTHER - права доступа для пользователя, не подпавшего ни под один другой элемент; может быть ровно один элемент такого типа;
ACL_MASK не применяется
- ACL_MASK - максимальные права, которые можно задать с помощью ACL_USER, ACL_GROUP_OBJ и ACL_GROUP;
если имеются элементы типов ACL_USER или ACL_GROUP, то должен быть ровно один элемент этого типа
Утилиты для работы с ACL:
- "ls -l" выводит '+' в конце списка прав доступа
- getfacl выводит обычные права достпа, биты доступа и ACL, ключи:
- --skip-base # пропускать файлы, которые имеют только простые права доступа
- -R рекурсивно
- -L, -P # управление обработкой символьных ссылок (проходить, пропускать)
- --absolute-names # не удалять головной '/' из имени файла
- --numeric # выводить uid и gid вместо имён
- setfacl позволяет установить или изменить ACL указанных файлов;
права имеет владелец файла или поток с CAP_FOWNER; ключи:
- -m список-элементов-ACL # изменение ACL ([default:]элемент-ACL)
- -x список-элементов-ACL # удалить элементы из ACL, биты разрешений надо опустить, простые права удалить нельза
- -M имя-файла # изменение ACL ([default:]элемент-ACL), файл может быть получен с помощью getfacl
- -X имя-файла # удалить элементы из ACL, файл может быть получен с помощью getfacl, но биты разрешений надо удалить
- --set список-элементов-ACL # установить ACL ([default:]элемент-ACL)
- --set-file имя-файла #установить ACL ([default:]элемент-ACL)
- --remove-all
- --remove-default
- --no-mask # по умолчанию, отсутствующий ACL_MASK вычисляется как объединение прав ACL_GROUP_OBJ, ACL_GROUP и ACL_USER
- --mask # даже при наличии ACL_MASK вычисляется как объединение прав ACL_GROUP_OBJ, ACL_GROUP и ACL_USER
- --default # default ACL удаляются из ввода, обычные ACL трактуются как default
- -R рекурсивно
- -L, -P # управление обработкой символьных ссылок (проходить, пропускать)
- --restore=имя-файла [--test] # восстановить из резервной копии ('getfacl -R')
cgroups v1
cgroups (Control Groups) -
механизм для объединения задач (потоков) и их потомков в иерархию (дерево) групп.
Отдельная иерархия cgroups создаётся для каждого контроллера ресурсов (resource controller, subsystem), список контроллеров - /proc/cgroups
(имя, номер иерархии, количество групп, активирован).
Контроллер можно отключить с помощью ключа загрузки cgroup_disable=список.
Каждая задача (поток) находится в одном из cgroups иерархии контроллера и только в одном
(/proc/идентификатор-задачи/cgroup содержит список идентификатор_иерархии:список-контроллеров:иерархическое_имя_узла_иерархии).
Контроллер учитывает, планирует использование определённого ресурса или обеспечивает соблюдение лимитов использования ресурсов.
Используется, например, в cpusets, systemd,
docker и прочих системах контейнеризации и виртуализации.
Использовать "вручную" тяжело.
Иерархия имеет тип контроллера и может иметь имя.
Работа с иерархиями напрямую доступна через /sys/fs/cgroup (был в /cgroup), каталоги верхнего уровня соответствуют контроллерам,
при монтировании указывается: "-t cgroup [-o список-контроллеров-или-all,name=systemd,release_agent=/usr/lib/systemd/systemd-cgroups-agent] имя /sys/fs/cgroup/путь".
Контроллер активируется при монтировании и остаётся активированным при размонтировании, если остались cgroup в иерархии.
Создание подкаталога создаёт группу, удаление - удаляет (не должно быть подгрупп и незомбированных процессов).
Каталоги содержат общие следующие файлы:
- tasks - идентификаторы потоков (TGID, можно добавлять, удаляется из старой cgroup)
- cgroup.procs - идентификаторы процессов (PID) неотсортированные и неуникальные;
можно добавлять (0 - это мы), добавляются все потоки процесса, при этом удаляется из старой cgroup)
- notify_on_release - извещать при удалении из cgroup последней задачи и отсутствии подлежащих cgroup
- release_agent - путь к программе для извещения (только в корне иерархии); имя группы передаётся как параметр
- cgroup.clone_children - подлежащая cgroup копирует настройки из родительской
- cgroup.event_control - позволяет получать извещения в случае событий
Утилиты (пакет libcgroup-tools):
- lssubsys (вывести список контроллеров, -m - точки монтирования)
- lscgroup [-g контроллер:/[группа]] (вывести список групп)
- cgcreate [-g список-контроллеров:относительный-путь] (создание группы, ключи задания прав доступа)
- cgconfigparser (разбор файла в формате /etc/cgconfig.conf, монтирование и создание групп; -l имя-файла, -L имя-каталога)
- cgexec [-g контроллер:путь] [--sticky] команда ... (выполнение команды в рамках указанной группы;
по умолчанию группа выбирается в соответствии /etc/cgrules.conf и /etc/cgconfig.conf;
--sticky - дочерние процессы в той же группе независимо от настроек cgred)
- cgclassify [-g контроллер:путь] список-pid (перенести процессы в указанную группу;
по умолчанию группа выбирается в соответствии /etc/cgrules.conf и /etc/cgconfig.conf)
- cgdelete [-g контроллер:путь] --recursive (удалить указанную группу)
- cgclear (переносит процессы из указанной группы в корень контроллера и удаляет группу)
- cgget {-g контроллер:путь | -g контроллер [-a] путь ...} [-r имя-параметра] (вывести значение параметров указанной группы)
- cgset -r имя=значение путь ... (установить значение параметра)
- cgsnapshot [контроллер] (создать файл конфигурации)
- cgrulesengd (демон механизма правил, распихивает порождаемые процессы по группам в соответствии с правилами)
Сервисы systemd: cgconfig.service (в самом начале загрузки запускат "cgconfigparser -l /etc/cgconfig.conf"), cgred.service (запускает cgrulesengd).
Настройки libcgroup:
- /etc/cgrules.conf (определяет контрольные группы процесса по имени пользователя или группы или исполняемого файла)
- /etc/cgconfig.conf (/etc/cgconfig.d/, определяет группы, их параметры и точки монтирования)
- /etc/cgred.conf (настройки cgred?; CONFIG_FILE, LOG_FILE, NODAEMON, LOG)
- /etc/cgsnapshot_blacklist.conf - ?
- /etc/sysconfig/cgred (настройки cgrulesengd)
Контроллеры (см. /proc/cgroups; можно группировать контроллеры, например, "cpu,cpuacct"):
- blkio - распределение блочного ввода-вывода , файлы:
- sane_behavior - группы образуют иерархию (без флага внутренние группы не включены)
- blkio.throttle.read_bps_device и blkio.throttle.write_bps_device (записывать: "major:minor байт-секунду")
- blkio.weight (общая доля данной группы, от 10 до 1000)(только для планировщика ввода-вывода cfq)
- blkio.weight_device (доля на устройстве, записывать: "major:minor вес")(только для планировщика ввода-вывода cfq)
- blkio.leaf_weight и blkio.leaf_weight_device (см. cfq-iosched.txt)(только для планировщика ввода-вывода cfq)
- blkio.time (записывать: "major:minor миллисекунд")
- blkio.sectors (записывать: "major:minor секторов")
- blkio.io_service_bytes (записывать: "major:minor {read|write|sync|async} байт")
- blkio.io_serviced (записывать: "major:minor {read|write|sync|async} операций")
- blkio.io_service_time (записывать: "major:minor {read|write|sync|async} наносекунд", не для устройств с очередями)
- blkio.io_wait_time (записывать: "major:minor {read|write|sync|async} наносекунд", не для устройств с очередями)
- blkio.io_merged (записывать: "major:minor {read|write|sync|async} число-слияний-запросов")
- blkio.io_queued (записывать: "{read|write|sync|async} постановок-в-очередь")
- множество отладочных переменных (а CONFIG_DEBUG_BLK_CGROUP при сборке включён?):
blkio.bfq.avg_queue_size, blkio.bfq.dequeue, blkio.bfq.empty_time, blkio.bfq.group_wait_time,
blkio.bfq.idle_time, blkio.bfq.io_merged, blkio.bfq.io_merged_recursive, blkio.bfq.io_queued, blkio.bfq.io_queued_recursive,
blkio.bfq.io_service_bytes, blkio.bfq.io_service_bytes_recursive, blkio.bfq.io_serviced, blkio.bfq.io_serviced_recursive,
blkio.bfq.io_service_time, blkio.bfq.io_service_time_recursive, blkio.bfq.io_wait_time, blkio.bfq.io_wait_time_recursive,
blkio.bfq.sectors, blkio.bfq.sectors_recursive, blkio.bfq.time, blkio.bfq.time_recursive, blkio.reset_stats)
- blkio.throttle.{read|writes_{bps|iops}_device[_recursive] (записывать: "major:minor лимит")
- blkio.throttle.io_service_bytes[_recursive] и blkio.throttle.io_serviced[_recursive],
при чтении выдаёт статистику по устройствам: Read, Write, Sync, Async, Discard, Total
- cpuacct - статистика; файлы:
- cpuacct.stat (статистика использования ЦП в наносекундах на пользователей и систему в USER_HZ)
- cpuacct.usage (статистика использования ЦП в наносекундах)
- cpuacct.usage_{all|sys|user} (статистика использования ЦП в наносекундах по ядрам, на задачи пользователей, на систему)
- cpuacct.usage_percpu[_{sys|user}]
- cpu - учёт и лимиты ЦП, файлы:
- cpu.stat - статистика
- cpu.cfs_period_us - период учёта для планировщика cfs
- cpu.cfs_quota_us - квота за период учёта для планировщика cfs
- cpu.rt_period_us - период учёта для планировщика RT
- cpu.rt_runtime_us - ?
- cpu.shares - доля в абстрактных единицах
- cpuset - привязать группы задач к ядрам и узлам памяти (описание первоначального механизма cpusets);
запросы sched_setaffinity и mbind (set_mempolicy) фильтруются в соответствии с настройками cpuset;
/proc/идентификатор-поцесса/status содержит список разрешённых ядер и узлов памяти;
файлы управления:
- cpuset.cpus - список номеров ЦП и интервалов (ограничен по иерархии групп)
- cpuset.mems - список узлов памяти и интервалов (ограничен по иерархии групп)
- cpuset.cpu_exclusive - список ЦП является исключительным (нельзя использовать в группе другого поддерева)
- cpuset.mem_exclusive - список узлов памяти является исключительным (нельзя использовать в группе другого поддерева)
- cpuset.memory_migrate - перемещать страницы памяти в разрешённые узлы
при изменении настроек и перемещении процессов
- cpuset.memory_pressure - статистика, уровень обмена страниц внутри группы (paging pressure rate),
может учитываться пакетным планировщиком, выражается в запросах в секунду за последние 10 секунд на 1000
- cpuset.memory_pressure_enabled - включает вычисление memory_pressure, представлен только для корневой группы
- cpuset.memory_spread_slab - разрешить размещать буфера slab (каталоги и inode)
для процессов группы по всем допустимым узлам вместо узла, на котором процесс выполняется
- cpuset.memory_spread_page - разрешить размещать буфера файловой системы (page cache)
для процессов группы по всем допустимым узлам вместо узла, на котором процесс выполняется
- cpuset.mem_hardwall - ядро не будет размещать здесь общие данные
- cpuset.sched_load_balance - планировщик будет использовать алгоритм балансировки нагрузки;
включён по умолчанию, все ЦП должны быть в едином домене балансировки у планировщика заданий
- cpuset.effective_cpus - ?
- cpuset.effective_mems - ?
- cpuset.sched_relax_domain_level - интервал поиска при миграции задач
(-1 - нет запроса (ключ загрузки relax_domain_level=), 0 - не искать, 1 - HT, 2 - в пакете, 3 - в узле, 4 - в наборе узлов, 5 - во всей системе)
- devices - ограничения на mknod и open), мутное описание прав доступа (права наследуются? нужен CAP_SYS_ADMIN для помещения задачи в группу?),
файлы
- devices.list (текущий список разрешений: "тип шаблон права",
где тип: a (all), b (block) или c (char), шаблон: major:minor (можно использовать '*'), права: r, w или m (mknod)
- devices.allow (сюда можно добавлять разрешения)
- devices.deny (сюда можно добавлять запреты)
- freezer - используется для остановки и запуска группы задач, файлы:
- freezer.state - можно писать и читать, комбинированное состояние группы и её родителя, состояние: FREEZING, FROZEN, THAWED
- freezer.self_freezing - состояние
- freezer.parent_freezing - состояние
- hugetlb - лимитирование работы с большими страницами, файлы:
- hugetlb.{2MB,1GB}.limit_in_bytes (лимит выделения)
- hugetlb.{2MB,1GB}.max_usage_in_bytes и hugetlb.{2MB,1GB}.usage_in_bytes (статистика)
- hugetlb.{2MB,1GB}.failcnt (статистика отказов выделения памяти)
- memory - учёт и ограничение использования оперативной памяти, разделяемые страницы относятся на счёт первого обратившегося,
параметры загрузки ядра: cgroup.memory=nokmem (не учитывать память ядра); файлы:
- net_cls - установка меток на исходящие пакеты, метки могут быть использованы в tc и iptables ("-m cgroup --cgroup 0x100001"), файлы:
- net_cls.classid - устанавливаемая на исходящие пакеты метка; 32 бита; изначально 0 (отсутствие метки);
вводится в шестнадцатеричном формате (0xAAAABBBB); выводится в десятичном формате
- net_prio - управление приоритетом исходящего трафика, файлы:
- net_prio.prioidx - уникальный индекс таблицы приоритетов; только чтение
- net_prio.ifpriomap - таблица интерфейсов с указанием приоритета; 0 - отсутствие
- perf_event - ? документация пропала
- pids - ограничение количества процессов, файлы
- pids.max - максимальное количество процессов (недопустимо в корне; max - без ограничений); действует только на fork и clone
- pids.current - текущее количество процессов в иерархии
- pids.events - таблица количества событий: "имя число"
- pids.peak - ?
- rdma - ограничение использования ресурсов RDMA, файлы
cgroup v2
cgroup v2 (не cgroups!) -
переработанный механизм cgroups v1 (механизм для объединения задач и их потомков в иерархию (дерево) групп).
Отличается общей иерархией для всех контроллеров (взамен были добавлены сложности с доменным и потоковым режимами, а также исключения для корневой группы),
список контроллеров - /proc/cgroups (имя, номер иерархии, количество групп, активирован).
Контроллер можно отключить с помощью ключа загрузки cgroup_disable=список.
Введён в ядре 4.5. Сосуществует с cgroups v1, если не указан ключ ядра "cgroup_no_v1=список|all".
Контроллер учитывает, планирует использование определённого ресурса или обеспечивает соблюдение лимитов использования ресурсов.
Контроллер может быть задействован либо в cgroups v1, либо в cgroup v2.
Создание подкаталога создаёт группу, удаление - удаляет (не должно быть подгрупп и незомбированных процессов).
Каждый процесс (и все его потоки для контроллера типа domain) находится в одном из узлов иерархии и только в одном.
/proc/идентификатор-задачи/cgroup содержит строку вида "0::иерархическое-имя-группы [(deleted)]".
Работа с иерархией напрямую доступна через /sys/fs/cgroup (был в /cgroup2?),
монтируется с использованием "-t cgroup2 [-o nsdelegate] none точка-монтирования" (cgrp, 0x63677270).
Делегирование распределения ресурсов осуществляется либо с помощью прав доступа к файлам (пользователю запрещается писать в файлы cgroup.procs и т.п.,
либо с помощью механизма пространства имён cgroup (nsdelegate, запрещает писать в корень пространства и выше,
/sys/kernel/cgroup/delegate определяет имена атрибутов, которые можно делегировать:
cgroup.procs, cgroup.threads, cgroup.subtree_control, memory.oom.group?, memory.reclaim?).
/sys/kernel/cgroup/features показывает реализованные возможности: nsdelegate.
В отличие от cgroups v1 предполагается, что только листьевые узлы (а ещё подгруппы с пустым cgroup.subtree_control и группы типа threaded) могут содержать процессы
и только 1 процесс может писать в группу (а кто контролирует?).
Каталоги групп содержат каталоги подгрупп (ответственность за коллизии несёт пользователь) следующие общие файлы:
- cgroup.controllers - список поддерживаемых контроллеров
- cgroup.subtree_control - список активированных контроллеров; пуст при создании группы; при активации записывать "+имя",
при деактивации - "-имя"; иерархические ограничения на активацию
- cgroup.type - режим группы:
- domain (все потоки одного процесса вместе)
- threaded (можно разделять потоки одного процесса, нельзя вернуться в domain;
реализовано для потоковых контроллеров: cpu, perf_event и pids; не видны доменным контроллерам: memory)
- domain threaded (группа типа domain, которая является корнем групп типа threaded)
- domain invalid (можно преобразовать в threaded)
- cgroup.procs - идентификаторы процессов (PID) неотсортированные и неуникальные;
можно добавлять (0 - это мы), добавляются все потоки процесса, при этом удаляется из старой cgroup;
читается только в domain и domain threaded)
- cgroup.threads - идентификаторы потоков (можно добавлять, при перемещении (внутри домена!) удаляется из старой группы)
- cgroup.events - поле populated информирует о наличии живых процессов в поддереве (отсутствует в корневой группе)
- cgroup.max.descendants - max, максимальное количество подчинённых групп
- cgroup.max.depth - max, максимальная глубина поддерева групп
- cgroup.stat - статистика: nr_descendants - количество подчинённых групп; nr_dying_descendants - количество подчинённых групп в процессе удаления
Модели распределения ресурсов:
- веса (100; от 1 до 10000), каждый получает свою долю от суммы весов
- лимиты
- гарантированный уровень
- allocations
Контроллеры: (см. /proc/cgroups):
- cpu - учёт и лимиты ЦП, файлы:
- cpu.stat - статистика: usage_usec, user_usec, system_usec, nr_periods, nr_throttled, throttled_usec
- cpu.weight - доля
- cpu.weight.nice - доля в терминах команды nice; от -20 до 19 (0 по умолчанию)
- cpu.max - "квота-микросекунд период"
- devices - ограничения на mknod и open; ограничения накладываются путём включения
bpf программы типа BPF_CGROUP_DEVICE в группу (затейники)
- io - учёт и ограничение блочного ввода-вывода (blk-mq не обслуживается, кеширование записи учитывается для ext4 и btrfs), файлы:
- io.stat - статистика в виде неупорядоченных "$MAJ:$MIN rbytes=число wbytes=число rios=число wios=число"
- io.weight - доля в виде неупорядоченных "$MAJ:$MIN доля-потраченного-времени"; в качестве устройства можно указать "default 100";
только при использовании планировщика ввода-вывода cfq
- io.max - лимиты на пропускную способность и количество операций в секунду в виде неупорядоченных "$MAJ:$MIN {rbps|wbps|riops|wiops}=число ..."
- memory - учёт и ограничение использования оперативной памяти (пользователи, ядро, буферы сокетов), файлы (всё в байтах):
- memory.current - текущее использование ОП группой и наследниками
- memory.low - стараться не допускать ниже указанного
- memory.high - стараться не допускать выше указанного
- memory.max - больше не давать, вплоть до вызова OOM-killer
- memory.events - изменение файла вызывает событие: "low раз" (использование памяти ниже memory.low вызывало недостаток памяти);
"high превышений-memory.high"; "max приближений-к-memory.max"; "oom угроз-вызова-OOM-keller"; "oom_kill вызовов"
- memory.stat - много всякой статистики
- memory.swap.current - текущее использование ОП и свопа группой и наследниками
- memory.swap.max - больше не давать
- pids - ограничение количества процессов, файлы:
- pids.max - максимальное количество процессов (недопустимо в корне; max - без ограничений); действует только на fork и clone
- pids.current - текущее количество процессов в иерархии
- rdma - ограничение использования ресурсов RDMA, файлы
Механизм пространства имён позволяет установить новый корень cgroup (unshare(2)).
Процесс может смонтировать cgroup2 в неначальном пространстве имён, если у него есть полномочия CAP_SYS_ADMIN
в его пользовательском пространстве имён (user) и пространстве монтирования (mnt), рекомендуется для лучшей изоляции.
Пространства имён (namespaces)
Пространства имён (namespaces) - механизм ядра Linux, обеспечивающий изоляцию процессов в некоторых аспектах (типах пространства).
Используется системами контейнеризации, systemd.
Каждый процесс принадлежит ровно одному пространству имён каждого типа.
Изначально существует ровно по 1 пространству имён каждого типа.
Создание пространств имён (кроме пространства имён пользователей) требует прав CAP_SYS_ADMIN
(зато права CAP_SYS_ADMIN в целевом пространстве требуются для изменения пространства имён пользователей для процесса).
Недостаточная изначальная продуманность и последующее применение напильника и изоленты для заделывания дыр в безопасности
привели к очень сложным и неочевидным правилам работы. Ждём namespaces v2.
Базируется на системных вызовах:
- clone.2 - возможно создаёт новое пространство (пространства) имён, создаёт новый процесс и помещает его в это (эти) пространства
- setns.2 - перемещает текущий процесс (потомков процесса для пространства имён pid) в указанное пространство имён
- unshare.2 - создаёт новое пространство (пространства) имён, перемещает процесс в него (в них)
- ioctl_ns.2 - действия над пространствами имён:
- получить пространство имён пользователей, владеющее указанным пространством
- получить родительское пространство имён для казанного пространства (только usr и pid)
- определить тип пространства имён
- определить владельца пространства имён пользователей
Каталог /proc/идентификатор-процесса/ns/ содержит для каждого типа пространства имён по 1 символьной ссылке
вида "тип -> тип:[inode-пространства]" (ранее использовались жёсткие ссылки).
Для сравнения можно также использовать inode символьных ссылок (они одинаковы для всех процессов одного пространства).
Значение ссылки можно получить с помощью readlink и использовать в nsenter.
Пространство имён существует пока существует хотя бы 1 процесс в нём.
Типичным способом сохранения пространства имён от самоуничтожения является монтирование с --bind соответстующего файла из /proc/идентификатор-процесса/ns/.
Ограничения на количество пространств имён каждого типа в текущем пространстве имён пользователей для каждого пользователя
находятся в файлах
/proc/sys/user/{max_cgroup_namespaces,max_ipc_namespaces,max_mnt_namespaces,max_net_namespaces,max_pid_namespaces,max_time_namespaces,max_user_namespaces,max_uts_namespaces}
(можно изменять).
Реализованные типы пространств имён:
Утилита nsenter позволяет запустить команду с параметрами (по умолчанию /bin/sh) в другом пространстве имён,
требуется CAP_SYS_ADMIN, ключи:
- --target идентификатор-процесса # использовать пространства имён указанного процесса, а также корневой и рабочий каталог
- --all # использовать все пространства имён указанного процесса, пространство имён пользователей игнорируется, если совпадает с текущим
(не даёт восстановить сброшенные привилегии); отсутствует в RHEL7
- --mount[=файл-mnt-из-/proc/идентификатор-процесса/ns/] # требуются права CAP_SYS_CHROOT и CAP_SYS_ADMIN в своём пространстве имён пользователей
и CAP_SYS_ADMIN в целевом пространстве имён монтирования
- --uts[=файл-uts-из-/proc/идентификатор-процесса/ns/]
- --ipc[=файл-ipc-из-/proc/идентификатор-процесса/ns/]
- --net[=файл-net-из-/proc/идентификатор-процесса/ns/]
- --pid[=файл-pid-из-/proc/идентификатор-процесса/ns/]
- --user[=файл-user-из-/proc/идентификатор-процесса/ns/] # ? пространство имён пользователей игнорируется, если совпадает с текущим
(это не даёт восстановить сброшенные привилегии);
процесс имеет доступ к целевому пространству имён, если у него есть права CAP_SYS_ADMIN в своём пространстве и целевом пространстве
- --cgroup[=файл-cgroup-из-/proc/идентификатор-процесса/ns/] # членство в cgroup не изменяется
- --setgid идентификатор-группы # для пространства имён пользователей устанавливается всегда, по умолчанию 0; дополнительные группы сбрасываются
- --setuid идентификатор-пользователя # для пространства имён пользователей устанавливается всегда, по умолчанию 0
- --preserve-credentials # не изменять uid/gid для пространства имён пользователей
- --root[=каталог] # установить новый корневой каталог; по умолчанию корневой каталог целевого процесса
- --wd[=каталог] # установить новый рабочий каталог; по умолчанию рабочий каталог целевого процесса
- --no-fork # exec без fork (не попадает в пространство имён pid)
- --follow-context # наследовать контекст SELinux от целевого процесса
Утилита unshare позволяет запустить команду с параметрами (по умолчанию /bin/sh) в пространстве имён, отделённом от родительского, ключи:
- --ipc[=имя-существующего-файла] # если файл указан, то создаётся постоянное (persistent) пространство имён с помощью mount bind
- --mount[=имя-файла] # если файл указан, то создаётся постоянное (persistent) пространство имён с помощью mount bind;
файл д.б. в файловой системе с флагом распространения private;
- --net[=файл] # если файл указан, то создаётся постоянное (persistent) пространство имён с помощью mount bind
- --pid[=файл] # если файл указан, то создаётся постоянное (persistent) пространство имён с помощью mount bind
- --uts[=файл-uts-из-/proc/идентификатор-процесса/ns/] # если файл указан, то создаётся постоянное (persistent) пространство имён с помощью mount bind
- --user[=файл-user-из-/proc/идентификатор-процесса/ns/] # если файл указан, то создаётся постоянное (persistent) пространство имён с помощью mount bind;
при монтировании файловых систем procfs и sysfs делаются попытки ограничить "лишний" доступ, но это не точно
- --cgroup[=файл-cgroup-из-/proc/идентификатор-процесса/ns/] # если файл указан, то создаётся постоянное (persistent) пространство имён с помощью mount bind
- --fork # fork перед exec, полезно (обязательно?) при создании нового пространства имён pid;
без --fork: "fork: Cannot allocate memory";
или "unshare: mount /proc failed: Device or resource busy" или "unshare: mount /tmp/proc failed: Invalid argument";
- --kill-child[=сигнал] # по умолчанию - SIGKILL; подразумевает --fork; при завершении unshare сигнал посылается порождённому по fork() процессу;
при создании нового пространства имён pid позволяет убить всё дерево процессов
- --mount-proc[=точка-монтирования] # по умолчанию - /proc; монтировать procfs (MS_PRIVATE|MS_REC) в указанной точке;
полезно при создании нового пространства имён pid; подразумевает создание нового пространства имён точек монтирования;
если указать не /proc (новый procfs д.б. предварительно смонтирован),
то ps и top будут видеть процессы родительского пространства имён процессов
- --setgroups allow|deny # по умолчанию - allow; управляет возможностью выполнять системные вызовы setgroups(2) в новом пространстве имён пользователей;
для setgroups(2) требуется возможность CAP_SETGID, наличие /proc/идентификатор-процесса/gid_map и право записи
- --map-root-user # после создания пространства имён пользователей создать таблицу отображающую euid/egid в 0/0;
подразумевает --setgroups=deny
- --propagation {private|shared|slave|unchanged} # по умолчанию - private; рекурсивно устанавливать флаг распространения (propagation)
в новых пространствах имён точек монтирования (если они создаются)
Из интересного:
$ unshare --fork --pid [--mount] --mount-proc --user --map-root-user whoami
root
$ unshare --fork --pid --mount-proc --user --map-root-user ls -l /etc/shadow
---------- 1 nfsnobody nfsnobody 1750 Nov 7 2023 /etc/shadow
$ unshare --fork --pid --mount-proc --user --map-root-user cat /etc/shadow
cat: /etc/shadow: Permission denied
$ unshare --fork --pid --mount-proc --user --map-root-user touch /tmp/test
$ unshare --fork --pid --mount-proc --user --map-root-user ls -l /tmp/test
-rw-r--r-- 1 root root 0 Oct 9 18:39 /tmp/test
$ ls -l /tmp/test
-rw-r--r-- 1 euid egid 0 Oct 9 18:39 /tmp/test
$ mkdir /tmp/testdir
$ unshare --fork --pid --mount --mount-proc --user --map-root-user bash
# mount -t tmpfs test /tmp/testdir # что происходит с файловой системой при выходе из bash?
# touch /tmp/testdir/file # а могли бы занять всю память...
# ls -l /tmp/testdir/file
-rw-r--r-- 1 root root 0 Oct 29 19:32 /tmp/testdir/file
# на другом терминале: ls -l /tmp/testdir/file: No such file or directory
# на другом терминале: mount -t tmpfs test /tmp/testdir; ls -l /tmp/testdir/file: No such file or directory
$ unshare --fork --pid --mount --mount-proc --user --map-root-user bash
# mknod /tmp/md1 b 9 1
mknod: /tmp/md1: Operation not permitted
# reboot --no-wall --force
Rebooting
Hangup
завершение unshare
# mount /var/lib/mysql
# запуск mysqld
# теперь файлы из каталога /var/lib/mysql недоступны, а они нужны
# unshare --mount bash
# umount /var/lib/mysql
# cp /var/lib/mysql/* ...
# exit
Кроме пространства имён clone/unshare/setns позволяют управлять разделением таблицы дескрипторов файлов,
атрибутами файловой системы (корневой каталог, текущий каталог, umask).
Утилита lsns выводит информацию об указанном (по номеру inode) пространстве имён (дерево процессов: pid, родительский pid, пользователь, команда)
или о всех доступных пространствах имён (inode, тип, количество процессов, PID, пользователь, команда). Ключи:
- --json
- --list
- --output [+]список-колонок # список доступных колонок по --help
- --task идентификатор-процесса
- --type тип # mnt, net, ipc, user, pid, uts
- --noheadings
- --notruncate # не обрезать текст утрамбовывая его в колонку
- --raw # без форматирования
- --nowrap # не использовать многострочный вывод значения
/proc/sys/user/ содержит ограничения на количество пространств имён: max_cgroup_namespaces, max_ipc_namespaces,
max_mnt_namespaces, max_net_namespaces, max_pid_namespaces, max_time_namespaces, max_user_namespaces, max_uts_namespaces.
Утилиты newuidmap (cap_setuid=ep) и newgidmap (cap_setuid=ep) помогают заполнить
таблицы отображения uid и gid - /proc/номер-процесса/{uid,gid}_map,
в качестве параметров указывается номер-процесса, начало интервала uid/gid внутри пространства имён пользователей,
начало интервала uid/gid вне пространства имён пользователей, длина интервала. Тройки можно указывать несколько раз.
Утилиты проверяют, что пользователь является владельцем указанного процесса и uid/gid из интервала допустим в соответствии
с содержимым файла /etc/subuid (/etc/subgid).
Файлы /etc/subuid и /etc/subgid (необходимо вписать files в поле subid файла /etc/nsswitch.conf)
описывают права для утилит newuidmap/newgidmap. Редактируется утилитами useradd/userdel/usermod
в соответствии с правилами, задаваемыми утилитой newusers. Каждая строка содержит поля через ':':
- имя пользователя или uid
- uid начала интервала
- длина интервала
Namespaces in operation (2013, 7 частей).
Resource management: Linux kernel Namespaces and cgroups (материалы к лекции).
Глубокое погружение в Linux namespaces (4 части).
Файловые системы ext2/ext3/ext4
Создание стандартной файловой системы ext2/ext3/ext4:
mke2fs устройство (mkfs.ext4 устройство [количество-блоков | число{kmgt} ])
с ключами (умолчания в /etc/mke2fs.conf)
- -b размер-блока (по умолчанию используется эвристика - 4096; для x86_64: 1024, 2048 или 4096 байт)
- -c (искать плохие блоки)
- -cc (искать плохие блоки с проверкой записи)
- -С байт (размер-кластера, по умолчанию равен 16 размерам блока; bigalloc)
- -d каталог (1.43; предзаполнение создаваемой файловой системы на основе каталога)
- -D (использовать прямой (небуфферизованный) ввод/вывод
- -e continue | remount-ro | panic (тип-обработки-ошибок - 1.43)
- -E список-особых-возможностей-через-запятую
- discard (по умолчанию; освобождать блоки при создании - полезно для SSD (TRIM) и thin-provision)
- encoding=кодировка-имён-файлов (также устанавливает casefold)
- encoding_flags=nostrict (не отвергать несоответствующие кодировке имена файлов)
- lazy_itable_init=1|0 (отложить инициализацию таблицы inode - очень сильно уменьшает время инициализации, но добавляет непредсказуемости во время работы)
- lazy_journal_init=1|0 (не обнулять журнал при создании - сильно уменьшает время инициализации,
небольшой риск при начале работы)
- mmp_update_interval=секунд (периодичность проверки многократного монтиирования; не более 300)
- no_copy_xattrs (не копировать расширенные атрибуты при заполнении каталога (ключ -d))
- nodiscard
- num_backup_sb=0|1|2 (количество резервных копий суперблока, требуется sparse_super2)
- offset=байт (смещение начала файловой системы от начала блочного устройства)
- packed_meta_blocks=0|1 (разместить журнал, битовые карты и таблицу inode в начале блочного устройства;
версия 1.42.10; требуется flex_bg)
- quotatype=список-через-двоеточие (usrquota, grpquota, prjquota)
- resize=блоков (зарезервировать инфраструктуру для расширения до указанного размера)
- root_owner=uid:gid (по умолчанию - пользователь, запустивший mke2fs)
- stride=блоков (размер полоски (chunk) RAID; обычно определяется автоматически)
- stripe_width=блоков (размер сегмента RAID - размер полоски * число дисков данных; обычно определяется автоматически)
- -f байт (устарело; размер фрагментов?)
- -F (настоять на создании файловой системы)
- -FF (сильно настоять на создании файловой системы)
- -g количество-блоков-в-группе (не надо трогать)
- -G количество-сливаемых-групп (16?; для локализации метаданных; см. flex_bg)
- -i байт-на-inode (предполагаемый средний размер файла; по умолчанию очень маленький)
- -I байт (256; от 128, только степень двойки; размер inode; могут храниться расширенные атрибуты и данные (inline))
- -j (журнал для ext3 и ext4)
- -J список-параметров-журнала-через-запятую
- size=мегабайт (128 или 1024 (при большом размере ОП); размер внутреннего журнала, не более 4ГБ)
- fast_commit_size=килобайт (ядро от 5.10)
- location=смещение (смещение журнала от начала файловой системы)
- device=блочное-устройство (внешний журнал; создание: mke2fs -O journal_dev блочное-устройство;
вместо явного имени устройства можно использовать LABEL= и UUID=)
- -l имя-файла (список номеров плохих блоков; не секторов!)
- -L имя-тома (до 16 байт)
- -m резервируемый-процент (по умолчанию - 5; кстати, при заполнении
на 90% начинается фрагментация; при заполнении на 95% фрагментация начинает мешать)
- -n ("сухой" прогон)
- -N число-inode (явное указание)
- -O список-возможностей-через-запятую (удаляемая возможность предваряется "^"; до версии 1.43 дополнительные ключи "-O" игнорируются;
умолчания в /etc/mke2fs.conf в разделе defaults и fs_types)
- none - удаляет все умолчания
- 64bit - для файловой системы более 2^32 логических блоков (16 ТиБ при размере блока в 4096 байт); ядро 2.6.28
- auto_64-bit_support - автоматически включать 64bit для файловой системы более 2^32 блоков (удалена, действует всегда)
- bigalloc - группировать блоки в кластеры, см. -C, требует extent, проблемы с delalloc, требуется ядро 3.2,
биты в битовых картах соответствуют кластерам, а не блокам, уменьшает размер карт, минимальный размер файла равен размеру кластера
- casefold
- dir_index - использовать b-деревья для ускорения поиска в больших каталогах (ext3 и ext4); возможны коллизии
- dir_nlink - более 65000 подкаталогов в каталоге (ext4); ядро 2.6.28
- ea_inode - больше места под расширенные атрибуты
- encrypt - шифрование данных и имён файлов, метаданные не шифруются; ядро 4.1; для систем с одним пользователем рекомендуется шифрование
на блочном уровне
- ext_attr - хранить расширенные атрабуты в inode
- extent (ранее extents) - выделение блоков интервалами, дерево интервалов; уменьшает размер метаданных, ускоряет создание файлов (ext4);
ядро 2.6.28
- extra_isize - резервировать место под наносекундные отметки времени даже если текущее ядро их не использует,
требуется inode размером 256 байт или более (ext4); ядро 2.6.28
- filetype - хранить тип файла в каталоге
- flex_bg - группировать метаданные нескольких групп вместе (ext4), см "-G"; точнее снимается ограничение на локализацию
битовой карты блоков и таблицы inode в группе блоков; ядро 2.6.28
- has_journal (ext3 и ext4)
- huge_file - файловая система может содержать файлы более 2TB (ext4); ядро 2.6.28
- inline_data - можно хранить данные в inode; ядро 3.8; inline_data с размером inode 1024 байта вмещает 896 байт данных;
не выдержал параллельного стрессового тестирования в CentOS 7.2 (3.10.0-327.28.3.el7.x86_64;
inline 512 или 1024 и NFSv3/4; noac и lookupcache=none не решают проблему; ^dir_index не решает проблему,
обновление до CentOS 7.6 (3.10.0-957.12.1) не решает проблему)
mkfs.ext4 -N 300000000 -E stride=16,stripe_width=48,lazy_itable_init=1,nodiscard,packed_meta_blocks=1 -I {256,1024,4096} -J size=512 -L inline1024 -v -O 64bit,dir_index,dir_nlink,extent,ext_attr,filetype,flex_bg,has_journal,huge_file,inline_data,large_file,meta_bg,sparse_super,uninit_bg,^resize_inode /dev/sdf
LABEL=inline1024 /inline1024 ext4 noauto,data=ordered,stripe=48,nobarrier,nodiratime,relatime,journal_checksum,delalloc,nodiscard 1 2
for host in список
do
ssh $host /usr/sbin/bonnie++ [-D] -n 250:10000:0:25000 -d /inline1024/share4s/temp -f -r 5000 -s 0 &
done
основная часть ошибок идёт после Stat files in random order
Can't change to directory 88252
Cleaning up test directory after error.
Can't open directory.
Can't chdir().
Cleaning up test directory after error.
Bonnie: drastic I/O error (rmdir): No such file or directory
...
Can't create file 18597/0000031f17
Cleaning up test directory after error.
...
Can't stat file 71609/9TP3WOK00000c04f5
Cleaning up test directory after error.
...
Can't change to directory 32213
Cleaning up test directory after error.
...
Can't delete file 30445/0000051c37
Cleaning up test directory after error.
Bonnie: drastic I/O error (rmdir): Directory not empty
...
половина процессов умерла, оставив после себя несколько файлов
один процесс ничего не смог удалить
для ядра 3.10.0-957.12.1. остались лишь
Can't create file 12829/000002273fWe
Cleaning up test directory after error.
неиспользование "-E lazy_itable_init=1,packed_meta_blocks=1 -I 1024 -J size=1024 -O meta_bg,uninit_bg" не помогает
- journal_dev - опция для суперблока внешнего журнала (-J device=)
- large_dir - позволить реально большие каталоги (более 2ГБ, 10 миллионов файлов)
- large_file - файловая система может содержать файлы более 2GB, устанавливается автоматически при создании большого файла
- metadata_csum - контрольные суммы для метаданных (1.43, ядро 3.18); несовместимо с uninit_bg (metadata_csum лучше)
- metadata_csum_seed - хранить начальное значение контрольных сумм в суперблоке, позволяет менять UUID
- meta_bg - позволяет увеличивать размер файловой системы "на ходу" без предварительного
резервирования места под описания групп блоков, устанавливается всегда для 64bit, замедляет монтирование,
устанавливается автоматически при необходимости во время увеличения без размонтирования (ext4),
поэтому не рекомендуется ручная установка; ядро 2.6.28
- mmp - защита от многократного монтирования (ext4) (разделяемые файловые системы); ядро 3.0
- quota - создать скрытые файлы (#3 для пользовательских квот и #4 для групповых квот; ядро 3.6
- project - квотирование по проектам (каждому inode приписывается идентификатор проекта), ядро 4.5
- resize_inode - резервировать место для дескрипторов групп блоков при расширении файловой системы без размонтирования
(по умолчанию - в 1024 раза, расширенная опция resize), требует sparse_super или sparse_super2
- sparse_super - не переусердствовать с количеством резервных суперблоков
- sparse_super2 - не более 2 копий суперблока (1.42.10, ядро 3.16); не даёт изменить размер без размонтирования
- stable_inodes - зафиксировать UUID и номера inode; невозможно уменьшение файловой системы; требуется для шифрования
- uninit_bg - отложить инициализацию дескрипторов групп блоков и использовать контрольные суммы для проверки,
очень сильно ускоряет создание и проверку (ext4); см. metadata_csum; ядро 2.6.28
- verity - аутентификация неизменяемых файлов (см. dm-verity для всей файловой системы)
- -q - выполнить без вывода сообщений
- -S - записать только суперблок и дескрипторы групп, последнее средство восстановления, сразу использовать e2fsck
- -t имя-подсекции (в секции fs_types файла /etc/mke2fs.conf)
- -T имя-секции (в /etc/mke2fs.conf)
- -U {UUID | null | clear | random | time}
- -v - больше сообщений
- -V - только вывести номер версии
Возможности могут настраиваться в файле /etc/mke2fs.conf. Секции:
- defaults
- fs_types - определяются ключом "-T" или типом файловой системы
- news - много маленьких файлов
- small - много очень маленьких файлов
- big - средний размер файла 32KB (автоматически выбирается для файловой системы от 4 до 16 TB)
- huge - средний размер файла 64KB (автоматически выбирается для файловой системы от 16 TB)
- largefile - файловая система для больших файлов
- largefile4 - файловая система для очень больших файлов
Настройка параметров файловой системы ext2fs производится с помощью утилиты tune2fs
(не умеет добавлять свойство 64bit - необходимо для раздела размером более 16 ТиБ).
Использование с ключом "-l" позволяет узнать текущие параметры, в частности:
- Last checked: дата последней проверки
- Check interval: при истечении указанного интервала запускается принудительная проверка
состояния файловой системы при загрузке
- Mount count: число монтирований после последней проверки
- Maximum mount count: после указанного числа монтирований запускается принудительная проверка
состояния файловой системы при загрузке
Размер файловой системы ext3 ограничен 16TB (8TB для RHEL41).
Для создания файловой системы более 8ТБ:
mke2fs -j -L метка-тома -m 0 -T largefile4 -b 4096 -F -E stride=32,resize=4026531840 -v /dev/имя-VG/имя-LV
tune2fs -i 0 -c 0 /dev/имя-VG/имя-LV
Проверка и исправление файловой системы ext2fs/ext3fs: e2fsck -v -C 0 имя-устройства.
Для насильственной проверки "как бы" хорошей файловой системы надо использовать ключ -f.
По завершению выводит информацию о фрагментации файловой системы.
Для запрета проигрывания журнала перед проверкой необходимо отключить журнал командой
"tune2fs -O ^has_journal имя-устройства".
Оптимизация каталогов и поиск одинаковых имён: "e2fsck -fD".
Утилита ext2online позволяет увеличить размер ext2 (ext3) без размонтирования.
Возможности ext2online были добавлены в resize2fs.
Утилита resize2fs (появилась в CentOS 4.2) позволяет уменьшить
(после этого необходимо уменьшить раздел) или увеличить
(предварительно необходимо увеличить раздел) размер несмонтированной файловой системы ext2, ext3 или ext4.
Смонтированную файловую систему можно только увеличить (требуется ядро 2.6).
resize2fs не умеет работать без размонтирования с файловой системой со свойством 64bit (более 16 ТиБ) до ядра 3.2.
resize2fs не умеет преобразовывать файловую систему без 64bit в большую до версии 1.42.
В качестве параметра указывается имя устройства и размер (по умолчанию в блоках файловой системы - 4 КБ, можно опустить). Ключи:
- -P # показать минимальный размер
- -M # уменьшить до минимального размера
- -f # игнорировать проверки
- -p # показывать прогресс
Утилита e4defrag позволяет дефрагментировать указанный файл, каталог или устройство
(очень медленно, 2.5 TB в сутки независимо от скорости массива).
Ключ "-c" позволяет проверить необходимость дефрагментации.
Утилита e2undo позволяет откатывать действия, записанные в журнале.
описание ext3fs
(а также утилиты вычисления степени фрагментации файлов и файловой системы).
Взгляд на ext4 (PDF, журнал "Системный администратор").
Отличия ext4 от ext3
(создание - "mke2fs -t ext4" или mkfs.ext4; монтирование без преобразования - "mount -t ext4";
преобразование без fsck - "[tune2fs -j;] tune4fs -O extents,dir_index";
преобразование с fsck - "[tune2fs -j;] tune4fs -O extents,uninit_bg,dir_index; e4fsck -fDC0";
ускорение работы с атрибутами - "tune2fs -I 256";
extra_isize (размер inode), ext_attr, flex_bg и huge_file для существующей файловой системы установить нельзя;
совместимость только снизу вверх!):
- ext3 (ext4) ограничивает размер файловых систем 8TiB/работает или 16TiB/создаётся
(1EiB, e2fsprogs научилась создавать системы более 16ТБ в версии 1.42 (ноябрь 2011) - опция 64bit,
другие утилиты (resize2fs) - ещё нет; желательно ядро 3.2)
(ветка 64-bit),
а размер файлов - 2 TiB (16TiB)
- введение экстентов (до 128MB, 4 экстента непосредственно в inode)
позволяет ускорить удаление очень больших файлов и уменьшить фрагментацию
- задержка выделения блоков до реальной записи из кеша на диск позволяется выделять блоки непрерывными групппами
- предварительное выделение места под файл без физического заполнения его нулями ускоряет процесс
- предполагается реализация перспективного предварительного выделения
- возможно создать более 32 тысяч подкаталогов
- контрольные суммы для метаданных
- журнал может иметь контрольную сумму (позволяет ускорить работу с журналом на 20%)
- lazy_itable_init - ускоряет создание файловой системы в десятки раз (С F15 или RHEL6.2),
инициализация начинается после первого монтирования, занимает значительно больше времени (несколько суток на большой и медленной системе),
не прерывается, файловую систему нельзя размонтировать
- в будущем дефрагментирование без размонтирования (ожидается e4defrag) - добавлена в e2fsprogs 1.42
- ускорение fsck на незаполненных файловых системах (по количеству inode) после первого запуска
- предполагается реализация в будущем восстановление удалённых файлов
- увеличение точности времён создания, модификация и обращения к файлу с секунды до наносекунды
- введение номера версии файла (увеличивается на 1 при каждом изменении)
- место под inode увеличено по умолчанию со 128 байт до 256 байт,
зато сюда поместились расширенные атрибуты (ускорение доступа в 3-7 раз)
- отключение барьерной синхронизации записи данных и журнала (включена по умолчанию): "mount -o barrier=0"
- загрузка с ext4 работает начиная с F12
- filefrag (фрагментация файла) и e2freefrag (фрагментация свободного пространства) (не работают на больших файловых системах)
- кластеризация при выделении блоков (bigalloc): размер кластера - степень двойки числа блоков,
затраты на учёт кластеров значительно меньше затрат на учёт блоков, но затраты на хвосты увеличиваются
В ext4 изменён алгоритм выделения блоков:
маленькие запросы (менее /sys/fs/ext4/раздел/mb_stream_req, 16 = 64KiB) группируют мелкие файлы вместе (per-CPU),
большие - куском (per-inode). Прочие параметры:
- delayed_allocation_blocks
- inode_goal
- inode_readahead_blks - максимальное количество блоков предварительного чтения таблицы inode, 32, 128 KiB
- lifetime_write_kbytes - всего записано КиБ
- max_writeback_mb_bump - максимальное количество МиБ, которое алгоритм writeback обрабатывает до перехода к следующему inode, 128
- mb_group_prealloc
- mb_max_to_scan - максимальное количество экстентов, которое просматривает
алгоритм выделения блоков при поиске наиболее подходящего, 200
- mb_min_to_scan - 10
- mb_order2_req - минимальный размер запроса, при котором алгоритм выделения блоков рассматривает кеш, степень 2, 2
- mb_stats
- mb_stream_req - граница между большими и мылыми запросами, признак потока
- reserved_blocks
- session_write_kbytes - записано КиБ после текущего монтирования
При заполнении файловой системы на 97% начались тормоза при создании файлов (в 3-4 раза),
при запуске "rm -rf" скорость восстановилась, хотя заполненность продолжала превышать 98%.
Пакет e4fsprogs содержит утилиты
- создания файловой системы:
- mkfs.ext4
- mke4fs
- файл /etc/mke4fs.conf содержит параметры по умолчанию и описания шаблонов
sparse_super, filetype, resize_inode, dir_index, ext_attr,
has_journal, extents, huge_file, flex_bg, uninit_bg, dir_nlink, extra_isize,
inode_size = 256, inode_ratio = 16384, force_undo (выключен, всегда создавать журнал откатки)
- восстановления: e4fsck, e4fsck.conf
- настройки: e4label, tune4fs
- изменения размера: resize4fs
- восстановления файлов: e4undo
- отладки: debuge4fs, dumpe4fs, e4image, finde4fs
- отчёт о фрагментации указанного файла: filefrag, отчёт о фрагментации свободного пространства - e2freefrag
Отличия версий (RHEL 5.11 - 1.41.12; RHEL 6.8 - 1.41.12; RHEL 7.9 - 1.42.9; UEK6/u3 - 1.45.4):
- 1.46.5 относительно 1.45.6
- fast_commit (ядро 5.10), ускорение экспортированной по NFS файловой системы
- stable_inodes (не перенумеровывать inode при уменьшении файловой системы), требуется при шифровании
- mke2fs по умолчанию использует inode размером 256 байт
- 1.45.6 относительно 1.45.4
- chattr и lsattr поддерживают атрибут "x" (DAX)
- одновременная поддержка шифрования и casefold (бывший fname_encoding)
- 1.45.4 относительно 1.44.6
- force_fsck в tune2fs
- скрипт e2scrub_all и e2scrub (/etc/e2scrub.conf) позволяют автоматически запускать e2fsck на файловых системах под LVM
- 1.44.6 относительно 1.43.9
- large_dir (INCOMPAT_LARGEDIR) - файл-каталоги размером более 2ГБ и с деревом экстентов глубины 3 (было 2)
для 10 миллионов файлов в каталоге (при размере блока 4 КБ)
- ea_inode (INCOMPAT_EA_INODE) - большие расширенные аттрибуты во внешнем inode
- metadata_csum feature (RO_COMPAT_METADATA_CSUM) включена по умолчанию (уже было?)
- tune2fs запускает журнал и может потребовать fsck
- для полного тестирования необходимо запускать "make fullcheck"
- e2mmpstatus - информация о Multi-Mount Protection (MMP)
- verity (fsverity) - пока только установка флажка
- запросы на оптимизацию при запуске fsck спрашивают "Optimize?" вместо "Fix?"
- 1.43.9 относительно 1.43.3
- mke2fs -U {null | clear | random | time}
- можно отключить оптимизацию дерева экстентов в e2fsck
- debugfs может открывать файловые системы с неверной контрольной суммой суперблока
- debugfs logdump -S (вывести суперблок журнала)
- исправления ошибок
- 1.43.3 относительно 1.42.13
- контрольная сумма для метаданных (metadata_csum по умолчанию)
- встроенные в метаданные данные (inline_data)
- шифрование (encrypt)
- квотирование по проектам (project)
- режим только на чтение (?)
- удалены остатки кода для сжатия данных
- режим FUSE
- debugfs может изменять расширенные атрибуты и транзакции журнала
- resize2fs может преобразовать из 32-битного режима в 64-битный и обратно (на ходу?)
- при создании файловой системы размером более 500 ТБ автоматически включается meta_bg (он и раньше включался для 64bit,
который необходим для 500 МБ?)
- e2fsck может преобразовывать блочные структуры в экстентные
- появилась возможность ответа "yes to all" для e2fsck
- предзаполнение файловой системы при создании ("mkfs.ext4 -d")
- утилита e2fuzz - поломка образа ext4 для тестирования возможностей починки
- для систем с размером памяти более 128ГБ по умолчанию создаётся журнал размером 1ГБ (было 128МБ)
- 1.42.13 относительно 1.42.9
- "mke2fs -E packed_meta_blocks=0|1" (разместить журнал, битовые карты и таблицу inode в начале блочного устройства)
- "mke2fs -O sparse_super2 (не более 2 копий суперблока)
- "mke2fs -E offset=смещение-от-начала-устройства"
- для использования механизма скрытых квот рекомендуется 1.42.10 или выше
- опция hugefiles_align_disk в mke2fs.conf (выравнивание относительно начала диска, а не раздела)
- 1.42.9 относительно 1.42.8
- для пользователей с опцией 64bit рекомендуется 1.42.9 или выше
- 1.42.8 относительно 1.42.6
- ключи filefrag: -k, -b размер-блока, -e, -X
- e2image -a
- 1.42.6 относительно 1.42
- "mke2fs -D" (небуферизованный ввод/вывод, медленней, но меньше мешает другим)
- 1.42
- e2fsprogs научилась создавать системы более 16ТиБ (изменение размера только без размонтирования, причём требуется ядро 3.2)
- группировка блоков в кластеры (bigalloc) уменьшает размер битовых карт
- раздел devices в mke2fs.conf
- опция reserved_ratio в разделах default и fs_types в mke2fs.conf
- опция lazy_journal_init (необнуление журнала) ускоряет создание за цену небольшого риска
- другие умолчания при создании файловой системы (нет проверки по достижению числа монтирований и времени,
параметры массива не определяются автоматически по размеру блока устройства)
- e4defrag
- поддержка журнала более 2ГиБ
Сборка e4fsprogs (1.42.8, 1.42.10, 1.43.1, 1.43.3, 1.43.4, 1.46.5):
- mkdir build
- cd build
- ../configure [--enable-elf-shlibs] [--disable-fuse2fs] [--prefix=/usr/local] #
при использовании --enable-elf-shlibs разделяемые библиотеки кладутся в /usr/local/lib и от них начинают зависеть утилиты типа mount!
- make
- make [full]check # f_extent_oobounds: failed в 1.42.8 (в тесте используется системный debugfs)
- make install (требуется texi2dvi (пакет texinfo-tex) для libext2fs.dvi; добавляйте мысленно /usr/local перед именем файла,
если указали --prefix в configure, кроме кусков udev и systemd)
- /sbin/e2fsck (/sbin/fsck.ext2, /sbin/fsck.ext3, /sbin/fsck.ext4, [/sbin/fsck.ext4dev])
- /sbin/debugfs (!)
- /sbin/mke2fs (/sbin/mkfs.ext2, /sbin/mkfs.ext3, /sbin/mkfs.ext4, [/sbin/mkfs.ext4dev])
- /sbin/badblocks (!)
- /sbin/tune2fs
- /sbin/dumpe2fs
- /sbin/blkid # нет в 1.43.1 и выше; замещает системный и несовместим с ним по ключам,
что сбивает с толку dracut при загрузке CentOS 6.2 (надо вручную "lvm vgchange -a y system")
- /sbin/logsave
- /sbin/e2image
- /sbin/fsck (!)
- /sbin/e2undo
- /usr/sbin/mklost+found
- /usr/sbin/filefrag (!)
- /usr/sbin/e2freefrag
- /usr/sbin/uuidd (!) # нет в 1.43.1 и выше
- /usr/sbin/e4defrag
- /sbin/e4crypt
- /sbin/findfs (?) # нет в 1.43.1 и выше
- /usr/bin/chattr (!)
- /usr/bin/lsattr (!)
- /usr/bin/uuidgen (!) # нет в 1.43.1 и выше
- /usr/lib/e2initrd_helper (64-bit!!)
- /sbin/resize2fs
- /usr/share/man8: e2fsck.8 (fsck.ext2.8, fsck.ext3.8, fsck.ext4.8, fsck.ext4dev.8), debugfs.8, tune2fs.8, mklost+found.8,
mke2fs.8 (mkfs.ext2.8, mkfs.ext3.8, mkfs.ext4.8, mkfs.ext4dev.8), dumpe2fs.8, badblocks.8, e2label.8, findfs.8,
blkid.8, e2image.8, logsave.8, filefrag.8, e2freefrag.8, e2undo.8, uuidd.8, e4defrag.8, fsck.8, resize2fs.8, e2scrub.8, e2scrub_all.8
- /usr/share/man5: e2fsck.conf.5, mke2fs.conf.5, ext4.5 и ext2.5 и ext3.5 (с версии 1.42.13?)
- /usr/share/man/man1: chattr.1, lsattr.1, uuidgen.1,
- /etc/mke2fs.conf (если место занято, то /etc/mke2fs.conf.e2fsprogs-new)
- /usr/share/locale/??/LC_MESSAGES/e2fsprogs.mo
- /usr/share/info/libext2fs.info.gz
- scrub: /usr/lib/udev/rules.d/e2scrub.rules (/usr/lib/udev/rules.d/96-e2scrub.rules),
/etc/cron.d/e2scrub_all - закоментарить?, /usr/lib/e2fsprogs/e2scrub_all_cron,
/usr/lib/e2fsprogs/e2scrub_fail, /usr/lib/systemd/system/{e2scrub@.service, e2scrub_all.service (выключен), e2scrub_all.timer,
e2scrub_fail@.service, e2scrub_reap.service (выключен)}, /usr/sbin/e2scrub, /usr/sbin/e2scrub_all, /etc/e2scrub.conf (выключен)
- /root/e2fsprogs-1.46.5/doc/ (libblkid.txt, libext2fs.texinfo, Makefile.in, RelNotes/, texinfo.tex)
- libcom (1.46.5): /usr/local/lib/libcom_err.a, /usr/local/include/et/com_err.h, /usr/local/share/et/et_c.awk,
/usr/local/share/et/et_h.awk, /usr/local/bin/compile_et, /usr/local/share/man/man3/com_err.3,
/usr/local/share/man/man1/compile_et.1, /usr/local/lib/pkgconfig/com_err.pc
- libss (1.46.5): /usr/local/lib/libss.a, /usr/local/include/ss/ss.h, /usr/local/include/ss/ss_err.h,
/usr/local/share/ss/ct_c.awk, /usr/local/share/ss/ct_c.sed, /usr/local/bin/mk_cmds, /usr/local/share/man/man1/mk_cmds.1,
/usr/local/lib/pkgconfig/ss.pc
- libe2p (1.46.5): /usr/local/lib/libe2p.a, /usr/local/include/e2p/e2p.h, /usr/local/lib/pkgconfig/e2p.pc
- [make install-libs] # статические библиотеки в /usr/local/lib; похоже, что они теперь в "make install": /usr/local/lib/libext2fs.a,
/usr/local/include/ext2fs/, /usr/local/lib/pkgconfig/ext2fs.pc
Аттрибуты (chattr, lsattr):
- a - только расширение
- A - не изменять время доступа к файлу
- c - хранить в сжатом виде (нет в ext4)
- C - отключить копирование при записи (нет в ext4)
- d - не резервировать командой dump
- D - синхронное обновление каталога (dirsync на каталог)
- e - экстентный формат файла
- E - ошибка сжатия (нет в ext4)
- h - файл более 2ТБ
- i - immutable (нельзя изменить, удалить, переименовать, сделать ссылку)
- I - каталог индексирован
- j - журналирование данных
- N - данные встроены в inode (нет в ext4)
- s - безопасное удаление - заполнение нулями (нет в ext4)
- S - синхронное изменение данных (sync на файл)
- t - не паковать хвост файла к другим файлам (нет в ext4)
- T - вершина файловой иерархии, подсказка для алгоритма выделения блоков
- u - при удалении содержимое сохраняется для возможности восстановления (нет в ext4)
- x - DAX
- X - compression raw access (нет в ext4)
- Z - compressed dirty file (нет в ext4)
Опции mount для ext2, ext3 и ext4 (см. ext4(5) или /usr/share/doc/kernel-doc-*/Documentation/filesystems/ext4.txt,
умолчания берутся из суперблока (tune2fs), стандартные опции описаны в документации по команде mount(8))
- acl|noacl (POSIX Access Control Lists)
- bsddf|minixdf (свободных полезных блоков/всего свободных блоков)
- debug
- errors={continue|remount-ro|panic} (что делать при обнаружении ошибки в файловой системе)
- nogrpid|sysvgroups|grpid|bsdgroups (создавать новый файл с группой процесса (если каталог не имеет бита setgid) или каталога)
- quota|noquota|grpquota|usrquota (считать квоту по пользователям и группам, версия 1 системы квотирования)
- orlov (новый алгоритм выделения блоков, по умолчанию)
- oldalloc (старый алгоритм выделения блоков)
- resuid=идентификатор и resgid=идентификатор (кому выдавать зарезервированное место)
- sb=килобайт (смещение неповреждённого суперблока)
- user_xattr|nouser_xattr (поддерживать расширенные атрибуты "user.")
Дополнительные опции mount для ext3 и ext4:
- ro (при этом журнал проигрывается и запись делается!)
- norecovery|noload (не проигрывать журнал)
- journal=update (преобразовать журнал в новый формат)
- journal_dev=major:minor и journal_path=путь (хранить журнал на указанном устройстве)
- data={ordered|journal|writeback} (данные пишутся до записи метаданных в журнал, данные журналируются, порядок записи не отслеживается;
для корневой файловой системы необходимо указывать параметр загрузки: "root-flags=data=journal")
- data_err={ignore|abort} (обработка ошибок в режиме data=ordered)
- barrier|nobarrier (использовать барьеры записи для упорядочивания запросов записи;
требуется поддержка по всему стеку ввода/вывода;
для дисков без кеша записи или с батарейкой можно отключить, что увеличит производительность)
- commit=секунд (5; интервал между синхронизации данных и метаданных на диск; для увеличения производительности увеличить)
- usrjquota=aquota.user|grpjquota=aquota.group|jqfmt=vfsv0 (версия 2 системы квотирования - журналируемая)
Дополнительные опции mount для ext4:
- journal_checksum
- journal_async_commit (не дожидаться завершения записи в журнал, включает journal_checksum;
в RHEL7.2 несовместим с data=ordered несмотря на nobarrier)
- inode_readahead_blks=блоков (32 по умолчанию)
- stripe=блоков-файловой-системы (используется алгоритмом выделения блоков для выравнивания;
число дисков с данными в RAID * размер полоски)
- delalloc|nodelalloc (отложенное до момента записи выделение блоков; ускоряет работу)
- max_batch_time=микросекунд (15000; максимальное время ожидания следующего запроса
при склейке запросов синхронной записи)
- min_batch_time=микросекунд (0; увеличение улучшает пропускную способность многопотоковой синхронной записи
за счёт увеличения задержек)
- journal_ioprio=приоритет (3; от 0 - высший - до 7; обычный ввод-вывод имеет приоритет 4)
- auto_da_alloc|noauto_da_alloc (борьба с обнулением файлов после аварийного отключения)
- noinit_itable (отложить фоновую инициализацию таблицы inode до следующего монтирования)
- init_itable=число (задержка, определяет скорость фоновой инициализации таблицы inode, 0 - максимальная)
- nodiscard|discard (использовать TRIM или UNMAP для SSD и "тонких" логических томов), выполняются последовательно до ядра 4.13
- nouid32 (использовать 16-битные UID и GID для совместимости)
- noblock_validity|block_validity (дополнительные проверки для отладки)
- bh|nobh (привязывать "buffer heads" к страницам данных для гарантии упорядочивания;
отключать можно только для "data=writeback"; удалено?)
- dioread_lock|dioread_nolock (dioread_nolock позволяет не использовать inode mutex,
что увеличивает масштабируемость; не совместим с журналованием данных, только для файлов с экстентами)
- max_dir_size_kb=число (ограничить максимальный размер каталога)
- i_version (64-битный inode)
- nombcache (отключить использование mbcache для дедупликации расширенных атрибутов)
- prjquota (квотирование проектов)
Ускорение ext4 за счёт увеличения вероятности проблем, ключи монтирования:
- -o barriers=0 (по умолчанию, используются барьеры синхронизации в очереди запросов)
- -o data=writeback[,nobh] (можно получить мусор в открытых на момент сбоя файлах)
- -o stripe= (подобрать в соответствии с используемым RAID)
- -o commit=10 (по умолчанию делается sync каждые 5 секунд)
- -o journal_async_commit[,journal=update] (не ждать завершения записи журнала)
- -o max_batch_time=30000,min_batch_time=10000 (по умолчанию, параметры пакования запросов - 15000 и 0)
О поддержке реально больших разделов - комментарий от 19 июня 2014
Поддержку 128Т запилили. причем около года назад - до этого e2fsck корежил файлы за пределами 32T.
Режим over 128T пока не тестирован в e2fsprogs и ext4. честно.
Причем я знаю до сих пор места в e2fsprogs которые могут выстрелить при работе с дисками в 128Т и данные будут частично поехерены
Управление через файлы в /proc/fs/ext4/устройство и /sys/fs/ext4/устройство (
delayed_allocation_blocks (ro), inode_goal, inode_readahead_blks, lifetime_write_kbytes (ro),
max_writeback_mb_bump, mb_group_prealloc, mb_max_to_scan, mb_min_to_scan, mb_stream_req,
session_write_kbytes (ro)).
Доступ к файловой системе ext2/ext3/ext4 (?) для MS Windows 7 возможен с помощью
драйвера файловой системы ext2fsd.
Фрагментация под Linux: Настройка файловой системы Ext3.
Работа с квотами
- посмотреть (двоичные): quota -sg имя-группы
- посмотреть всё (десятичные): repquota [-g] файловая-система
- установить: setquota
- изменить: edquota
- включить: quotaon
Поиск файлов: locate. Создание базы данных для поиска: /etc/cron.daily/updatedb.cron
(в RH 6.2 /etc/cron.daily/slocate.cron). Добавить ключ "-l 0", что
слегка уменьшает безопасность, зато не надо переходить в root, чтобы найти
ВСЕ файлы. Добавить в список непросматриваемых директорий всякие squid-кеш
и inn-иерархии.
Очистка памяти от кеша страниц файлов:
sync
echo 3 > /proc/sys/vm/drop_caches
Планировщики запросов ввода/вывода
Запросы на чтение и запусь помещаются в очередь.
Имеется упреждающее чтение (blockdev --getra/--setra).
Запросы на чтение имеют больший приоритет.
Соседние запросы группируются вместе.
Адлгоритмы упорядочивания (планирования) запросов (/sys/block/sdX/queue/scheduler, /sys/block/sdX/queue/iosched/):
- cfq (completely fair queuing, абсолютно справедливая очередь), по умолчанию;
несколько подочередей (до 64), головные запросы из которых переносятся в общую очередь диспетчера;
не даёт одному процессу захватить все ресурсы
- quantum (количестве подочередей, обслуживаемых в каждрм кванте)
- queued (максимальный размер подочереди)
- deadline: для каждого запроса устанавливается крайний срок обслуживания, по достижению которого
он получает максимальный приоритет; для реального времени
- read_expire (крайний срок в милисекундах)
- write_expire
- fifo_batch (количество запросов в пакете, которые будут обслужены немедленно после достижения крайнего срока)
-
- writes_starved (приоритет чтения перед записью)
- front_merges (сколько запросов в начале очереди можно объединить)
- anticipatory: делается некоторая задержка перед выполнением запроса в предположении,
что следующий запрос будет в соседнюю область; противопоказан для СУБД)
- read_expire (крайний срок в милисекундах)
- write_expire
- read_batch_expire
- write_batch_expire
- antic_expire (величина задержки в милисекундах)
- noop: первый пришёл - первым обслужен, с учётом возможного слияния; рекомендуется для SSD и хороших RAID/SAN
Трассировка и проигрывание запросов ввода/вывода
blktrace (необходима debugfs - "mount -t debugfs debugfs /sys/kernel/debug"):
"blktrace -d /dev/mapper/system-root [-a queue] -w секунд -o - | blkparse -i -".
seekwatcher
Утилита fstrim позволяет сообщить блочному устройству о неиспользуемых блоках (для SSD и thin provision
swap
Linux позволяет использовать от 1 до 8 разделов диска (тип раздела - 0x82)
или файлов в качестве swap-области. Нельзя использовать файлы с "дыркамиЭ
и файлы на сетевых файловых системах (NFS, SMB/CIFS).
Максимальный размер раздела/файла для Intel-архитектуры - 2TB
(на каждый MB swap-области тратится 1KB ОЗУ).
Создание swap-области: mkswap
имя-файла-или-раздела (файл или раздел
требуемого размера надо создать заранее). Включение файла/раздела в работу:
swapon [-p приоритет ] имя-файла-или-раздела.
Приоритет может быть установлен от 0 до 32767 (больше число - выше приоритет).
Без указания этого параметра устанавливается отрицательный приоритет (для
каждой следующей swap-области ещё уменьшается).
В первую очередь используется место в swap-области с более высоким приоритетом.
Если существует несколько областей
с равным приоритетом, то обеспечивается балансировка нагрузки, так что
полезно разнести их по разным дискам/каналам.
Похоже, что в 2.6 при добавлении третьего раздела приоритеты не учитываются.
Прекратить использование области: swapoffимя-файла-или-раздела
(на больших заполненных разделах требует часов CPU).
Посмотреть, какие swap-области используются и как: swapon -s (или cat /proc/swaps).
Чтобы обеспечить автоматическое включение файла/раздела в работу при начальной
загрузке, надо занести в /etc/fstab строку:
имя-файла-или-раздела none swap pri=приоритет 0 0
(в /etc/rc.d/rc.sysinitвыдается команда swapon -a, надеюсь,
что после монтирование всех локальных файловых систем).
Переменная ядра /proc/sys/vm/swappiness позволяет управлять интенсивностью
перемещения давно неиспользуемых страниц процесса в swap: 0 - пытаться не помещать вовсе,
100 - помещать при первой возможности.
compcache -
создание блочного устройства в памяти (/dev/ramzswap0),
в котором будут храниться сжатые страницы для swap (несжимаемые страницы
переправляются на настоящий swap, для версии 0.6 требуется ядро 2.6.28):
- требуется пакет kernel-devel
- wget http://compcache.googlecode.com/files/compcache-0.5.tar.gz
- развернуть
- make # создаются модули ядра lzo1x_compress.ko, lzo1x_decompress.ko,
xvmalloc.ko и compcache.ko (параметр compcache_size_kbytes=КБ)
- установить модули по месту?
- загрузить модули из текущего каталога
- /sbin/insmod lzo1x_compress.ko
- /sbin/insmod lzo1x_decompress.ko
- /sbin/insmod xvmalloc.ko
- /sbin/insmod compcache.ko compcache_size_kbytes=КБ
- /sbin/udevadm settle # sleep 2
- /sbin/swapon /dev/ramzswap0 -p 100
- /proc/compcache (ошибки при переходе через 4GB?) и /proc/xvmalloc (?) содержат статистику
zram - наследник compcache (блочные устройства /dev/zramНомер в памяти, в которых будут храниться сжатые страницы для swap).
Модуль ядра 3.14 zram (параметр num_devices, по умолчанию - 1) обеспечивает блочное устройство /dev/zramНомер
для swap или файловой системы (iostat показывает одни нули). Ручки управления устройствами - /sys/class/zram-control/
(для добавления устройства прочитать /sys/class/zram-control/hot_add).
Ручки управления отдельным устройством в /sys/block/zramНомер (имеется вспомогательная утилита zramctl):
- max_comp_streams - количество потоков сжатия, установить до инициализации устройства (нет в CentOS6)
- comp_algorithm - алгоритм сжатия lzo или lz4 (не обнаружил, предпочёл бы zstd с возможностью указать уровень),
установить до инициализации устройства (нет в CentOS6)
- disksize - размер swap до сжатия, можно указывать суффиксы K, M и G; установить до инициализации устройства (в CentOS6 в байтах)
- mem_limit - максимальный размер используемой памяти (0 - без ограничений?), можно указывать суффиксы K, M и G;
можно изменять во время использования (нет в CentOS6)
- reset - сбросить устройство и уменьшить размер до 0
- alignment_offset, badblocks, bdi, capability, dev, discard_alignment, ext_range, holders, inflight, power, queue, range,
removable, ro, size, slave, stat, subsystem, trace, uevent - управление блочным устройством и его статистика
- compr_data_size (размер данных после сжатия), failed_reads, failed_writes, initstate (инициализировано или нет),
invalid_io (невыровненных запросов),
io_stat, mem_used_max, mem_used_total, mm_stat, notify_free, num_reads, num_writes,
orig_data_size (размер данных до сжатия), zero_pages (количество заполненных нулями страниц) -
статистика zram (переносится в stat и mm_stat и io_stat, см. blockdev/zram.txt и obsolete/sysfs-block-zram)
Тестирование на 3 numademo (CentOS 7.4, 2 сокета по 8 ядер (Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz), свободный сервер, lzo, 16 потоков) -
при переходе через край (3x86GB для 256GB) скорость падает с 5 или 8 GB/s до 3 GB/s, сразу за краем - до 1.1 GB/s, при превышении 10% - меньше 0.4GB/s
(терпения хватило на 40 минут). Увеличение числа устройств до 4 ничего не дало.
Тестирование моделирования netlist на сервере с 256ГБ (CentOS 7.4, 2 сокета по 8 ядер (Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz),
свободный сервер, сжатие swap в 3.2)
- требование 268ГБ - замедление на 0%
- требование 295ГБ - замедление на 0%
- требовании 322ГБ - замедление на 11% (трешинг чтения при старте, 94% cpu)
- требование 348ГБ - замедление в 1.2 раза (трешинг чтения при старте, 91% cpu)
- требование 375ГБ - замедление в 1.23 раза (трешинг чтения при старте, 89% cpu)
- требование 402ГБ - замедление в 1.34 раза (трешинг чтения при старте, 84% cpu)
- требовании 429ГБ - замедление в 1.39 раза (трешинг чтения при старте, 82% cpu)
[в CentOS 6] zabbix считает, что 99.99% всегда свободно
zswap - похожий проект (сжатые страницы для swap кешируются в памяти, при достижении границы размера пула декомпресируются?
и сбрасываются в swap, LRU, vm/zswap.txt). Встроенный в ядро 3.11 модуль. Управление через параметры модуля в /sys/module/zswap/parameters/
- zswap.enabled=1 при загрузке,
- zswap.compressor=lzo # deflate?
- zswap.zpool=zbud,
- zswap.max_pool_percent=20 можно менять динамически
Статистика и ручки управления в /sys/kernel/slab/zswap_entry/ (особенно shrink).
Статистика в /sys/kernel/debug/zswap/ (pool_total_size, written_back_pages).
Тестирование на 3 numademo (CentOS 7.4, 2 сокета по 8 ядер (Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz), свободный сервер, lzo, 20%) -
при переходе через край (3x86GB для 256GB) скорость падает с 5 или 8 GB/s до 0.9GB/s, сразу за краем - до 0.6GB/s, при превышении 10% - ?.
Тестирование моделирования netlist на сервере с 256ГБ (CentOS 7.4, 2 сокета по 8 ядер (Intel(R) Xeon(R) CPU E5-2667 v4 @ 3.20GHz), свободный сервер)
- требование 268ГБ - замедление на 0.5%
- требование 295ГБ - замедление на 6%
- требование 322ГБ - замедление на 16% (трешинг чтения при старте)
- требование 348ГБ - замедление на 33% (сильный трешинг чтения при старте, cpu всего 86.5%)
- при дальнейшем увеличении требований неожиданно вышели за ограничене пула в 50%
Управление виртуальной памятью: Linux выделяет виртуальную память в зависимости от установки
/proc/sys/vm/overcommit_memory (можно посмотреть в /proc/meminfo текущий предел (CommitLimit) и выделение (Committed_AS),
mmap в режиме read-only или приватный shared бесплатно;
shmfs также выделяется отсюда):
0 - используется неестественный интеллект при определении сколько виртуальной памяти можно выделить
(выделяется заведомо больше, чем есть реальной и swap в расчёте на то, что вся затребованная виртуальная
память использоваться не будет); root получает больше остальных
- 1 - выделять виртуальную память всегда, невзирая на последствия
- 2 - выделять виртуальной памяти не более, чем (размер swap + overcommit_ratio/100 * размер физической памяти);
по умолчанию, overcommit_ratio равен 50; overcommit_kbytes позволяет задать явное значение
Если ожидания по поводу неиспользования виртуальной не оправдались и закончились физическая память и swap,
то в действие вступает OOM killer (oom-killer), который убивает задачу с максимальным /proc/$$/oom_score.
Алгоритм подсчёта oom_score менялся со временем.
Первоначально (RHEL5) использовался неестественный интеллект (его поведением можно управлять с помощью /proc/$$/oom_adj,
которая принимает значения от -17 (не убивать этот процесс никогда) до 15 (убивать в первую очередь)).
Затем (RHEL6) алгоритм упростили до подсчёта занимаемой процессом доли ОП (от 0 до 1000) c вычитанием 30 для процессов пользователя root
и ручной настройкой с помощью /proc/$$/oom_score_adj (от -1000 до 1000), для совместимости сохранена переменная /proc/$$/oom_adj.
Если выбран процесс, у которого есть непосредственный подпроцесс с отдельным адресным пространством, то убивается он.
Переменная /proc/sys/vm/vfs_cache_pressure управляет кого удалять из кеша при недостатке памяти -
страницы файлов (cache) или inode/dentry (buffers): 100 - поровну,
0 - не вытеснять inode/dentry совсем (утекают всё-равно, система можен зависнуть под нагрузкой).
Кстати, 6.7 миллиона файлов занимают 10 ГБ памяти, а find ускоряется со 150 минут до 20 секунд.
Вместо убийства процесса oom-killer может устроить общую панику: "sysctl vm.panic_on_oom=1; sysctl kernel.panic=1".
Переменная /proc/sys/vm/admin_reserve_kbytes (RHEL6) определяет резерв (по умолчанию - 3% (8MB) от свободных страниц)
для пользователя с возможностями cap_sys_admin. Рекомендуется увеличить до 128MB.
Поиск сервера: nmblookup имя-NetBIOS
Поиск главного по группе: nmblookup -M имя-группы
Поиск самого главного: nmblookup -M -- -
Опрос списка ресурсов: smbclient -L s1108
Пробное подключение: smbclient //имя-NetBIOS/ресурс -U имя-пользователя
Добавление пользователя: smbpasswd -a
Трассировка обращений к файлам
(запись в файл - 'open|ok|w')
accton, sa, sar, ac, who, last.
Сервера и клиенты Internet
Приложения
Проблемы
Завершение зомби процессов
Завершенный процесс, который не смог сообщить о своём завершении родителю, переходит в состоянии зомби
(состояние процесса 'Z' по команде "ps -el"). Сигналы, включая "kill -9" на него не действуют
(он уже мёртвый). Необходимо как-то воздействовать на родительский процесс, например, завершить его.
Если родительский процесс находится в состоянии 'T', то можно попробовать снять его
программой "ltrace -t номер-процесса".
Если родительский процесс ожидает доступа к устройству, то обеспечить его.
Трассировка suid-программ
например, системные вызовы newgrp:
strace -D -f -o /tmp/newgrp.strace su -c "newgrp cds" - bog
Порталы, посвященные Linux:
Документация
- The Linux Documentation Project
- виртуальная энциклопедия
- Russian LDP
- ссылки на opennet.ru (400 kB)
- там же, но классифицированные
- команда man; обычно с помощью
команды man можно посмотреть описание консольных команд (например: man man);
язык задаётся переменной окружения LANG (например: LANG=ru_RU.UTF-8 man ls);
при просмотре используется команда less (в старых версиях more), так что доступны
все её возможности по навигации и поиску
- man -k (whatis): поиск команды по ключу (должна быть создана
поисковая база whatis: /etc/cron.weekly/makewhatis.cron)
- директория /usr/share/doc или /usr/doc (LDP, HOWTO, FAQ)
- CD с документацией из полного комплекта RedHat
- Получить список документации, связанный с конкретной командой можно
используя
rpm -qdfполное-имя-команды
- команда whereis выдаёт местонахождение программы и документации
- команда locate для поиска файла (необходимо убедиться, что БД поиска
ежедневно обновляется)
- команда info, программы из проекта GNU обычно описаны здесь подробнее, чем в man
Книги
- Daniel P. Bovet, Marco Cesati. Understanding the Linux Kernel, 3rd Edition. 2005. O'Reilly
(ядро 2.6.11)
|
Bog BOS: Linux с точки зрения системного администратора
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru