@ Карта сайта News Автора!

Bog BOS: Linux с точки зрения системного администратора

Linux Linux: дистрибутивы RPM yum Установщик Linux anaconda Загрузка Linux

Последние изменения:
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL
2024.10.22: sysadmin: Монтирование файловых систем: bind, shared и OverlayFS

Последнее изменение файла: 2024.11.15
Скопировано с www.bog.pp.ru: 2024.11.21

Bog BOS: Linux с точки зрения системного администратора


Ядро

Основой любого дистрибутива является ядро 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 - старая школа

  1. подготовить все необходимые пакеты (скачать и положить в локальную директорию)
  2. на всякий случай сделать загрузочный диск
  3. rpm -Uvh kernel-utils-xyz kernel-headers-xyz kernel-source-xyz
  4. rpm -ivh kernel-xyz [kernel-ibcs-xyz] [kernel-pcmcia-cs-xyz]
  5. сделать новый initrd (только если при загрузке потребуется драйвер, сделанный в виде модуля, современные rpm ядра делают это самостоятельно при установке)
  6. дополнить /etc/conf.modules (/etc/modules.conf)
  7. lilo -v или отредактировать /boot/grub/grub.conf (современные rpm ядра делают это самостоятельно при установке)
  8. перезагрузиться (shutdown -r now)

Обновление ядра из rpm с помощью yum - новая школа

  1. предполагается, что имеется свой или чей-нибудь ещё репозитарий yum для данного дистрибутива и клиент yum настроен на него
  2. yum update kernel*
  3. перезагрузиться (shutdown -r now)

Сборка ядра в CentOS7

  1. всё делаем в ~/rpmbuild под обычным пользователем
  2. mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
  3. echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
  4. поставить пакеты: 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
  5. скопировать SRC пакет с vault
  6. установить его (не под root-ом)
  7. cd ~/rpmbuild/SPECS
  8. rpmbuild -bp --target=$(uname -m) kernel.spec
  9. исходники распакованы в ~/rpmbuild/BUILD/kernel.../linux...

kdump позволяет сохранить содержимое памяти (/proc/vmcore) и dmesg при аварийном завершении работы ядра для последующего анализа.

Утилиты работы с модулями ядра module-init-tools (CentOS5 и 6)

Утилиты работы с модулями ядра module-init-tools обеспечивают автоматическую загрузку необходимых модулей ядра 2.6 и более нового. Сиволы "-" в именах и синонимов молчаливо заменяются на "_" и обратно при необходимости.

Утилита depmod создаёт описание зависимостей между модулями - какой сервис (symbols), требуемый одному модулю, обеспечивается другим модулем - читает модули в каталоге /lib/modules/версия-ядра, результат записывает в modules.dep в том же каталоге. Каталог /etc/depmod.d содержит конфигурационные файлы (depmod.conf), управляющие порядком просмотра модулей. Версию ядра и модуль можно указать явно в командной строке. Ключи:

Утилита modinfo выводит информацию об указанном модуле: имя файла (-n), лицензия (-l), описание (-d), автор (-a), от каких модулей зависит, версия, параметры (-p), синонимы. Можно указать версию ядра (-k) и разделение полей нулями (-0) вместо переводов строки.

Утилита lsmod выводит список загруженных модулей (/proc/modules), также выводит размер, счётчик использований и кем используется (к сожалению, только при использовании модулями).

Утилита insmod загружает указанный модуль. Можно явно указать имя файла и параметры. Ошибки необходимо смотреть с помощью dmesg (если не случилось "kernel panic").

Утилита rmmod выгружает указанный модуль. Ключи:

Утилита modprobe загружает и выгружает указанные модули с учётом зависимостей из modules.dep и настроек из /etc/modprobe.conf и /etc/modprobe.d/, а также из командной строки загрузки ядра в форме имя-модуля.опция. Ошибки необходимо смотреть с помощью dmesg (если не случилось "kernel panic"). Можно указать параметры модуля. Ключи:

Настройки modprobe берутся из файла /etc/modprobe.conf и файлов *.conf в каталоге /etc/modprobe.d/. Рекомендуется создавать отдельный файл для каждой ситуации дабы они не мешали друг другу. Каждая строка содержит команду, пустые строки и строки, начинающиеся с "#", являются комментариями. Символ "\" в конце строки является символом продолжения на следующей строке. Команды:

Утилиты работы с модулями ядра kmod (CentOS7)

Утилиты работы с модулями ядра 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), управляющие порядком просмотра модулей. Версию ядра и модуль можно указать явно в командной строке. Ключи:

Утилита modinfo выводит информацию об указанном модуле: имя файла (-n), лицензия (-l), описание (-d), автор (-a), от каких модулей зависит, версия, параметры (-p), синонимы. Можно указать версию ядра (-k) и разделение полей нулями (-0) вместо переводов строки.

Утилита lsmod выводит список загруженных модулей (/proc/modules), также выводит размер, счётчик использований и кем используется (к сожалению, только при использовании модулями).

Утилита insmod загружает указанный модуль. Можно явно указать имя файла и параметры. Ошибки необходимо смотреть с помощью dmesg (если не получилось "kernel panic").

Утилита rmmod выгружает указанный модуль. Ключи:

Утилита modprobe загружает и выгружает указанные модули с учётом зависимостей из modules.dep.bin и настроек из /etc/modprobe.conf и /etc/modprobe.d/*.conf (/lib/modprobe.d/*.conf, /run/modprobe.d/*.conf), а также из командной строки загрузки ядра в форме имя-модуля.опция и modprobe.blacklist=список-модулей. Ошибки необходимо смотреть с помощью dmesg (если не случилось "kernel panic"). Можно указать параметры модуля. Ключи:

Настройки modprobe берутся из файла /etc/modprobe.conf и файлов *.conf в каталогах /etc/modprobe.d/, /lib/modprobe.d/ и /run/modprobe.d/. Рекомендуется создавать отдельный файл для каждой ситуации дабы они не мешали друг другу. Каждая строка содержит команду, пустые строки и строки, начинающиеся с "#", являются комментариями. Символ "\" в конце строки является символом продолжения на следующей строке. Команды:

Подбор оборудования и управление им

Когда-нибудь наступят светлые дни, когда изготовители оборудования будут сначала писать драйверы под Linux, а потом уж под 20 версий MS Windows. Но сейчас перед покупкой "железа" необходимо предварительно проверить, есть ли под него драйверы для Linux. Крайне желательно, чтобы эти драйверы входили в состав дистрибутива (поставить драйвер самому можно - если он не требуется при установке дистрибутива - но Вы узнаете много нового и интересного). Для RedHat проверить наличие драйвера можно на сайте компании.

К сожалению, производители оборудования очень любят выпускать разные устройства под одним маркетинговым именем или одно и то же устройство под разными. Так что доверять чужому опыту надо осторожно. Рекомендуется поискать в телеконференциях как положительные, так и отрицательные отзывы.

Ссылки на списки оборудования, совместимого с Linux.

UEFI (переменные, настройка менеджера загрузки)

Процессоры

Память

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, Перевод: Капустин С.В.)

PCI и PCI-Express

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):

Попытка горячей замены SATA диска не удалась, хотя оборудование позволяет (и шасси, и материнская плата). То есть новый диск работает, но все параметры (в частности, размер) остаются от старого. Перепробовал:

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, где

Разделы

Linux может работать с таблицами разделов в формате MBR и GPT.

Работа с программным RAID и LVM.

Утилита badblocks из пакета e2fsprogs позволяет проверить диск на "плохие блоки" (не поддерживает устройства более 16 ТБ - CentOS 5.5).

Подготовка к эксплуатации диска с сектором 4 КБ

Форматирование НГМД

RAID

CD-R (CD-RW, DVD-R, DVD-RW)

Видеокарты на базе GPU NVIDIA: драйверы, TV-Out (nvtv), датчики (rivatv), TV-In, разгон (nvclock)

Мышки

Обязательно иметь мышь с тремя кнопками, иначе замучаешься тексты редактировать. Настройка: 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.

Сканеры

Ethernet

Платы видеозахвата и ТВ/FM тюнеры на базе Bt848/Bt878

Пульт ДУ

Модемы

многопортовая плата на базе Oxford Semiconducter OX16PCI

RPM: поиск, установка и управление пакетами программ

RPM: поиск, установка и управление пакетами программ


Установка дистрибутивов Red Hat

Примеры установок для различных версий и ситуаций (установщик anaconda):

Загрузка Linux: последовательность шагов, загрузчики, /etc/inittab


Зависимости пакетов от библиотек и средств программирования.

gnumeric -> guile -> umb-scheme

kernelcfg, netcfg -> tkinter -> tix, python

tix -> tk -> tcl

Tclx и itcl никем не используются.


Русификация

Особенности настройки различных версий Red Hat смотрите в примерах установок.

Документация

Консоль

Документация Предварительное замечание. ReHat заменила в 6.0 реализацию драйвера консоли kbd на console-tools (потом обратно ;), так что старые рекомендации по русификации консоли стали неприменимы. Рекомендации данные здесь неприменимы к старым системам. Если при установке RH 6.2 выбрать Russian/ru-yawerty, то все будет настроено само собой (в частности, устанавливается LANG=ru_RU.KOI8-R - очень прикольно смотрятся устаревшие переводы man-ов на русский).

Драйвер клавиатуры

Клавиатура генерирует сканкоды (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, слова в скобках - именами секций в соответствующих файлах):

Улучшения для правильного метода в RH 6.2. Ввод. Обманный 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.
  1. make mrproper (удалить весь мусор от предыдущей конфигурации). Если хочется сохранить предыдущую конфигурацию, то сказать: make dep; make clean.
  2. конфигурация ядра (не советую делать SCSI-драйвера модулями; увы приходится это делать, если надо писать на ATAPI CD-RW)
  3. make dep
  4. make bzImage (не надо слепо следовать устаревшей инструкции и делать make boot, он не влезет в загрузчик)
  5. make modules
  6. insmod loop до перемещения модулей, а то не найдет loop0
  7. удаляем совсем старую копию модулей (если она есть)

  8. rm -rf /lib/modules/2.2.5-22-old (нужен для mkinitrd)
  9. делаем текущий набор модулей старым

  10. mv /lib/modules/2.2.5-22 /lib/modules/2.2.5-22-old
  11. инсталируем новый набор модулей (в /lib/modules/2.2.5-22)

  12. make modules_install
  13. если все-таки сделал 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, а теперь его убрал или включил в ядро.
  14. копируем получившийся arch/i386/boot/bzImage в /boot/bzImage.new (переименовав старый, если надо)
  15. копируем получившийся System.map в /boot/System.map (переименовав старый?), klogd сначала пытается смотреть в /boot/System.map; если версия ядра не совпадает, то в /System.map, а если и там не совпадает, то в /usr/src/linux/System.map
  16. добавляем новую секцию в /etc/lilo.conf со ссылками на новое ядро и м.б. initrd (обязательно сохранив возможность загрузки старого ядра, System.map, modules?, где взять module-info для нового ядра?)
  17. /sbin/lilo -v
  18. перезагружаемся - DMA все-равно приходится включать вручную через hdparm, ибо не любит он WD :(
  19. /usr/src/linux занимает теперь 70МБ (RH 6.2 - 80 MB, RH 7.0 - 106 MB)
  20. скомпилированный emu10k1 не грузится, приходится брать модуль из дистрибутива

Создание initramfs для последующей загрузки

mkinitrd

dracut

linuxconf

источник

Поддерживает различные интерфейсы с пользователем:

Общие ощущения, как от 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!

Ключи:

отдельные утилиты


Настройка TCP/IP и сетевой экран

Настройка 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)).

Сетевой экран и NAT (Network Address Translation, masquerading)

Документация:

Сетевой экран реализован в различных версиях Linux следующими средствами:

PPP

Документация

Ядро должно быть сконфигурировано с поддержкой 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-доступа в интернет :( Так что я сделал так:

X11

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)

Печать

Ссылки:

Пакеты printtool, rhs-printfilters и lpr обеспечивают вполне сносные средства для настройки и печати. Установка сетевого принтера.

Печать буклетов по 4 страницы на лист (по 8 на двух сторонах):


Процессы, потоки и сигналы

При создании процесса он получает 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):

Обработка сигнала может вклиниваться в обработку системного вызова и библиотечной функции. После обработки сигнала системный вызов может начать обработку с начала или вызвать ошибку EINTR (выбор см. sigaction.2 SA_RESTART и кровавые подробности в signal.7 и signal-safety.7). EINTR может возникать при остановке и возобновлении процесса для небольшого количества системных вызовов и библиотечных функций (работа с сокетами, семафорами, futex).

Утилита kill (не путать с командой оболочки kill) посылает указанный сигнал (по умолчанию TERM) указанным по PID или имени процессам или группам процессов. Можно указать идентификатор потока, но сигнал всё равно будет послан процессу (первому попавшемося потоку этого процесса, не заблокировавшему сигнал). Процесс 0 - это все процессы текущей группы. Процесс -1 - это все процессы, кроме PID1. Процесс -число - это группа процессов с лидером "число". Ключи:


Пользователи и группы

Каждый процесс ассоциируется с пользователем (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!) и т.п.; каждая строка содержит имя параметры, пробел и значение; параметры:

/etc/shells (shells.5) определяет список допустимых оболочек.

Утилиты:


Возможности (capabilities)

Когда-то давно в целях проверки прав (авторизация) процессы делились на 2 категории: процессы с euid 0, которым разрешалось всё без дальнейшей проверки, и процессы с euid не равным 0, права которых проверялись исходя из euid, egid и дополнительных групп.

Сейчас права суперпользователя (euid 0) разделяются на возможности (capabilities). Наличие определённой возможности у потока даёт право на соответствующие действия:

Для каждого потока устанавливается 3 набора возможностей, которые наследуются при fork и которые можно посмотреть в /proc/идентификатор-процесса/task/идентификатор-потока/status (/proc/идентификатор-процесса/status для главного потока процесса):

Выражения списка возможностей составляются из групп возможностей через пробел, группа состоит из списка имён возможностей через запятую, знака операции ("+" (добавить), "=" (установить) через пробел) и символа набора (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 вычисляются как результат побитовых операций для несуперпользователя:

Новые значения наборов при использовании библиотеки libcap:

К этому безобразию (интересно - понимают ли сами авторы понатворённое? заплаточники!) добавляются флаги (биты) безопасности для потока (в формате Verilog ;), ограничивающие права суперпользователя (PR_SET_SECUREBITS и PR_GET_SECUREBITS в 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, то разрешённый набор копируется в эффективный; и др.).

Утилиты:

В двух словах о привилегиях Linux (capabilities)


Файловые системы

Список поддерживаемых типов файловых систем можно получить из файла /proc/filesystems (не забудьте подгрузить модуль из /usr/lib/modules/версия-ядра/kernel/fs/):


Монтирование файловой системы

Перед использованием файловой системы её необходимо смонтировать - подсоединить дерево файлов подключаемой файловой системы на место указанного каталога текущей файловой системы (содержимое каталога становится недоступным; владелец и права доступа устанавливает mount исходя из параметров) - точку монтирования, образуя единое дерево: "mount блочное-устройство каталог". Если устройство или каталог не указаны, то mount извлекает их из /etc/fstab. Файловая система может быть смонтирована несколько раз, возможно в тот же самый каталог, под ответственность пользователя. Сетевая файловая система NFS использует сетевое имя вместо имени устройства. Специальные файловые системы (например, proc) используют всякое вместо имени устройства. mount без параметров выдаёт список смонтированных файловых систем (ключ "-l" добавляет в вывод метки томов).

Типы точек монтирования определяют связи между ними (sharedsubtree.txt) при распространении (propagation) сообщений о событиях монтирования под ними:

Сообщения о событиях с самой точкой монтирования определяется типом родительской точки монтирования. Если родительская точка монтирования не shared, то умолчанию точка монтирования получает тип private (systemd переделывает корень в shared, а unshare - всех в private).

Ключи mount:

Универсальные опции (VFS-OPTION):

Вместо блочного устройства можно указывать обычный файл c использованием опции "-o loop[=устройство-типа-петля]", обычно /dev/loopНОМЕР (будет создано автоматически или взято первое свободное). Утилита losetup позволяет работать с устройствами типа петля, ключи:

Файл /etc/fstab содержит описания файловых систем, к которому команды mount и umount обращаются при отсутствии указания устройства или точки монтирования. Описания расположены построчно в последовательном порядке. Комментарии начинаются с символа "#". Поля в строке разделяются пробелами или табуляциями:

  1. источник (source): блочное устройство или удалённая файловая система или LABEL=метка-файловой-системы или UUID=уникальный-идентификатор-файловой-системы или PARTLABEL=метка-раздела или PARTUUID=уникальный-идентификатор-раздела
  2. точка монтирования (target): каталог в существующей файловой системе или none (для swap)
  3. список типов и подтипов файловой системы или swap или none (для --bind или --move)
  4. список опций
  5. частота вызова dump
  6. очерёдность запуска 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) выдаётся подробная информация и статистика использования.

Переменные окружения:

Размонтирование (отсоединение файловой системы из иерархии файловых систем, удаление точки монтирования) осуществляется командой umount. В качестве параметров можно использовать как имя какталога, так и имя блочного устройства. Нельзя размонтировать используемую файловую систему, например, сам umount может использовать libc, который открывает файл locale на размонтируемой файловой системе. Размонтирование леса точек монтирования - см. таблицу 5c в sharedsubtree.txt. Ключи:

Возможные препятствия к размонтированию (можно использовать ключ "-f" или "-l"):

Утилита findmnt выводит дерево смонтированных файловых систем или ищет [несмонтированную] файловую систему. Ключи:

Утилита fusermount монтирует и размонтирует файловую систему FUSE (Filesystem in Userspace). Ключи:

Утилита guestmount позволяет смонтировать гостевую файловую систему (файловую систему виртуальной машины и почие образы) с помощью FUSE. Права суперпользователя не требуются (д.б. владельцем точки монтирования). Смонтированная файловая система не видна другим пользователям по умолчанию. Ключи (guestfish.1):

Утилита 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 будет возможно только чтение):

Параметры модуля ядра overlay:

Использование 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 являются:

Файловая система POSIX представляет собой единую иерархию файлов и содержащих файлы каталогов от корня ("/"). Иерархия может изменяться с помощью монтирования дополнительных поддеревьев в точку монтирования и демонтирования. Каждый файл и каталог имеют непустое имя (имеется ограничение по длине) внутри содержащего его каталога и абсолютное (полное) имя - путь от корня.

Каждый каталог имеет виртуальные файлы "." (текущий каталог) и ".." (родительский каталог). "/.." - это тоже самое, что "/." и "/". Если путь завершается '/', то к нему молчаливо добавляется ".".

inode в ОП содержит информацию (не содержит имя файла):

Типы файлов:

Права (простые, обычные) доступа к файлу в основе состоят из 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)!

Основные утилиты работы с файлами:

В файловой системе ext4 (XFS, btrfs, частично zfs) обычные файлы и каталоги (inode) имеют следующие атрибуты (флаги) файлов (изменить - chattr [-R] [-v версия] [-V] режим имя-файла; посмотреть - lsattr, ключи: -R - обойти рекурсивно, -a - выводить файлы, имя которых начинается на '.', -d - выводить атрибуты каталога, а не его содержимого, -l - выводить длинные имена атрибутов, -v - номер версии файла (что это)):

Кроме обычных атрибутов и флагов некоторые типы файловых систем (ext4, btrfs, xfs, zfs) поддерживают расширенные атрибуты (xattr), представляющие собой набор пар имя:значение, привязанных к файлу (inode). Значение может быть пустым. Используются для реализации SELinux, возможностей, OverlayFS, ACL и прочего в будущем. Имя атрибута (ASCII? до 255 байт) - это строка, которая состоит из имени пространства, точки и имени атрибута (может содержать '.'), завершается '\0' ("security.selinux\0"). Значение - произвольный набор байт (?), не более 64 КиБ. Файловые системы могут накладывать свои ограничения, например, в ext4 все расширенные атрибуты должны поместиться в блок (4096 байт), в btrfs - в nodesize (по умолчанию - 16 КиБ). Используются следующие пространства:

Утилиты для работы с расширенными атрибутами

Простые права доступа к файлам могут быть дополнены обработкой ACL (Access Control Lists) исходя из POSIX 1003.1e. При всех изменениях простых прав и ACL система поддерживает соответствие между ними. ACL делятся на ACL доступа (access) для любых файлов и ACL умолчаний (default) для каталогов (определяют права доступа к файлам внутри каталога, если права не назначены явно с помощью ACL, и используются при создании файла). Каждый ACL состоит из набора элементов, которые определяют права пользователей и групп пользователей на чтение, запись и выполнение (проход для каталогов). Элемент состоит из типа (user, group, other, mask), квалификатора (имя пользователя, uid или имя группы, gid) и списка разрешений ('rwx', отсутствующие права заменяются символом '-'), разделённых ':'. Типы:

Утилиты для работы с ACL:


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 в иерархии. Создание подкаталога создаёт группу, удаление - удаляет (не должно быть подгрупп и незомбированных процессов). Каталоги содержат общие следующие файлы:

Утилиты (пакет libcgroup-tools):

Сервисы systemd: cgconfig.service (в самом начале загрузки запускат "cgconfigparser -l /etc/cgconfig.conf"), cgred.service (запускает cgrulesengd).

Настройки libcgroup:

Контроллеры (см. /proc/cgroups; можно группировать контроллеры, например, "cpu,cpuacct"):


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 процесс может писать в группу (а кто контролирует?). Каталоги групп содержат каталоги подгрупп (ответственность за коллизии несёт пользователь) следующие общие файлы:

Модели распределения ресурсов:

Контроллеры: (см. /proc/cgroups):

Механизм пространства имён позволяет установить новый корень cgroup (unshare(2)). Процесс может смонтировать cgroup2 в неначальном пространстве имён, если у него есть полномочия CAP_SYS_ADMIN в его пользовательском пространстве имён (user) и пространстве монтирования (mnt), рекомендуется для лучшей изоляции.


Пространства имён (namespaces)

Пространства имён (namespaces) - механизм ядра Linux, обеспечивающий изоляцию процессов в некоторых аспектах (типах пространства). Используется системами контейнеризации, systemd. Каждый процесс принадлежит ровно одному пространству имён каждого типа. Изначально существует ровно по 1 пространству имён каждого типа. Создание пространств имён (кроме пространства имён пользователей) требует прав CAP_SYS_ADMIN (зато права CAP_SYS_ADMIN в целевом пространстве требуются для изменения пространства имён пользователей для процесса). Недостаточная изначальная продуманность и последующее применение напильника и изоленты для заделывания дыр в безопасности привели к очень сложным и неочевидным правилам работы. Ждём namespaces v2. Базируется на системных вызовах:

Каталог /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, ключи:

Утилита unshare позволяет запустить команду с параметрами (по умолчанию /bin/sh) в пространстве имён, отделённом от родительского, ключи:

Из интересного:

$ 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, пользователь, команда). Ключи:

/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. Каждая строка содержит поля через ':':

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)

Возможности могут настраиваться в файле /etc/mke2fs.conf. Секции:

Настройка параметров файловой системы ext2fs производится с помощью утилиты tune2fs (не умеет добавлять свойство 64bit - необходимо для раздела размером более 16 ТиБ). Использование с ключом "-l" позволяет узнать текущие параметры, в частности:

Размер файловой системы 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 КБ, можно опустить). Ключи:

Утилита 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 для существующей файловой системы установить нельзя; совместимость только снизу вверх!):

В ext4 изменён алгоритм выделения блоков: маленькие запросы (менее /sys/fs/ext4/раздел/mb_stream_req, 16 = 64KiB) группируют мелкие файлы вместе (per-CPU), большие - куском (per-inode). Прочие параметры:

При заполнении файловой системы на 97% начались тормоза при создании файлов (в 3-4 раза), при запуске "rm -rf" скорость восстановилась, хотя заполненность продолжала превышать 98%.

Пакет e4fsprogs содержит утилиты

Отличия версий (RHEL 5.11 - 1.41.12; RHEL 6.8 - 1.41.12; RHEL 7.9 - 1.42.9; UEK6/u3 - 1.45.4):

Сборка e4fsprogs (1.42.8, 1.42.10, 1.43.1, 1.43.3, 1.43.4, 1.46.5):

Аттрибуты (chattr, lsattr):

Опции mount для ext2, ext3 и ext4 (см. ext4(5) или /usr/share/doc/kernel-doc-*/Documentation/filesystems/ext4.txt, умолчания берутся из суперблока (tune2fs), стандартные опции описаны в документации по команде mount(8))

Дополнительные опции mount для ext3 и ext4:

Дополнительные опции mount для ext4:

Ускорение ext4 за счёт увеличения вероятности проблем, ключи монтирования:

О поддержке реально больших разделов - комментарий от 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.

Работа с квотами

Поиск файлов: 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/):

Трассировка и проигрывание запросов ввода/вывода

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):

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):

Тестирование на 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)

[в CentOS 6] zabbix считает, что 99.99% всегда свободно

zswap - похожий проект (сжатые страницы для swap кешируются в памяти, при достижении границы размера пула декомпресируются? и сбрасываются в swap, LRU, vm/zswap.txt). Встроенный в ядро 3.11 модуль. Управление через параметры модуля в /sys/module/zswap/parameters/

Статистика и ручки управления в /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), свободный сервер)

Управление виртуальной памятью: Linux выделяет виртуальную память в зависимости от установки /proc/sys/vm/overcommit_memory (можно посмотреть в /proc/meminfo текущий предел (CommitLimit) и выделение (Committed_AS), mmap в режиме read-only или приватный shared бесплатно; shmfs также выделяется отсюда):

Если ожидания по поводу неиспользования виртуальной не оправдались и закончились физическая память и 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.


RPC


NFS


SAMBA

Поиск сервера: nmblookup имя-NetBIOS

Поиск главного по группе: nmblookup -M имя-группы

Поиск самого главного: nmblookup -M -- -

Опрос списка ресурсов: smbclient -L s1108

Пробное подключение: smbclient //имя-NetBIOS/ресурс -U имя-пользователя

Добавление пользователя: smbpasswd -a

Трассировка обращений к файлам (запись в файл - 'open|ok|w')


am-utils или amd (автоматическое монтирование файловых систем)

autofs (автоматическое монтирование файловых систем)

Сбор статистики

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:

Документация

Книги

@ Карта сайта News Автора!

Bog BOS: Linux с точки зрения системного администратора

Linux Linux: дистрибутивы RPM yum Установщик Linux anaconda Загрузка Linux

Последние изменения:
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL
2024.10.22: sysadmin: Монтирование файловых систем: bind, shared и OverlayFS



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru