Основой любого дистрибутива является ядро 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, то ещё не всё потеряно... С другой стороны
многие "заплатки" улучшающие официальное ядро, неприменимы к ядрам из дистрибутива.
Времена, когда приходилось самостоятельно устанавливать
новое "свежеиспеченное" ядро, надеюсь уже прошли. Сейчас лучше положиться
на составителя дистрибутива. Однако, необходимость быть в курсе грядущих
изменений осталась.
сделать новый initrd (только если при загрузке потребуется драйвер, сделанный в
виде модуля, современные rpm ядра делают это самостоятельно при установке)
дополнить /etc/conf.modules (/etc/modules.conf)
lilo -v или отредактировать /boot/grub/grub.conf
(современные rpm ядра делают это самостоятельно при установке)
Когда-нибудь наступят светлые дни, когда изготовители
оборудования будут сначала писать драйверы под 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, а их там немного.
Конфигурация и получение информации о ATA дисках: hdparm и
dmraid.
Для нормальных устройств рекомендуется:
hdparm -c 1 -d 1 -m 16 # включить 32-битный режим, использование
DMA, обмен по 16 секторов
Получение информации от SMART (Self Monitoring, Analysis and Reporting
Technology)
smartsuite
(версия 2.1 включена в состав RH 8.0 в пакет kernel-utils: smartctl и smartd)
Попытка горячей замены SATA диска не удалась, хотя оборудование позволяет
(и шасси, и
материнская плата).
То есть новый диск работает, но все параметры (в частности, размер) остаются от старого.
Перепробовал:
Если драйвер конкретного 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 - номера логических разделов)
Обязательно иметь мышь с тремя кнопками, иначе замучаешься тексты редактировать.
Настройка: 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.
Модуль называется pcspkr (какой-то добрый человек поместил его в раздел input).
Если хотите услышать звук по ^G, то поместите его загрузку в /etc/rc.local.
Прежде всего необходимо скачать выбранные ISO-образы CD или DVD (ISO образы с исходными текстами
для работы не нужны), проверить контрольные суммы (можно использовать checkisomd5
из пакета anaconda-runtime, который проверяет встроенную в ISO контрольную сумму, или md5sum/sha1sum
и дополнительный файл с сайта производителя) и записать на болванки
Может оказаться полезным изготовить DVD ISO-образа из нескольких CD ISO-образов,
чтобы не работать диск жокеем при установке (похоже. что Fedora 7 не поместится на один DVD ;).
Кстати, покупка комплекта в ближайшем ларьке может обойтись гораздо дешевле (но MD5 все равно надо сравнить!).
Затем рекомендуется скопировать накопившиеся изменения к дистрибутиву.
К моменту выпуска следующей версии дистрибутива объём изменений может сравняться с объёмом самого дистрибутива.
При исправлении ошибок основной дистрибутив не изменяется, а просто добавляются
файлы в директорию update, т.е. при установке приходится сначала устанавливать
плохо работающий дистрибутив, а затем вручную вносить изменения (а это
иногда сотни мегабайт!). Иногда Red Hat делает называемый "respin", т.е.
обновленный дистрибутив, но там изменяется только программа установки,
а обновленные пакеты все равно надо качать самому. Изменения в программе установки доступны также
в виде флоппи образов (update.img), которые можно "подсунуть" в момент установки.
В версии Fedora Core 6 репозитарий изменений (fedora-updates) можно подключить в процессе
установки (не пробовал, но говорят, что часто падает).
Примеры установок (58 штук) для различных версий и ситуаций (установщик anaconda):
пакет 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, кроме символов
над цифрами)
Можно keymap/xfree86 (секция ru) поменять en_US(pc105)+ru на ru(winkeys),
чтобы в русском режиме вводились символы как на наклейках над цифрами.
на моей клавиатуре оказались "лишние" кнопки с окошками, которые я приспособил
для постоянного включения/выключения русского режима. В файле /usr/X11R6/lib/X11/xkb/symbols/ru
добавил определение для левой кнопки с окошком:
переделать файл /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)
инсталируем новый набор модулей (в /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 не грузится, приходится брать модуль из дистрибутива
Поддерживает различные интерфейсы с пользователем:
командная строка
а/ц окна
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
] (поднять/опустить/сбросить сервис на указанном уровне)
Для проверки настройки сети можно воспользоваться утилитами ping, traceroute и nmap.
Кстати, ping позволяет собирать часть маршрута, по которому прошёл пакет (-R)
и этот маршрут не совпадает с маршрутом от traceroute.
Полезными инструментами для изучения происходящего в сети являются программы
"аутопсии" пакетов tcpdump и ethereal (wireshark?).
Ядро должно быть сконфигурировано с поддержкой 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 (названия условны):
Начинается все со 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" выдаёт список, но соединяет только с собой;
установка русского языка для сеанса недопустима; завершить сеанс невозможно)
VNC
Пакеты vnc и vnc-server (realvnc) обеспечивают возможность просмотра и создания удалённого рабочего стола.
Создание удалённого рабочего стола: зайти ssh на удалённый хост, отредактировать по вкусу $HOME/.vnc/xstartup
и создать удалённый рабочий стол командой "vncserver [:номер-сеанса] -geometry ШиринаxВысота -depth 24"
(запускается виртуальный X сервер, при первом запуске запрашивается пароль и запоминается в $HOME/.vnc/passwd).
Подключение к ранее созданному рабочему столу: "vncviewer адрес::номер-сеанса -FullColor".
Отключение от удалённого стола не разрушает его - виртуальный X сервер и все его клиенты продолжают работать.
Можно иметь несколько одновременных подключений к одному и тому же удалённому столу.
Пакет vino обеспечивает встроенный в Gnome VNC сервер (настроить удалённый рабочий стол в настройках сети, порт 5900).
Пакет vinagre обеспечивает VNC клиент для Gnome.
Менеджеры окон
Рабочий стол
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)
Создание и редактирование таблицы разделов в формате MBR производится интерактивной утилитой
fdisk /dev/hda (подставить требуемое имя диска)
Раздел надо создавать в той ОС, которая будет с ним работать. Например,
MS Windows не любит разделов не на границе цилиндра. Переключение
режима работы с большими дисками (LBA/Large/Auto) меняет размер цилиндра.
Так что после смены режима надо заново разбивать диск.
Таблицу разделов типа MBR (Master boot Record) нельзя создать для устройства более 2ТБ,
а формат таблицы разделов типа GPT (GUID - Globally Unique IDentifier - Partition Table) утилитой fdisk не поддерживается.
Загрузчик LILO не умет работать с GPT. GRUB2 (и GRUB 0.97 с заплатками) умеет грузиться с GPT.
GPT хранит информацию о 128 разделах (каждый раздел идентифицируется уникальным GUID и может иметь имя)
с адресами в формате LBA в 2 экземплярах с контрольными суммами.
Первый сектор диска содержит фиктивную MBR, описывающую 1 раздел типа EFI GPT.
Утилита parted позволяет создавать, удалять, копировать, перемещать и изменять разделы в форматах
msdos, gpt, loop, sun, mac, bsd и pc98, а также файловые системы на них
(ext2, ext3, fat16, fat32, linux-swap) в интерактивном и пакетном режимах.
Единицы измерения могут задаваться суффиксом параметра или командой "unit"
(отрицательное число - отсчитывается от конца диска, например "-1s" - это последний сектор):
s - сектор
cyl - цилиндр (в геометрии BIOS, нельзя задавать как суффикс)
chs - цилиндр,головка,сектор (в геометрии BIOS, нельзя задавать как суффикс)
%
B - байт
kB или K (10^3)
MB или M (10^6)
GB или G (10^9)
TB или T (10^12)
Интерактивный режим:
parted устройство (например, /dev/sda)
Пакетный режим:
parted устройство команда [опции] [команда опции]
Команды:
check номер-раздела (проверить файловую систему на разделе)
mkpart [primary | extended | logical] [тип-файловой-системы] начало конец (создать раздел,
тип файловой системы: ext3, ext2, fat32, fat16, hfsx, hfs+, hfs, jfs, linux-swap,
ntfs, reiserfs, hp-ufs, sun-ufs, xfs; где lvm?)
mkpartfs {primary | extended | logical} тип-файловой-системы начало конец
(создать раздел и файловую систему: ext2, fat16, fat32, linux-swap)
move номер-раздела начало конец (передвинуть раздел с файловой системой,
старое и новое место не могут пересекаться)
name номер-раздела имя-раздела (задать имя раздела для таблиц разделов в форматах
GPT, Mac, PC98; можно использовать апострофы для задания строки с пробелами)
print [номер-раздела | all | free] (вывести информацию о диске, разделе,
всех дисках или свободном месте)
quit (изменения могут вноситься немедленно, но ОС узнаёт о них только по команде "quit")
rescue начало конец (если parted находит следы пропавшего раздела по указанному адресу,
то она пытается его восстановить)
resize номер-раздела начало конец (изменение размера раздела вместе с файловой системой:
ext2/ext3 - начало раздела менять нельзя; fat16; fat32;
hfs/hfs+/hfsx - начало раздела менять нельзя, размер можно только уменьшать;
linux-swap; разделы с непонятным содержимым - PV для LVM - менять отказывается,
остаётся только удалить и создать заново, надеясь ничего не порушить, или
создавать второй раздел рядом и клеить lvm2)
rm номер-раздела (при удалении логического раздела в таблице формата msdos,
последующие разделы будут перенумерованы)
select устройство (сменить блочное устройство для последующих команд)
set номер-раздела имя-флага {on | off} (флаги:
boot (загрузочный раздел)
lba (логическая адресация; в пределах одного раздела?)
hidden (скрывать от MS Windows)
raid (программный RAID, только для формата msdos и gdt)
LVM (только для формата msdos и gdt)
unit единица-измерения
Создание разделов более 2ТБ:
mklabel gpt
mkpart primary ext3 0 -1s # на весь диск
Увеличение раздела
unit cyl
print
resize номер-раздела начало конец
Еще программы редактирования таблицы разделов: cfdisk, sfdisk (GPT не поддерживается), gdisk (GPT fdisk).
Проверка и исправление файловой системы ext2fs/ext3fs: e2fsck -v -C 0 имя-устройства.
Для насильственной проверки "как бы" хорошей файловой системы надо использовать ключ -f.
Для запрета проигрывания журнала перед проверкой необходимо отключить журнал командой
"tune2fs -O ^has_journal имя-устройства".
Утилита resize2fs (появилась в CentOS 4.2) позволяет уменьшить
(после этого необходимо уменьшить раздел) или увеличить
(предварительно необходимо увеличить раздел) размер несмонтированной файловой системы.
Утилита ext2online позволяет увеличить размер ext2 (ext3) без размонтирования.
Возможности ext2online были добавлены в последние версии resize2fs.
описание 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),
другие утилиты (resize2fs) - ещё нет; желательно ядро 3.2)
(ветка 64-bit),
а размер файлов - 2 TiB (16TiB)
введение экстентов (до 128MB, 4 экстента непосредственно в inode)
позволяет ускорить удаление очень больших файлов и уменьшить фрагментацию
задержка выделения блоков до реальной записи из кеша на диск позволяется выделять блоки непрерывными групппами
предварительное выделение места под файл без физического заполнения его нулями ускоряет процесс
журнал в будущем может иметь контрольную сумму (позволяет ускорить работу с журналом на 20%)
в будущем дефрагментирование без размонтирования (ожидается e4defrag) - добавлена в e2fsprogs 1.42
ускорение fsck на незаполненных файловых системах (по количеству inode) после первого запуска
предполагается реализация в будущем восстановление удалённых файлов
увеличение точности времён создания, модификация и обращения к файлу с секунды до наносекунды
введение номера версии файла (увеличивается на 1 при каждом изменении)
место под inode увеличено по умолчанию со 128 байт до 256 байт,
зато сюда поместились расширенные аттрибуты (ускорение доступа в 3-7 раз)
отключение барьерной синхронизации записи данных и журнала (включена по умолчанию): "mount -o barrier=0"
загрузка с ext4 работает начиная с F12
filefrag и e2freefrag
кластеризация при выделении блоков (bigalloc): размер кластера - степень двойки числа блоков,
затраты на учёт кластеров значительно меньше затрат на учёт блоков, но затраты на хвосты увеличиваются
При заполнении файловой системы на 97% начались тормоза при создании файлов (в 3-4 раза),
при запуске "rm -rf" скорость восстановилась, хотя заполненность продолжала превышать 98%.
Пакет e4fsprogs содержит утилиты
(на 1 января 2012 - 1.42; в RHEL 5.7 - 1.41.12; в RHEL 6.2 - 1.41.12)
создания файловой системы:
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
Опции mount для ext4
ro (при этом журнал проигрывается и запись делается!)
noload (не проигрывать журнал)
journal_checksum
journal_async_commit (не дожидаться завершения записи в журнал)
journal=update (преобразовать журнал в новый формат)
journal_dev=внешний-журнал
data={ordered|journal|writeback} (данные пишутся до метаданных, данные журналируются, порядок записи не отслеживается)
commit=секунд (5; интервал между sync; для увеличения производительности увеличить)
barrier|nobarrier (использовать барьеры для упорядочивания запросов записи;
для дисков без кеша записи или с батарейкой можно отключить, что увеличит производительность)
inode_readahead=32
orlov (новый алгоритм выделения блоков)
oldalloc (старый алгоритм выделения блоков)
user_xattr|nouser_xattr
acl|noacl
reservation|noreservation (?)
bsddf|minixdf
debug
errors={continue|remount-ro|panic}
data_err={ignore|abort}
nogrpid|sysvgroups|grpid|bsdgroups (создавать новый файл с группой процесса или каталога)
resuid=идентификатор и resgid=идентификатор (кому выдавать зарезервированное место)
sb=адрес (адрес суперблока)
quota|noquota (считать квоту по пользователям)
grpquota|usrquota (считать квоту по группам)
bh|nobh (привязывать "buffer heads" к страницам данных для гарантии упорядочивания;
отключать можно только для "data=writeback")
stripe=блоков-файловой-системы (используется алгоритмом выделения блоков для выравнивания)
delalloc|nodelalloc (отложенное до момента записи выделение блоков)
max_batch_time=микросекунд (15000; максимальное время ожидания следующего запроса
при склейке запросов синхронной записи)
min_batch_time=микросекунд (0; увеличение улучшает пропускную способность многопотоковой синхронной записи
за счёт увеличения задержек)
journal_ioprio=приоритет (3; от 0 - высший - до 7; обычный ввод-выод имеет приоритет 4)
auto_da_alloc|noauto_da_alloc (борьба с обнулением файлов после аварийного отключения)
Ускорение 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)
Заплатки для создания ext4 более 16 ТБ лежат без движения с 2009 года с комментариями автора
по поводу процедуры работы над ядром.
Доступ к файловой системе ext2/ext3/ext4 (?) для MS Windows 7 возможен с помощью
драйвера файловой системы ext2fsd.
Журналируемая файловая системаxfs
позволяет использовать блочные устройства размером более 16ТБ (пакеты xfsprogs и xfsdump),
первоначально была разработана для SGI IRIX, поддерживает расширенные атрибуты файлов, выделение места экстентами.
состоит из секций данных (содержит метаданные и может содержать журнал), журнала и секции для работы в реальном времени
секция данных делится на равные группы блоков (allocation groups),
количество которых определяет уровень параллелизма при выделении места; каждая группа содержит суперблок,
управление свободным пространством группы, таблицу inode (создаются по потребности), данные
размер блока в Linux - 4 КБ
выделение места происходит экстентами (до 8 GiB)
не подходит для хранения большого количества мелких файлов (почтовый сервер) - медленно работает с метаданными
открытые в момент неожиданного выключения компьютера файлы будут заполнены нулями
мгновенное создание и расширение файловой системы при нулевых накладных расходах (у ext4 - 1.5%, т.е. 269GB для 16ТБ)
и примерно сравнимых с ext4 накладных расходах при хранении файлов
(на 0.07% меньше для набора в 10TB из 10 миллионов файлов
ключи утилиты создания файловой системы mkfs.xfs:
-L метка-файловой-системы
-d su=размер-страйпа-RAID,sw=число-страйпов-RAID # можно указывать единицы объёма: k, m, g
-d agcount=число-групп-блоков
-d agsize=размер-группы-блоков # от 16 MiB до 1 TiB; можно указывать единицы объёма: k, m, g
-d unwritten=1 # помечать незаписанные экстенты, увеличивает безопасность (не даёт пользователям читать
захваченные, но ещё не записанные части файлов), уменьшает фрагментацию?,
замедляет работу
-i attr=2 # версия политики размещения расширенных аттрибутов
-i maxpct=процентов # максимальная доля, которую inode могут занимать на диске,
по умолчанию - от 1% до 25% в зависимости от размера файловой системы
-i size=байт # размер фиксированной части inode, от 256 (по умолчанию) до 2048
-i align=1 # выравнивать блоки inode
-l internal=1 # журнал внутри
-l logdev=устройство-для-журнала # вынос журнала на отдельное устройство экономит до 10 IOPS
-l size=байт # размер журнала (от 512 до 64K блоков, по умолчанию - 128 MiB)
-l su=размер-страйпа-RAID # можно указывать единицы объёма: k, m, g
-l lazy-count=1 # не обновлять счётчики суперблока при каждом изменении метаданных, ускоряет
-s размер-сектора
-f # затирать обнаруженную на блочном устройстве файловую систему
опции монтирования:
allocsize=байт # при увеличении файла место захватывается указанными кусками, лишнее потом освобождается;
от 4KiB до 1TiB; по умолчанию - 64KiB
attr2 # ускоренная обработка атрибутов
barrier # использовать барьерную синхронизацию при записи метаданных
biosize=16 # размер блока в буферизванных запросах ввода/вывода в виде двоичного логарифма
fs.xfs.xfsbufd_centisecs - 100, интервал сборки мусора в буферах метаданных
fs.xfs.age_buffer_centisecs - 1500, возраст метаданных для сброс а на диск
fs.xfs.error_level
fs.xfs.irix_symlink_mode - позволяет устанавливать права доступа символьных ссылок (отключено)
fs.xfs.restrict_chown - запрещает передавать права на файл другим поллльзователям (отключено)
fs.xfs.rotorstep - 1, сколько файлов размещать в группе перед переходом к следующей
xfs_info (скрипт для xfs_db)
утилита xfs_admin (скрипт для xfs_db) позволяет изменить метку и UUID размонтированной фаловой системы
утилита xfs_check (скрипт для xfs_db, проверка файловой системы, требуется размонтирование,
требует 16 ГБ памяти (реально использовались 10 ГБ) для файловой системы в 7 TB (67%, 500 файлов);
требует и реально использует 42 ГБ памяти для файловой системы в 20TB), быстр
xfs_logprint (вывод и разбор журнала)
xfs_metadump (скрипт для xfs_db, вывод метаданных в файл)
определить уровень фрагментации файлов: "xfs_db -c frag -r блочное-устройство" (размонтирование не требуется,
но иногда случается "Segmentation fault"; показывает долю "лишних" экстентов)
определить уровень фрагментации свободного пространства: "xfs_db -c freesp -r блочное-устройство"
(размонтирование не требуется)
утилита дефрагментирования файла или файловой системы xfs_fsr: не требует размонтирования, по очереди
копирует все фрагментированные файлы в непрерывный кусок свободной области (если есть), затем меняет ссылку на файл;
отображённые в память (map) файлы не обрабатываются;
команда chattr утилиты xfs_io позволяет пометить файлы, которые не надо дефрагментировать (атрибут f);
лучше запускать почаще, т.к. дефрагментировать сильно "загаженную"
файловую систему утилита неспособна
утилита восстановления структуры файловой системы xfs_repair (после аварийного отключения компьютера
требуется смонировать и размонтировать файловую систему перед вызовом xfs_repair;
1 ГБ ОП и 12 секунд на 7.5 ТБ и 500 файлов, быстра); ключи:
-L (обнулить журнал)
-n (только проверка)
-t секунд (интервал между отчётами)
-v
утилиты xfsdump и xfsrestore могут помочь извлечь данные из файловой системы, которой не помогла xfs_repair
(требуется монтирование)
утилита xfs_growfs позволяет увеличить размер файловой системы без размонтирования
Файловая системаbtrfs
типа CoW (Copy on Write, новая версия данных записывается в свободное место)
была инициирована Oracle под GPL (теперь у Oracle есть ZFS).
Дано обещание не ломать формат хранения после ядра 2.6.31.
Основные цели - устойчивость к сбоям, выявление ошибок на диске и восстановление данных.
Хранение файлов экстентами (как ext4), максимальный размер файлов - до 2^64,
динамическое выделение inode-ов, встроенная возможность делать снимки,
хранение контрольных сумм для данных и метаданных (crc32c;
реально проверяются: обнулил блок - получил ошибки ввода/вывода;
правильное значение может браться из второй копии;
неправильное значение не исправляется - можно скопировать и удалить файл),
сжатие (lzo, zlib), встроенные RAID-0, RAID-1 и RAID-10,
фоновый процесс поиска ошибок (и исправления для RAID-1 и RAID-10, в ядре 3.1),
фоновый процесс дефрагментации (в ядре 3.0),
возможность монтирования поддерева (подтома).
Ожидаются: fsck (offline и online), RAID-5 и RAID-6, зеркалирование и расщепление на уровне объектов (а не блоков),
удалённое зеркало изменений, дедупликация.
btrfs может быть создана над несколькими блочными устройствами с отдельным заданием распределения
метаданных (-m) и данных (-d): single, raid0, raid1, raid10 (сначало заполняется первое устройство);
по умолчанию: "-m raid1 -d raid0".
Свободное место выделяется для данных и метаданных большими
Блочные устройства можно добавлять и удалять без размонтирования
(расширение btrfs из 10 дисков ST1000528AS в raid10 до 12 raid10, FC 4Gb в режиме ptp
("badblocks -n" даёт 4.4 Gbps в обе стороны против 4 Gbps в режиме кольца), занято 1ТБ - 2 часа;
удаление 1 диска, освободилась сразу пара - 6 часов), имеется возможность балансировки используемого места.
Команда cp имеет ключ "--reflink[=always]", который позволяет копировать файлы без увеличения используемого дискового
пространства до изменения копии.
Дефрагментирование файловой системы со слепком может удвоить занятое место.
Не работает "df -i". Квот нет.
Размер свободного места в btrfs - сложный вопрос: из пула свободного места при необходимости выделяются
сегменты дисковых секторов (все указатели на экстенты работают с сегментными адресами вместо
физических дисковых, что позволяет эффективно перемещать сегменты между дисками)
для метаданных (по 256MB) и для данных (по 1GB) с учётом уровня RAID (т.е. пока по 1 или 2);
команда du показывает размер содержащего файлы несжатого архива без учёта метаданных
и сжатия файловой системы (слепки учитываются дважды);
команда df показывает общее доступное место и занятое место с учётом метаданных,
свободное место для этой точки монтирования без учёта сжатия и уровня RAID ;
команда "btrfs fi df точка-монтирования" показывает с учётом уровня RAID выделенное место
и использованное в выделенном для данных и метаданных и системы;
команда "btrfs fi show устройство" показывает общее занятое место,
имеющееся и занятое место на каждом блочном устройстве.
Маленькие файлы хранятся среди метаданных (в листьях), а метаданные по умолчанию дублируются.
Пользоваться в CentOS 6.0 (2.6.32-71.29.1.el6.x86_64) нельзя ("kernel BUG at fs/btrfs/extent-tree.c:4362").
Нагрузочное тестирование в Scientific Linux 6.1 (2.6.32-131.6.1.el6.x86_64, Btrfs v0.19) прошло успешно.
Ключи mkfs.btrfs (создаётся мгновенно):
--data {single | raid0 | raid1 | raid10}
--metadata {single | raid0 | raid1 | raid10}
--byte-count размер-файловой-системы
--alloc-start смещение-начала-файловой-системы
--leafsize размер-минимального-блока-данных # по умолчанию равен размеру страницы памяти;
размер блока метаданных;
если размер файла менее leafsize-148, то данные поместятся среди метаданных;
реализован только размер 4096
--nodesize байт # по умолчанию равен размеру страницы памяти; что это? реализован только размер 4096
--sectorsize байт # по умолчанию - 4КБ; не должен быть меньше физического блока;
единица выделения свободного пространства для области данных
--label метка
Опции монтирования (в качестве устройства указать одно из блочных устройств):
degraded (позволяет монтировать файловую систему при отказе одного из блочных устройств)
subvol=имя-подтома (монтирование поддерева; подтом д.б. в корне)
subvolid=идентификатор-подтома (монтирование поддерева; корень имеет идентификатор 0)
device=устройство (сканировать устройство в поисках томов btrfs; перечислить все устройства в /etc/fstab,
если initrd не выполняет "btrfs device scan")
nodatasum (не обрабатывать контрольные суммы)
nodatacow (ускорение - 5% на последовательных операциях,
значительное ускорение при работе с базами данных, также отключается сжатие)
nobarrier (возможно разрушение всей файловой системы - fsck примитивен)
max_inline=байт (максимальный размер данных, встраиваемых непосредственно в метаданные)
alloc_start= (?)
thread_pool=число-параллельных-потоков
compress[=zlib|=lzo] (lzo с ядра 2.6.39)
compress-force[=zlib|=lzo] (сжимать даже плохосжимаемые файлы)
ssd (оптимизация выделения блоков для SSD - сразу для всех устройств?)
noacl
notreelog (как-то влияет на fsync)
flushoncommit (при завершении транзакции осуществлять все отложенные выделения блоков)
metadata_ratio=8 (распределение места на данные и метаданные было (?) фиксированно и если место под метаданные заканчивалось,
а под данные - нет, то надо было поставить число поменьше; необходимо учитывать степень сжатия)
space_cache (хранение размера свободного места на диске, с 2.6.37, неустойчиво работает в RHEL61)
clear_cache
autodefrag (запуск фоновой дефрагментации, несовместим с большими БД и образами виртуальных машин, с 3.0)
inode_cache (кешировать свободные inode, с 3.0)
Утилита btrfs позволяет манипулировать файловыми системами
btrfs device scan (кеширование информации о файловых системах btrfs, выполнять перед монтированием)
btrfs device add блочное-устройство ... точка-монтирования (добавить устройство (устройства) к файловой системе)
btrfs device delete блочное-устройство ... точка-монтирования (отнять устройство (устройства)
у файловой системы, используемые блоки перемещаются на оставшиеся устройства)
btrfs device delete missing точка-монтирования (вывести сбоящее устройство из файловой системы;
возможно, что придётся монтировать с опцией degraded и добавлять новой устройство)
btrfs filesystem show [блочное-устройство] (информация о файловых системах btrfs: метка, UUID, занятое место,
имеющееся и занятое место на каждом блочном устройстве)
btrfs filesystem df точка-монтирования (выводит тип дублирования данных,
имеющееся и занятое место для данных, метаданных и системы (?))
btrfs filesystem defragment [ключи] имя-файла ... (дефрагментирование [и сжатие];
каждый файл в каталоге надо дефрагментировать отдельно - исправлено? не прерывается?
лучше не запускать на устройстве, близком к заполнению); ключи:
-v # болтливость
-c[zlib|lzo] # безусловное сжатие, указание типа в следующей версии
-f # не откладывать запись на диск и синхронизацию копий
-s начало-дефрагментируемого-участка
-l длина-дефрагментируемого-участка
-t байт # если все сегменты больше указанного числа, то файл считается дефрагментированным
btrfs filesystem balance точка-монтирования (перераспределение блоков среди вновь добавленных устройств)
btrfs balance {start|cancel} # в следующей версии
btrfs filesystem sync точка-монтирования (синхронизировать копии данных и метаданных, судя по скорости - заглушка)
btrfs filesystem resize [+|-]размер{k|m|g}|max
btrfs filesystem scrub {start|statu|cancel|resume} # в следующей версии
btrfs subvolume create [каталог/]подтом
btrfs subvolume delete подтом # команда завершается быстро, но место освобождается очень постепенно,
при этом размонтировать файловую систему (т.е. корректно перезагрузиться) невозможно
btrfs subvolume snapshot точка-монтирования-подтома точка-монтирования-подтома/[каталог/]имя-слепка
(слепком можно пользоваться как обычным каталогом)
btrfs subvolume list точка-монтирования-подтома (вывести список слепков и их идентификаторов для монтирования)
btrfs subvolume set-default идентификатор (монтировать этот подтом или слепок по умолчанию)
Тестирование на резервное копирование и восстановление
(на настольный комптьютер с 2 дисками ST1000528AS и сервер Intel SR2625URLX,
дисковая полка из 12 дисков ST31000340NS через FC 4Gb)
сжатие lzo в 1.9 раза при скорости записи 227 MB/s на 2 диска ST1000528AS в raid0,
Intel Core i3 540 @ 3.07GHz, 3 потока
сжатие lzo (force) в 2.05 раза при скорости записи 219 MB/s на 2 диска ST1000528AS,
Intel Core i3 540 @ 3.07GHz, 3 потока, raid0
сжатие zlib в 1.25 раза при скорости записи 135 MB/s на 2 диска ST1000528AS,
Intel Core i3 540 @ 3.07GHz, 3 потока, raid0
слишком многие файлы считаются несжимаемыми
сжатие zlib (force) в 2.56 раза при скорости записи 87 MB/s на 2 диска ST1000528AS,
Intel Core i3 540 @ 3.07GHz, 3 потока, raid0
процессор не справляется
сжатие lzo в 2.02 раза при скорости записи 354 MB/s на 12 дисков в raid0, Intel 2625UR, 3 потока,
не справляется FC
сжатие lzo в 2.04 раза при скорости записи 214 MB/s на 10 дисков в raid10, Intel 2625UR, 4 потока
"tar -cf - .|dd of=/dev/null bs=1024k" чтение со скоростью 516 MB/s на 12 дисков в raid0, Intel 2625UR
"tar -cf - .|dd of=/dev/null bs=1024k" чтение со скоростью 660 MB/s на 12 дисков в raid0, Intel 2625UR, 2 потока
"tar -cf - .|dd of=/dev/null bs=1024k" чтение со скоростью 653 MB/s на 12 дисков в raid0, Intel 2625UR, 3 потока
"tar -cf - .|dd of=/dev/null bs=1024k" чтение со скоростью 650 MB/s на 10 дисков в raid10, Intel 2625UR, 3 потока,
чтение идёт только с 5 дисков
При восстановлении в 4 потока на файловую систему btrfs 2 файла восстановились
не полностью (сообщение - нет места, хотя последующие файлы записались нормально) примерно в одно и то же время.
fsck отсутствует (btrfsck - заглушка). Обработка монтирования после аварийного завершения не реализована
(велик шанс, что файловая система не смонтируется; возможен "kernel panic").
При удалении устройства (использовал remove-single-device) журнал заполняется сообщениями о неверных
контрольных суммах (на каждый прочитанный экстент файла?), затем кто-то продолжает обращаться к
несуществующему устройству до размонтирования.
При возвращении устройства (add-single-device) оно получает новую букву, показывается
в btrfs fi show, но не участвует в работе, btrfs fi sync ничего не делает,
btrfs fi balance также не задействует его.
mkfs.btrfs не проверяет перед созданием, что на разделе что-то уже есть.
Балансировку невозможно остановить (запланировано).
Лечение raid1 также в светлом будущем (ветка утилит btrfs была заброшена 10 месяцев),
сейчас надо вывести диск из эксплуатации, починить (заменить) диск, добавить новый
(чиненный) диск в файловую систему.
Множество других "детских" болезней. В общем, ждём лета 2012 (RHEL 6.3).
Если необходимо размонтировать не дожидаясь завершения
процессов, то можно использовать ключ "-f" в Solaris (процессы получат сообщения
об ошибках ввода-вывода) или ключ "-l" в Linux (реальное размонтирование
произойдёт по завершению процесса).
Опции монтирования можно указать в /etc/fstab, в командной строке после ключа -o
или в настройках автомонтировщика,
Поиск файлов: 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
трассировка и проигрывание запросов ввода/вывода
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):
/proc/compcache (ошибки при переходе через 4GB?) и /proc/xvmalloc (?) содержат статистику
Управление виртуальной памятью: 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
Если ожидания по поводу неиспользования виртуальной не оправдались и закончились физическая память и swap,
то в действие вступает oom_killer, который пользуясь противоестественным интеллектом ищет и убивает
первую попавшуюся задачу (обычно не ту, что нужно). Его поведением можно управлять с помощью
/proc/$$/oom_adj, которая принимает значения от -17 (не убивать этот процесс никогда) до 15 (убивать в иепвую очередь).
Переменная /proc/sys/vm/vfs_cache_pressure управляет кого удалять из кеша при недостатке памяти -
страницы файлов (cache) или inode/dentry (buffers): 100 - поровну,
0 - не вытеснять inode/dentry совсем (утекают всё-равно).
Кстати, 6.7 миллиона файлов занимают 10 ГБ памяти, а find ускоряется со 150 минут до 20 секунд.
Завершенный процесс, который не смог сообщить о своём завершении родителю, переходит в состоянии зомби
(состояние процесса 'Z' по команде "ps -el"). Сигналы, включая "kill -9" на него не действуют
(он уже мёртвый). Необходимо как-то воздействовать на родительский процесс, например, завершить его.
Если родительский процесс находится в состоянии 'T', то можно попробовать снять его
программой "ltrace -t номер-процесса".
Если родительский процесс ожидает доступа к устройству, то обеспечить его.
Загрузка со SCSI при наличии IDE-дисков.
/sbin/lilo делает оба диска незагружаемыми. Бездумный способ: запускать
lilo с выключенным IDE (и в BIOS тоже). Разумный способ ищется.
команда 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)