Проблема выбора
Современные универсальные дистрибутивы Linux, к коим мы относим и Linux-Mandrake RE, содержат около полутора тысяч пакетов, часто дублирующих друг друга по функциональности. Разработчиков постоянно критикуют за это:
одни пользователи считают, что им подсунули лишние диски и затруднили выбор, другие сетуют на отсутствие своих любимых программ, часто весьма специфических.
Как выбрать “свои” пакеты из большого дистрибутива? Вам поможет система меню, программы управления пакетами, список рассылки. Если вы не нашли нужную программу в дистрибутиве, то, возможно, она есть в Sisyphus
- нашем вечно меняющемся “дистрибутиве в разработке”. Если ее нет и там - сообщите нам об этом.
Старайтесь не идти по привычному пути. Linux имеет Windows(tm)-образный набор приложений и средств настройки, но если вы остановитесь на них, то не увидите стройность Un*x. С другой стороны, с порога отвергать, например,
KDE, увидев в нем сходство с нелюбимой ОС, -- тоже довольно странно.
Проблемы
Как мы уже писали, печать и, особенно, ее интернационализация, - не самая сильная сторона Un*x. Если для вашего принтера есть несколько драйверов и Вы не удовлетворены печатью с первой попытки - попробуйте другие, в том числе
Generic Postscript.
Если при печати в файл gv показывает символы не-Latin-1 нормально, а на печати они заменяются на Latin-1, то, возможно, у Вас принтер имеет прошитые шрифты без кириллических глифов. В этом случае попробуйте проделать не
слишком изящную операцию:
1.Найдите в /etc/CUPS/ppd файл <имя принтера>.ppd, который содержит драйвер.
2.С правами root сделайте копию этого файла.
3.Удалите из файла все строки, начинающиеся с "*Font" и заканчивающиеся "Standard ROM".
Это поможет CUPS не искать шрифты в принтере.
В случае других проблем, - читайте документацию, а по ее прочтении обращайтесь в наши списки рассылки.
Проблемы администрации распределенных файловых систем
Использование распределенных файловых систем дает системным администраторам не только новые возможности, но и новые проблемы. Но распределенные системы способны упростить многие из стандартных административных задач. В сетевой среде пользователи должны иметь возможность зайти в сеть под своим именем с любого компьютера. Это значит, что механизм входа в сеть (или аутентификации) тоже должен быть сетевым. Поэтому в среде распределенной файловой системы файлы групп и паролей, расположенные на индивидуальных компьютерах, вторичны по отношению к сетевым механизмам аутентификации (таким, как Kerberos или NIS, которые предоставляют пользователям возможность работать на любом компьютере). Но стандартные локальные механизмы проверки пароля все же должны существовать, чтобы администраторы могли выполнять на локальных компьютерах необходимые задачи.
Сохранение общих данных на централизованных файловых серверах (а не на индивидуальных компьютерах) упрощает такие административные задачи, как резервирование и восстановление файлов и каталогов. Это так же централизует такие стандартные административные задачи, как контроль за использованием файловой системы, и представляет новые возможности управления хранением данных – например, балансирование загрузки. Распределенные файловые системы типа OpenAFS и Coda обеспечивают встроенные логические системы управления разделами, которые дают администраторам возможность переместить интенсивно используемые данные на более мощные или менее используемые компьютеры. Если распределенная файловая система поддерживает дублирование, копии интенсивно используемых данных могут распределяться между многими файловыми серверами. Это может уменьшить нагрузку на сеть, и облегчить работу серверов. Распределенные файловые системы используют логические разделы вместо физических дисковых разделов, и это позволяет легко добавить в сеть новую свободную память прямо во время работы. (Для добавления нового диска в локальный компьютер пришлось бы потратить некоторое время).
Использование распределенных файловых систем так же облегчает возможность совместного доступа к программному и аппаратному обеспечению. Но перед этим нужно удостовериться, что лицензии к используемым программам разрешают установку программного обеспечения в распределенной файловой системе. Сервера печати – одна из первоначальных причин появления среды «клиент-сервер». Распределенные файловые системы так же упрощают совместный доступ к специализированным аппаратным средствам, соединяясь по сети с компьютером, на котором установлены нужные аппаратные средства, и при этом все еще имея доступ к вашим данным.
Использование централизованной распределенной файловой системы может обеспечивать существенные преимущества в стоимости и быстродействии выполнения работы для клиентских систем. Распределенные файловые системы существенно уменьшают аппаратные затраты, минимизируя количество памяти на любом десктопе или ноутбуке. Использование распределенной файловой системы в качестве архива для пользовательских данных обычно означает более быструю загрузку клиентских машин, потому что большое количество данных больше не хранится локально и поэтому не нуждается в проверке после перезапуска клиента. Комбинация распределенной файловой системы и использования журналируемых файловых систем на клиентских компьютерах может дать значительное увеличение скорости запуска системы.
Проблемы с большими дисками
В MS-DOS и ранних версиях Windows доступ к дискам был организован через прерывание 13 BIOS. При этом использовалась адресация секторов на диске на основе указания номеров цилиндра, головки и сектора на дорожке (нумерацию физических цилиндров и дорожек принято начинать с нуля, а сектора на дорожке с единицы). Однако практически головок было не более 16, а число секторов на дорожке не более 63, и, хотя для указания цилиндра использовалось 10 разрядов, BIOS не мог работать с дисками емкостью более 1024X63X16X512 = 528 Мбайт. Чтобы преодолеть это ограничение, применяются разные приемы. Так, Extended CHS или Large disk support (его иногда называют просто Large) использует незанятые разряды номера головки и номера сектора на дорожке для увеличения числа адресуемых цилиндров. Но на данный момент и DOS, и Windows 95 не поддерживают 256 считывающих головок, поэтому можно использовать только в 1024 цилиндра, 128 считывающих головок и 63 сектора/дорожку. Преобразование Extended CHS в реальный CHS-адрес (который может иметь до 8192 цилиндров) осуществляет BIOS. Это позволяет работать с дисками емкостью до 8192X16X63X512 =
4227858432 байт или 4,2 Гбайт.
Однако плотность записи, число пластин и дорожек все увеличивались, изобретались другие способы увеличения емкости дисков. В результате формула C/H/S уже перестала правильно отражать , а старые версии BIOS перестали обеспечивать доступ ко всему дисковому пространству. Тогда придумали еще один прием для работы с большими дисками через Int 13h - линейную адресацию блоков (Linear Block Addressing - LBA). Не вдаваясь в подробности, можно сказать, что все сектора на диске нумеруются последовательно, начиная с нулевого сектора на первой дорожке нулевого цилиндра. Вместо CHS-адреса каждый сектор получает логический адрес, которым выступает просто его порядковый номер в общем массиве секторов. Нумерация логических секторов начинается с нуля, причем нулевой сектор содержит MBR. В Setup BIOS поддержка преобразования линейного номера в CHS-адрес обозначается как . Таким образом, в новых версиях BIOS обычно имеется выбор из трех вариантов: Large, LBA и Normal (последнее означает, что преобразование не производится).
Но и в режиме LBA обращение к физическому диску все равно осуществляется через функции Int 13h, которые используют нотацию C/H/S. В силу этого возникает ограничение на возможный объем диска: BIOS не может адресовать все сектора на дисках объемом более 8,5 Гбайт. Надо заметить, что это ограничение относится только к дискам с интерфейсом IDE. В контроллерах SCSI-дисков номер сектора переводится в команды SCSI, а далее сам диск находит нужную позицию, поэтому такого ограничения на объем диска не возникает.
Linux и последние версии Windows при работе с дисками уже не используют прерывание 13 BIOS, а работают с собственными драйверами дисков. Но прежде чем система сможет использовать такой драйвер, она должна как минимум его загрузить, поэтому на этапе начальной загрузки любая система вынуждена опираться на BIOS. Это вызывает ограничения на размещение многих систем за пределами 8 Гбайт: они не способны оттуда загружаться, хотя после успешной загрузки могут работать с дисками гораздо большего объема. Чтобы понять, как можно обойти эти ограничения, рассмотрим процесс загрузки ОС Linux.
/Proc/scsi
/proc/scsi/scsi
Одна из наиболее полезных вещей, которые нужно знать администратору - как добавить дисковое пространство, если у вас есть диски горячей замены без перезагрузки системы. Без использования /proc, вы должны вставить ваш диск, но затем вам придется перезагружать систему для того, чтобы дать ей возможность распознать новый диск.
Вы можете позволить системе распознать новый диск с помощью следующей команды:
echo "scsi add-single-device w x y z" >
/proc/scsi/scsi
Чтобы эта команда работала правильно, вы должны указать параметры значений w, x, y, и z следующим образом:
w - это ID хост адаптера, где первый адаптер имеет ID ноль (0)
x - это канал SCSI на хост адаптере, где первый канал ноль (0)
y - это SCSI ID устройства
z - это номер LUN, где первый LUN ноль (0)
Поскольку ваш диск добавлен в систему, вы можете монтировать любую предварительно форматированную файловую систему или вы можете начать форматирование ее, и так далее. Если вы не уверены в том, каким устройством является установленный диск или вы хотите проверить существующие партиции, вы можете использовать команду fdisk -l, которая выведет необходимую информацию для вас. Команда для удаления устройства из системы без перезагрузки:
echo "scsi remove-single-device w x y z" >
/proc/scsi/scsi
Перед тем как ввести эту команду и удалить SCSI диск, убедитесь, что вы отмонтировали файловые системы на этом диске.
/Proc/sys/fs/
/proc/sys/fs/file-max
Здесь указывается максимальное количество заголовков файлов, которое может быть одновременно открыто. Вам может понадобиться увеличить это число если пользователи получают сообщение об ошибке потому что достигнуто максимальное количество открытых файлов. Можно указать любое числовое значение в этом файле. Default setting: 4096
/proc/sys/fs/file-nr
Этот файл связан с file-max и содержит три значения:
Количество назначенных заголовков файлов
Количество используемых заголовков
Максимальное число заголовков
Этот файл только для чтения и только для предоставления информации.
/proc/sys/fs/inode-*
Любые файлы, начинающиеся с "inode" будут выполнять те же функции, что и файлы с именем "file" выше, но выполняют эти операции относительно inodes вместо заголовков файлов.
/proc/sys/fs/overflowuid и /proc/sys/fs/overflowgid
Эти файлы содержат User ID (UID) и Group ID (GID) для любой файловой системы, которая поддерживает 16-bit user и group ID. Эти значения могут быть изменены, но если вы действительно считаете это нужным, то более простым будет изменить файл группы и пароля группы вместо этого. Default Setting: 65534
/proc/sys/fs/super-max
Здесь указывается максимальное количество заголовков суперблоков. Любая файловая система, которую вы монтируете должна использовать суперблоки, так что вам, возможно, придется использовать его если вы монтируете много файловых систем. Default setting: 256
/proc/sys/fs/super-nr
Здесь указано текущее значение количества суперблоков. Этот файл только для чтения и используется для информации.
/Proc/sys/kernel
/proc/sys/kernel/acct
Здесь содержатся три конфигурируемых значения, которые управляют подсчетом процессов, основанном на свободном пространстве (в процентах) файловой системы и ведет лог:
Если свободное пространство ниже значения в процентах, то процесс подсчета останавливается
Если свободное пространство выше, то процес запускается
Частота в секундах, с которой проверяются предыдущие два значения
Чтобы изменить значения в этом файле вам следует использовать разделенный список параметров. Default setting: 2 4 30
Эти значения остановят подсчет, если в файловой системе менее 2 процентов свободного пространства и начнет опять если появится 4 или более процентов. Проверка производится каждые 30 секунд.
/proc/sys/kernel/ctrl-alt-del
Этот файл содержит двоичное значение, которое управляет тем, как система реагирует на комбинацию ctrl+alt+delete. Возможны два значения:
Ноль (0) значит, что ctrl+alt+delete принимается и отправляется программе init. Это позволит выполнить системе мягкую остановку и перезагрузку как если бы вы ввели команду shutdown.
Один (1) значит, что ctrl+alt+delete не принимается и никакого чистого отключения не происходит как если бы вы просто выключили питание.
Default setting: 0
/proc/sys/kernel/domainname
Здесь вы можете сконфигурировать ваше сетевое доменное имя. Значения по умолчанию нет и оно может быть, а может и не быть установлено.
/proc/sys/kernel/hostname
Здесь вы можете сконфигурировать ваше сетевое имя хоста. Значения по умолчанию нет и оно может быть, а может и не быть установлено.
/proc/sys/kernel/msgmax
Здесь определяется максимальный размер сообщения, которое может быть отправлено от одного процесса другому. Сообщения между процессами в памяти ядра не копируются на диск, так что если вы увеличите это значение, то вы увеличите количество памяти используемой операционной системой. Default setting: 8192
/proc/sys/kernel/msgmnb
Здесь указывается максимальное количество байт в одном сообщении. Default setting: 16384
/proc/sys/kernel/msgmni
Здесь указывается максимальное количество идентификаторов сообщений в очереди. Default setting: 16
/proc/sys/kernel/panic
Здесь установлено время в секундах, которое ядро будет ждать перед перезагрузкой если произойдет "kernel panic." Установка в ноль (0) секунд отключит возможность перезагрузки при kernel panic. Default setting: 0
/proc/sys/kernel/printk
Здесь четыре числовых значения, которые определяют куда будут отправлены сообщения логов, в зависимости от их важности. За более подробной информацией о различных уровнях логов отправляейтесь в man syslog(2). Четыре значения это:
Console Log Level: сообщения с высшим приоритетом, чем это будут выведены на консоль
Default Message Log Level: сообщения без приоритета будут напечатаны с этим приоритетом
Minimum Console Log Level: минимальное (высочайший приоритет) значение, в которое может быть установлен Console Log Level
Default Console Log Level: значение по умолчанию для Console Log Level
Default setting: 6 4 1 7
/proc/sys/kernel/shmall
Это общее количество разделяемой памяти (в байтах), которое может быть использовано в системе. Default setting: 2097152
/proc/sys/kernel/shmax
Здесь указывается наибольший размер сегмента памяти (в байтах) позволяемый ядром. Default setting: 33554432
/proc/sys/kernel/shmmni
Этот файл связан с максимальным числом сегментов раздляемой памяти всей системы. Default setting: 4096
/proc/sys/kernel/sysrq
Активирует System Request Key, если не равно нулю. Default setting: 0
/proc/sys/kernel/threads-max
Максимальное число потоков, которое может быть использовано ядром. Default setting: 2048
/Proc/sys/net
/proc/sys/net/core/message_burst
Это время (в десятых долях секунды) необходимое для записи нового предупреждения; другие предупреждения, полученные в это время будут пропущены. Это используется для предотвращения атаки Denial of Service, которая может быть выполнена при заваливании вашей системы сообщениями. Default setting: 50 (5 seconds)
/proc/sys/net/core/message_cost
Здесь указывается значимость каждого предупреждения. Чем выше значение, тем больше предупреждений будет проигнорировано. Default setting: 5
/proc/sys/net/core/netdev_max_backlog
Здесь указывается максимальное количество пакетов в очередь на обработку если интерфейс получает пакеты быстрее, чем ядро может их обработать. Default setting: 300
/proc/sys/net/core/optmem_max
Здесь указан максимальный размер буфера для одного сокета.
/proc/sys/net/core/rmem_default
Здесь размер буфера для получаемого сокета по умолчанию (в байтах).
/proc/sys/net/core/rmem_max
Это максимальный размер буфера для получаемого сокета (в байтах).
/proc/sys/net/core/wmem_default
Это размер буфера отправляемого сокета по умолчанию (в байтах).
/proc/sys/net/core/wmem_max
Это максимальный размер буфера посылаемого сокета (в байтах).
/proc/sys/net/ipv4
Все параметры IPv4 и IPv6 полностью документированы в документации к ядру. Смотри файл /usr/src/linux/Documentation/networking/ip-sysctl.txt.
/proc/sys/net/ipv6
То же что и IPv4.
/Proc/sys/vm
/proc/sys/vm/buffermem
Здесь происходит управление количеством общей системной памяти (в процентах), которая будет использована как буферная память. Файл содержит три значения, которые могут быть указаны в виде списка через пробел:
Минимальный процент памяти, которая будет использована для буфера
Система будет пытаться установить это количество памяти для буфера если количество доступной памяти будет уменьшено
Максимальный процент памяти, которая будет использована для буферов
Default setting: 2 10 60
/proc/sys/vm/freepages
Этот файл управляет как система реагирует на различные уровни свободной памяти. Содержит три значения, которые могут быть установлены в виде списка, разделенного пробелами:
Если количество свободных страниц в системе достигнет этого минимального предела, только ядро будет иметь доступ к любому дополнительному количеству памяти.
Если количество свободных страниц в системе упадет ниже этого предела, то ядро начнет более агрессивно свопировать для освобождения памяти и поддержания системной производительности.
Ядро будет пытаться сохранить это количество системной памяти свободным. Падение ниже этого значения приведет к свопированию.
Default setting: 512 768 1024
/proc/sys/vm/kswapd
Этот файл управляет как ядро будет свопировать память. Он содержит три значения в виде списка, разделенные пробелами:
Максимальное количество страниц, которое ядро пытается освободить за один раз. Если вы хотите увеличить величину свопирования, вам нужно увеличить это значение.
Минимальное количество раз, которое ядро пытается освободить страницу в время своппинга.
Количество страниц, которое ядро может записать в один своп. Оказывает сильное влияние на производительность системы. Чем больше это значение, тем больше данных будет свопировано и тем меньше времени будет потрачено на поиск на диске. Однако, слишком большое значение окажет обратных эффект на производительность системы из-за увеличения очереди запросов.
Default setting: 512 32 8
/proc/sys/vm/pagecache
Этот файл выполняет ту же работу, что и /proc/sys/vm/buffermem, но он делает ее для карты памяти и общего кэширования файлов.
/Proc : Виртуальные файловые системы для хранения информации о ядре и процессах
Файловая система proc является фактически стандартным для Linux методом обработки информации о системе и процессах, в отличие от других систем, использующих /dev/kmem и другие подобные методы. Мы настоятельно рекомендуем использовать proc для хранения и получения информации о процессах, а также информации о ядре и памяти.
Процедуры Xlib для преобразования кодов
Для такого преобразования в Xlib существует две процедуры - XLookupString
и XmbLookupString (mb означает - "multi byte"). В качестве аргумента этим подпрограммам передается "сообщение о нажатии" (или отпускании) клавиши (Key Press Event), а "на выходе" должен получаться однобайтный код символа.
(Строго говоря, есть еще одна аналогичная процедура - XwcLookupString
(wc означает - "wide char"). Но она используется крайне редко.)
Надо отметить, что в большинстве современных программ выбор конкретной процедуры происходит следующим образом.
Процедура XLookupString более "древняя" и более "глупая". Процедура XmbLookupString более сложная и более гибкая, но в своей работе пользуется "input context'ом" текущего "окна". Не вдаваясь в подробности, можно сказать, что "input context" - это некий объект, описывающий особенности ввода (input) в "свое окно", и содержащий список "методов" для различных преобразований входных цепочек символов.
Поэтому, большинство "иксовых" программ пытаются создать для своих "окон" input context. И, если им это удается, используют XmbLookupString, а если по каким-то причинам input context не может быть создан, то используют XLookupString.
Так вот. Для того, чтобы избежать путаницы в алфавитах, обе эти процедуры ориентируются на "текущую locale" (которая, в частности, определяет "национальный" алфавит с которым в данный момент работает система).
Если вы не знаете - что такое locale, могу порекомендовать сайт - "Locale AS IS", где это об этом рассказано достаточно подробно (и по русски!).
Здесь замечу только, что ...
программы обычно узнают о текущей locale из "переменных окружения" (environment) LANG, или LC_ALL, LC_CTYPE и т.п.; для каждой locale в системе существует набор файлов, в которых содержится вся информация "зависящая от языка" (и, соответствено - алфавита); в системе X-Window (а ее можно рассматривать как отдельную ОС), основными файлами, описывающим "категории locale" является файлы XLC_LOCALE, разложенные по отдельным поддиректориям в директории X11R6/lib/X11/locale. Каждая поддиректория соответствует одной конкретной locale. процедуры Xlib в своей работе используют некоторые значения (какие именно - рассмотрим чуть позже), описанные в файле XLC_LOCALE.
Кроме того надо заметить, что не бывает "никакой locale". Если locale не задана "переменными окружения" или задана, но такая, что система затрудняется найти нужные файлы, то будет использоваться locale - "C".
Так вот. При старте программа должна установить нужную locale (ниже мы поговорим об этом немного подробнее). Библиотека Xlib найдет соответствующий файл, описывающий эту locale. Процедуры *LookupString по этому описанию будут принимать решение - как преобразовать двубайтные коды (в нашем случае - Cyrillic коды) в однобайтные символы.
Если заглянуть немного глубже в работу этих процедур, то можно заметить, что
обе процедуры ориентируются на параметр locale (точнее, он назывется - класс) - encoding_name; значение этого класса (для работы с Cyrillic) должно быть KOI8-R или ISO8859-5; в зависимости от значения этого класса...
если он KOI8-R - Cyrillic превращаются в однобайтные коды koi8-r
если ISO8859-5 - Cyrillic превращаются в коды iso8859-5 если ни то ни другое - Cyrillic вообще ни во что не преобразуется. То есть "на выход" выдается строчка нулевой длины. Это и выглядит как "русские буквы не вводятся".
(Надо отметить, что эти названия "зашиты" в библиотке Xlib вместе с таблицами перекодировки. Поэтому никакими внешними файлами изменить их, или добавить новые, нельзя.)
Кстати, если locale "никакая" (то есть - C), или encoding_name не определен, то нормально вводятся коды "национальных алфавитов Западной Европы", которые занимают то же место в кодовой таблице, что и koi8-r. А если нормально преобразуются коды Cyrillic, то наоборот - "подавляется" ввод "западноевропейских" символов.
Кроме того, есть отличия в работе двух *LookupString.
XLookupString прежде всего пытается взять encoding_name из "переменной окружения" _XKB_CHARSET. Если такая переменная есть, то используется ее значение и locale устанавливать не нужно. XmbLookupString, напротив, не только обязательно требует правильной locale, но и еще использует в своей работе значение двух классов - encoding_name и ct_encoding (ct - "compaund text"). Поэтому, для ее нормальной работы, значения этих двух классов должно совпадать (по крайней мере - для "кириллицы").
Процесс и программа
Вы скажете: все это замечательно, но если новый процесс - всегда копия существующего, то каким образом в системе ухитряются работать разные программы? И откуда берется самая первая из них?
Процессы, выполняющие разные программы, образуются благодаря применению имеющихся в стандартной библиотеке Unix функций "семейства exec": execl, execlp, execle, execv, execve, execvp. Эти функции отличаются форматом вызова, но в конечном итоге делают одну и ту же вещь: замещают внутри текущего процесса исполняемый код на код, содержащийся в указанном файле. Файл может быть не только двоичным исполняемым файлом Linux, но и скриптом командного интерпретатора, и двоичным файлом другого формата (например, классом java, исполняемым файлом DOS). В последнем случае способ его обработки определяется настраиваемым модулем ядра под названием binfmt_misc.
Таким образом, операция запуска программы, которая в DOS и Windows выполняется как единое целое, в Linux (и в Unix вообще) разделена на две: сначала производится запуск, а потом определяется, какая программа будет работать. Есть ли в этом смысл и не слишком ли велики накладные расходы? Ведь создание копии процесса предполагает копирование весьма значительного объема информации.
Смысл в данном подходе определенно есть. Очень часто программа должна совершить некоторые действия еще до того, как начнется собственно ее выполнение. Скажем, в разбиравшемся выше примере мы запускали две программы, передающие друг другу данные через неименованный канал. Такие каналы создаются системным вызовом pipe; он возвращает пару файловых дескрипторов, с которыми в нашем случае оказались связаны стандартный поток ввода (stdin) программы wc и стандартный поток вывода (stdout) программы dd. Стандартный вывод wc (как, кстати, и стандартный ввод dd, хотя он никак не использовался) связывался с терминалом, а кроме того, требовалось, чтобы командный интерпретатор после выполнения команды не потерял связь с терминалом. Как удалось этого добиться? Да очень просто: сначала были отпочкованы процессы, затем проделаны необходимые манипуляции с дескрипторами файлов и только после этого вызван exec.
Аналогичного результата (как показывает, в частности, пример Windows NT) можно было бы добиться и при запуске программы за один шаг, но более сложным путем. Что же касается накладных расходов, то они чаще всего оказываются пренебрежимо малыми: при создании копии процесса его индивидуальные данные физически никуда не копируются. Вместо этого используется техника, известная под названием copy-on-write (копирование при записи): страницы данных обоих процессов особым образом помечаются, и только тогда, когда один процесс пытается изменить содержимое какой-либо своей страницы, она дублируется.
Процесс загрузки Windows
При включении компьютера прежде всего запускается программа тестирования аппаратной части POST (Power On Self Test). После ее завершения выдается прерывание Int 19h, задача которого - попытаться найти загрузочное устройство. Поиск производится в порядке, заданном в Setup BIOS и осуществляется путем опроса нулевых секторов соответствующих устройств. Если диск загрузочный, то в его нулевом секторе находится главная загрузочная запись, MBR. Последние два байта MBR - это , служащее признаком того, что данный сектор и есть MBR, а, следовательно, диск является загрузочным. Помимо типичная MBR содержит таблицу разделов диска и программу - первичный загрузчик размером 446 байт.
Но вернемся к описанию процесса загрузки. Прерывание 19h BIOS загружает из MBR и запускает первичный загрузчик, задача которого - найти в таблице разделов активный раздел и загрузить вторичный загрузчик, который располагается начиная с первого логического сектора активного раздела. Обратим внимание на слово . Дело в том, что вторичный загрузчик в разных системах имеет разную длину. В разделе, сформатированном под файловую систему FAT, вторичный загрузчик занимает один сектор (512 байт). В разделе, сформатированном под NTFS, вторичный загрузчик занимает уже несколько секторов. Вторичный загрузчик загружает первый слой программ, необходимых для запуска операционной системы. Так, в случае MS-DOS это IO.SYS, затем
MSDOS.SYS и потом SYSINIT модуля IO.SYS.
Для других операционных систем от Microsoft процесс загрузки происходит аналогичным образом.
Windows 95 загружается так же, как и DOS, но заменяет IO.SYS и MSDOS.SYS своими файлами. Файлы DOS сохраняются в файлах IO.DOS и MSDOS.DOS соответственно. Когда же выбирается загрузка сохраненного DOS, Windows 95 переименовывает свои файлы в файлы с расширением *.W40 и восстанавливает первоначальные имена системных файлов DOS. Процесс продолжается с загрузки IO.SYS. Таким образом, загрузочные сектора DOS и Windows 95 одинаковы. Windows NT 4 использует главную загрузочную запись DOS, но заменяет загрузочную запись активного раздела таким образом, что вместо IO.SYS загружается NTLDR. Это уже мощная программа, многое способная сделать. В частности, она находит файл boot.ini и, если значение параметра timeout больше нуля, предлагает меню загрузки. Каждая строка секции [operating systems] файла boot.ini определяет один из вариантов загрузки и строится по шаблону: адрес_вторичного_загрузчика=.
Адресом вторичного загрузчика может являться указание на конкретный раздел диска или на файл загрузчика. Вот пример файла boot.ini:
[operating systems] multi(0)disk(0)rdisk(0)partition(3)\ WINNT =
multi(0)disk(0)rdisk(0)partition(3)\ WINNT = /basevideo /sos C:\= C:\BOOTSECT.LNX=
В строке, соответствующей Microsoft Windows, указан просто диск , так как имя загрузочного файла берется по умолчанию: bootsect.dos. Файл грузится в память и загрузка продолжается так, как если бы загрузочная запись раздела была загружена программным кодом из главной загрузочной записи. Для загрузки других систем нужно добавить в boot.ini строки, содержащие ссылки на другие загрузочные файлы. При выборе такой строки будет загружаться соответствующая операционная система. В приведенном примере так организуется загрузка Linux. Для этого в файле C:\BOOTSECT.LNX должно быть предварительно записано содержимое загрузочной записи LILO.
Процессы
Процессы, задачи, потоки и нити.
Управление процессами в Linux.
Исследуем процессы. Часть 1.
Исследуем процессы. Часть 2.
Исследуем процессы. Часть 3. Демон init.
"Домашнее задание" для компьютера.
Как заставить cron выполнять наши приказания.
Введение в автоматизацию. Часть 1.
Введение в автоматизацию. Часть 2.
Демон следит за системой.
Протоколирование.
Ротация журналов.
Процессы Системные вызовы fork() и exec() Нити
Процесс в Linux (как и в UNIX) – это программа, которая выполняется в отдельном виртуальном адресном пространстве. Когда пользователь регистрируется в системе, автоматически создается процесс, в котором выполняется оболочка (shell), например, /bin/bash.
В Linux поддерживается классическая схема мультипрограммирования. Linux поддерживает параллельное (или квазипараллельное при наличии только одного процессора) выполнение процессов пользователя. Каждый процесс выполняется в собственном виртуальном адресном пространстве, т.е. процессы защищены друг от друга и крах одного процесса никак не повлияет на другие выполняющиеся процессы и на всю систему в целом. Один процесс не может прочитать что-либо из памяти (или записать в нее) другого процесса без «разрешения» на то другого процесса. Санкционированные взаимодействия между процессами допускаются системой.
Ядро предоставляет системные вызовы для создания новых процессов и для управления порожденными процессами. Любая программа может начать выполняться только если другой процесс ее запустит или произойдет какое-то прерывание (например, прерывание внешнего устройства).
В связи с развитием SMP (Symmetric Multiprocessor Architectures) в ядро Linux был внедрен механизм нитей или потоков управления (threads). Нить – это процесс, который выполняется в виртуальной памяти, используемой вместе с другими нитями процесса, который обладает отдельной виртуальной памятью.
Если интерпретатору (shell) встречается команда, соответствующая выполняемому файлу, интерпретатор выполняет ее, начиная с точки входа (entry point). Для С-программ entry point – это функция main. Запущенная программа тоже может создать процесс, т.е. запустить какую-то программу и ее выполнение тоже начнется с функции main.
Для создания процессов используются два системных вызова: fork() и exec. fork() создает новое адресное пространство, которое полностью идентично адресному пространству основного процесса. После выполнения этого системного вызова мы получаем два абсолютно одинаковых процесса – основной и порожденный. Функция fork() возвращает 0 в порожденном процессе и PID (Process ID – идентификатор порожденного процесса) – в основном. PID – это целое число.
Теперь, когда мы уже создали процесс, мы можем запустить программу с помощью вызова exec. Параметрами функции exec является имя выполняемого файла и, если нужно, параметры, которые будут переданы этой программе. В адресное пространство порожденного с помощью fork() процесса будет загружена новая программа и ее выполнение начнется с точки входа (адрес функции main).
В качестве примера рассмотрим этот фрагмент программы if (fork()==0) wait(0); else execl("ls", "ls", 0); /* порожденный процесс */
Теперь рассмотрим более подробно, что же делается при выполнении вызова fork():
Выделяется память для описателя нового процесса в таблице процессов Назначается идентификатор процесса PID Создается логическая копия процесса, который выполняет fork() – полное копирование содержимого виртуальной памяти родительского процесса, копирование составляющих ядерного статического и динамического контекстов процесса-предка Увеличиваются счетчики открытия файлов (порожденный процесс наследует все открытые файлы родительского процесса). Возвращается PID в точку возврата из системного вызова в родительском процессе и 0 – в процессе-потомке.
Общая схема управления процессами
Каждый процесс может порождать полностью идентичный процесс с помощью fork(). Родительский процесс может дожидаться окончания выполнения всех своих процессов-потомков с помощью системного вызова wait.
В любой момент времени процесс может изменить содержимое своего образа памяти, используя одну из разновидностей вызова exec. Каждый процесс реагирует на сигналы и, естественно, может установить собственную реакцию на сигналы, производимые операционной системой. Приоритет процесса может быть изменен с помощью системного вызова nice.
Сигнал – способ информирования процесса ядром о происшествии какого-то события. Если возникает несколько однотипных событий, процессу будет подан только один сигнал. Сигнал означает, что произошло событие, но ядро не сообщает сколько таких событий произошло.
Примеры сигналов:
окончание порожденного процесса (например, из-за системного вызова exit (см. ниже)) возникновение исключительной ситуации сигналы, поступающие от пользователя при нажатии определенных клавиш.
Установить реакцию на поступление сигнала можно с помощью системного вызова signal
func = signal(snum, function);
snum – номер сигнала, а function – адрес функции, которая должна быть выполнена при поступлении указанного сигнала. Возвращаемое значение – адрес функции, которая будет реагировать на поступление сигнала. Вместо function можно указать ноль или единицу. Если был указан ноль, то при поступлении сигнала snum выполнение процесса будет прервано аналогично вызову exit. Если указать единицу, данный сигнал будет проигнорирован, но это возможно не для всех процессов.
С помощью системного вызова kill можно сгенерировать сигналы и передать их другим процессам.
kill(pid, snum);
где pid – идентификатор процесса, а snum – номер сигнала, который будет передан процессу. Обычно kill используется для того, чтобы принудительно завершить («убить») процесс.
Pid состоит из идентификатора группы процессов и идентификатора процесса в группе. Если вместо pid указать нуль, то сигнал snum будет направлен всем процессам, относящимся к данной группе (понятие группы процессов аналогично группе пользователей). В одну группу включаются процессы, имеющие общего предка, идентификатор группы процесса можно изменить с помощью системного вызова setpgrp. Если вместо pid указать -1, ядро передаст сигнал всем процессам, идентификатор пользователя которых равен идентификатору текущего выполнения процесса, который посылает сигнал.
Таблица 1. Номера сигналов
Номер | Название | Описание |
01 | SIGHUP | Освобождение линии (hangup). |
02 | SIGINT | Прерывание (interrupt). |
03 | SIGQUIT | Выход (quit). |
04 | SIGILL | Некорректная команда (illegal instruction). Не переустанавливается при перехвате. |
05 | SIGTRAP | Трассировочное прерывание (trace trap). Не переустанавливается при перехвате. |
06 | SIGIOT или SIGABRT | Машинная команда IOT. |
07 | SIGEMT | Машинная команда EMT. |
08 | SIGFPE | Исключительная ситуация при выполнении операции с вещественными числами (floating-point exception) |
09 | SIGKILL | Уничтожение процесса (kill). Не перехватывается и не игнорируется. |
10 | SIGBUS | Ошибка шины (bus error). |
11 | SIGSEGV | Некорректное обращение к сегменту памяти (segmentation violation). |
12 | SIGSYS | Некорректный параметр системного вызова (bad argument to system call). |
13 | SIGPIPE | Запись в канал, из которого некому читать (write on a pipe with no one to read it). |
14 | SIGALRM | Будильник |
15 | SIGTERM | Программный сигнал завершения |
16 | SIGUSR1 | Определяемый пользователем сигнал 1 |
17 | SIGUSR2 | Определяемый пользователем сигнал 2 |
18 | SIGCLD | Завершение порожденного процесса (death of a child). |
19 | SIGPWR | Ошибка питания |
22 | Регистрация выборочного события |
Для нормального завершение процесса используется вызов
exit(status);
где status – это целое число, возвращаемое процессу-предку для его информирования о причинах завершения процесса-потомка.
Вызов exit может задаваться в любой точке программы, но может быть и неявным, например при выходе из функции main (при программировании на C) оператор return 0 будет воспринят как системный вызов exit(0);
Процессы в системе
Рассказ о жизни процессов естественно начать с самого начала - с их появления на свет. Так вот, процессы размножаются... почкованием: системный вызов Linux, создающий новый процесс, называется clone, а дочерний процесс представляет собой почти точную копию родительского. Только далее он выполняет назначенную ему функцию, а исходный процесс - то, что написано в программе после вызова clone. Потом отличий может стать больше, так что пути-дороги процессов способны разойтись достаточно далеко. Но если нам нужно этому воспрепятствовать, вызов clone позволит задать флаги, указывающие, что порожденный процесс будет иметь со своим предком общие:
адресное пространство (CLONE_VM); информацию о файловой системе (CLONE_FS): корневой и текущий каталоги, а также umask; таблицу открытых файлов (CLONE_FILES); таблицу обработчиков сигналов (CLONE_SIGHAND); родителя (CLONE_PARENT) - конечно, в этом случае будет порожден не дочерний, а сестринский процесс.
Прочие подстановки
Все остальные подстановки выполняются в пять шагов, в перечисленном ниже порядке.
1. Сначала выполняются подстановки в истории. На этом этапе подставляются строки из истории, которые соответствуют заданным командам. См. раздел Подстановки истории
2. Затем выполняется раскрытие псевдонимов (алиасов). Раскрытие алиасов выполняется немедленно, до того, как командная строка будет разобрана.
3, Затем выполняется подстановка процессов, параметров, команд, раскрытие арифметических выражений, и затем уже раскрытие выражений в скобках. Каждый из этих этапов подробно описан в справке по zsh.
4. Раскрытие имен файлов. На этом этапе происходит подстановка комбинаций строк и чисел с символом ~. Если используется комбинация с числом, то каталог берется из стека каталогов. Если используется строка, то она
используется как имя пользователя, и вместо сочетания ~ со строкой подставляется домашний каталог соответствующего пользователя.
5. И на последнем шаге происходит генерация имен файлов (globbing). См. раздел Генерация имен файлов
Полный перечень всех шаблонов и настроек вы сможете найти в справке по zsh.
Продолжение следует
Рассказом о квотировании заканчивается первая часть данной статьи. Во второй части мы продолжим знакомство с новыми возможностями NTFS: механизмом отслеживания распределенных связей и изменений томов, функциями для работы с разреженными файлами и шифрования данных.
Марк Русинович - доктор философии, редактор Windows 2000 Magazine. С ним можно связаться по адресу: mark@sysinternals.com или http://www.sysinternals.com/.
Продвинутая оптимизация Linux
X-Stranger
Эта статья проведет вас через различные шаги настройки вашего Linux и файловой системы под конкретный тип процессора, объем памяти и сеть.
Обычно такие настройки используются для серверов, позволяя повышать их быстродействие, но также будет полезно их использовать и для обычных настольных систем.
Первое, что мы будем изменять, это файл /etc/profile. Файл /etc/profile содержит системное окружение всех исполняемых программ. Все настройки, добавленные в этот файл, отражаются на переменные окружения вашей системы. Так, поместив в этот файл флаги оптимизации, мы получим увеличение производительности компилируемых программ. Чтобы выжать максимальную эффективность из ваших программ, при компиляции вы можете использовать флаг -09, обозначающий полную оптимизацию по скорости. В Makefile многих программ, которые вы компилируете, содержится опция -02. Но, поставив вместо нее -09, мы получим высший уровень оптимизации, при которой размер файла увеличивается, но увеличивается и скорость выполнения.
Замечание. Использование опции -09 не всегда приводит к наилучшим результатам. Опцию следует использовать для процессоров x686 и выше, но не для более старых процессоров.
Также при компиляции можно использовать опцию -fomit-frame-pointer, которая говорит, что для доступа к переменным нужно использовать стек. К сожалению, с этой опцией практически невозможна отладка. Также можно использовать переключатели -mcpu=cpu_type и -march=cpu_type, при помощи которых создается код, оптимизированный под определенный CPU. Полученный код будет работать только на заданном процессоре или более новом.
Итак, приведенные ниже оптимизационные флаги запишем в файл /etc/profile (они влияют только на программы, которые вы будете компилировать в дальнейшем, и не оказывают никакого действия на существующие файлы):
? для CPU i686 или PentiumPro, Pentium II, Pentium III в файл "/etc/profile" добавьте следующую строку: CFLAGS='-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions'
? для CPU i586 или Pentium в файл "/etc/profile" добавьте следующую строку: CFLAGS='-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions'
? для CPU i486 в файл "/etc/profile" добавьте следующую строку: CFLAGS='-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions'
Сразу же после выбора типа процессора добавим в строку export файла "/etc/profile" переменные "CFLAGS LANG LESSCHARSET":
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET
Теперь выйдите из системы и вновь в нее войдите, чтобы опции, определенные переменной CFLAGS, вступили в силу и все программы и другие configure-утилиты стали ее учитывать. Оптимизация под Pentium (Pro/II/III) будет работать только с компиляторами egcs и pgcc. Egcc уже входит в стандартную поставку Linux. Ниже приведено описание опций, которые мы использовали:
-funroll-loops ? выполняется оптимизация развертыванием циклов. Осуществляется для циклов, число итераций которых может быть определено во время компиляции или во время выполнения.
-funroll-all-loops ? выполняется оптимизация развертыванием циклов. Развертывает все циклы, и обычно программы, скомпилированные с этой опцией, медленнее запускаются.
-ffast-math ? эта опция разрешает GCC нарушать некоторые ANSI или IEEE правила и/или спецификации в интересах оптимизации кода по скорости выполнения. Например, это позволяет компилятору предполагать, что параметры к функции sqrt ? неотрицательные числа.
-malign-double ? контролирует, выравнивает ли GCC double, long double и long long переменные на двусловной границе или однословной границе.
Выравнивание double переменных на двусловной границе создает код, который выполняется на Pentium-процессорах несколько быстрее, расходуя больше памяти.
-mcpu=cpu_type ? определяет значение типа процессора при планировании используемых инструкций. При определении конкретного типа CPU, GCC будет использовать инструкции специфичные для него. Если эта опция не определена, то будут использоваться только команды, работающие на i386 процессоре. Тип процессора I586 эквивалентен Pentium, i686 эквивалентен Pentium Pro, K6 ? AMD.
-march=cpu_type ? использовать инструкции для процессора cpu_type. Выбор типа процессора производится так же, как и для опции mcpu. Кроме того, использование опции -march=cpu_type подразумевает и использование опции -mcpu=cpu_type.
-fforce-mem ? принуждает копировать операнды, хранящиеся в памяти, в регистры перед выполнением арифметических операций над ними. В результате получается более лучший код, в котором все ссылки на ячейки памяти потенциально общие подвыражения. Когда они не являются общими подвыражениями, то комбинации команд должны устранить отдельную загрузку регистра.
-fforce-addr ? вынуждает копировать постоянные адреса памяти в регистры перед выполнением арифметических операций над ними. В результате может создаваться более хороший код, так же как и при -fforce-mem.
-fomit-frame-pointer ? не сохранять frame pointer в регистре для функций, которые не нуждаются в этом. Это позволяет избежать инструкций на сохранение, определение и восстановление frame pointer, в то же время освобождая регистры для других функций. Это также делает невозможным отладку программы.
Следующее, на что стоит обратить внимание, это файл bdflush. Он вплотную связан с операциями в подсистеме виртуальной памяти ядра Linux и имеет некоторое влияние на использование диска. Этот файл (/proc/sys/vm/bdflush) контролирует операции демона ядра bdflush. Мы используем этот файл для улучшения производительности файловой системы. Изменяя некоторые значения в файле, принятые по умолчанию, мы добьемся, чтобы система стала более "отзывчивой", например, она ждет чуть больше при осуществлении записи на диск, что позволяет таким образом избегать некоторых конфликтов доступа.
За основу возьмем Red Hat Linux. По умолчанию bdflush в Red Hat Linux использует следующие значения: "40 500 64 256 500 3000 500 1884 2".
Для изменения значений в bdflush введите следующие команды на вашем терминале:
echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush
Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Для более свежих дистрибутивов следует использовать другой способ: в файл /etc/sysctl.conf добавьте следующую строку:
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
Чтобы изменения вступили в силу, надо перезагрузить систему.
В вышеприведенном примере согласно файлу документации /usr/src/linux/Documentation/sysctl/vm.txt первый параметр в % определяет максимальное число "грязных" буферов в кэше буферов. "Грязные" означают то, что содержимое буфера должно быть записано на диск. Присвоение этому параметру высокого значения означает, что Linux в течение долгого времени может задерживать запись на диск, но в то же время это означает, что когда это все же потребуется, то сброс всех буферов будет осуществляться дольше, т.к. самих "грязных" буферов будет больше. Низкое значение будет распределять операции ввода-вывода более равномерно.
Второй параметр (ndirty), которому мы присвоили значение 1200, определяет максимальное число "грязных" буферов, которые могут быть одновременно записаны. Высокое значение означает как бы отложенные, пульсирующие операции ввода-вывода, в то время как маленькое значение может приводить к нехватке памяти.
Третье значение (nrefill=128) определяет число буферов, которые bdflush будет добавлять в список свободных при вызове функции refill_freelist(). Чем выше число, тем больше памяти будет потрачено впустую и тем реже будет необходимо вызывать refill_freelist().
Следующий параметр ? nref_dirt=512. Когда refill_freelist() натолкнется на больше, чем nref_dirt "грязных" буферов, то просыпается демон bdflush.
Параметры age_buffer (50*m) и age_super parameters (5*m) обозначают максимальное время, которое Linux ждет перед записью грязных буферов на диск. Значение выражено в мигах (clockticks), число мигов в секунду m=100. Как описывается в английской литературе, "age_buffer это "возраст" блоков данных, а age_super ? "возраст" метаданных файловой системы" (дословный перевод).
Пятый параметр (15) и последние два (1884 и 2) не используются системой, так что мы оставим их значения по умолчанию.
Замечание. Читайте /usr/src/linux/Documentation/sysctl/vm.txt о том, как улучшить параметры ядра, связанные с виртуальной памятью.
Файл buffermem. Этот файл тесно связан с работой подсистемы виртуальной памяти Linux ядра. Значения в этом файле (/proc/sys/ vm/buffermem) контролируют, как много памяти используется под буферную память (в процентах). Следует отметить, что проценты берутся от общей системной памяти. Значение по умолчанию в buffermem для Red Hat:
"20 10 60"
Для изменения значений параметров используйте следующие команды:
echo "80 10 60" >/proc/sys/vm/ buffermem
Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Или отредактируйте файл "/etc/sysctl.conf" и добавьте следующую строку:
vm.buffermem = 80 10 60
Чтобы изменения вступили в силу, стоит перезагрузить систему.
В вышеприведенном примере согласно файлу документации /usr/src/linux/Documentation/sysctl/vm.txt первый параметр (80%) говорит использовать минимум 80% системной памяти под буферный кэш (минимальное число процентов памяти, которое должно быть использовано под буферную память). Последние два параметра (10 и 60) не используются системой, и мы их оставляем без изменений.
Замечание. О том, как улучшить параметры ядра, связанные с виртуальной памятью, читайте в файле /usr/src/linux/Documentation/sysctl/vm.txt.
Файл ip_local_port_range. Этот файл содержит два целых числа, определяющих интервал портов, которые используют TCP и UDP при выборе локального порта. Первое число ? это нижнее возможное значение, а второе ? верхнее. В серверных системах эти числа имеют значения 32768 и 61000 соответственно. По умолчанию в Red Hat файл ip_local_port_range содержит значения "1024 4999". Чтобы изменить эти значения, используйте следующие команды:
echo "32768 61000" > /proc/ sys/net/ipv4/ip_local_port_range
Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Или отредактируйте файл /etc/sysctl.conf и добавьте следующую строку:
net.ipv4.ip_local_port_range = 32768 61000
Чтобы изменения вступили в силу, стоит перезагрузить систему.
Файл /etc/nsswitch.conf. Этот файл используется для настройки того, какой сервис использовать для получения такой информации, как имя хоста, файл паролей, файл с группами и т.д. Два последних пункта (файл с паролями и файл с группами) рассматриваться не будут. Таким образом, акцентируем наше внимание на строке hosts. Отредактируйте файл nsswitch.conf и измените строку hosts, чтобы она читалась:
hosts: dns files
которая говорит программам, желающим определить адреса, что вначале необходимо воспользоваться службой DNS, а затем, если DNS не отвечает, файлом "/etc/hosts". Также настоятельно рекомендуется удалить все вхождения NIS из каждой строки, если вы не используете NIS. В результате файл /etc/nsswitch.conf может выглядеть следующим образом:
passwd: files
shadow: files
group: files
hosts: dns files
bootparams: files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
automount: files
aliases: files
Файл file-max. Значение в этом файле определяет максимальное число дескрипторов файлов, которые может распределить ядро. Мы настраиваем этот файл на увеличение числа открытых файлов. Для серверных систем рекомендуется следующее правило: увеличьте значение /proc/sys/fs/file-max до значения примерно равного 256 на каждые 4M RAM, например, для машины со 128 M установите значение равное 8192 (128/4=32, 32*256=8192). По умолчанию в Red Hat file-max равен 4096. Чтобы изменить эти значения, используйте следующие команды:
echo "8192" >/proc/sys/fs/file-max
Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Или отредактируйте файл "/etc/sysctl.conf" и добавьте следующую строку:
fs.file-max = 8192
Чтобы изменения вступили в силу, стоит перезагрузить систему.
Замечание. Когда вы начинаете получать много ошибок о выходе за пределы файловых дескрипторов (running out of file handles), увеличьте значение file-max. Файловому и веб-серверам нужно много открытых файлов.
Файл inode-max. Этот файл (/proc/sys/fs/inode-max) определяет максимальное число дескрипторов блоков индексов (inode). В нашем примере мы настраиваем этот файл на увеличение числа открытых блоков индексов (inode), увеличивая "/proc/sys/fs/inode-max" до значения в 3-4 раза большего (8192*4=32768) числа открытых файлов (file-max). Это обусловлено тем, что на каждый открытый файл приходится как минимум 1 блок индекса, а для больших файлов ? намного больше. По умолчанию в Red Hat inode-max равен 16376. Чтобы изменить эти значения, используйте следующие команды:
echo "32768" >/proc/sys/fs/ inode-max
Вы можете добавить эту команду в /etc/rc.d/rc.local, чтобы она выполнялась каждый раз при загрузке компьютера. Или отредактируйте файл /etc/sysctl.conf и добавьте следующую строку:
fs.inode-max = 32768
Чтобы изменения вступили в силу, стоит перезагрузить систему.
Замечание. Если вы регулярно получаете сообщение run out of inodes, то вам необходимо увеличить значение inode-max. Помните, что этот параметр зависит от file-max. Файловому и веб-серверам требуется много открытых индексных блоков.
Параметр ulimit. Linux имеет ограничение "Max Processes" для каждого пользователя. Этот параметр показывает, как много процессов может иметь пользователь. Для улучшения производительности вы можете спокойно увеличить это значение для пользователя root, сделав его неограниченным. Добавьте следующую строку в файл /root/.bashrc:
ulimit -u unlimited
Теперь вы должны перелогиниться (сделать logout и login). Для проверки, что вы все сделали правильно, дайте команду (как root):
ulimit -a
в строке с max user processes должен быть текст "unlimited".
Увеличим также системные ограничения на открытые файлы. Процесс в Red Hat 6.0 с ядром 2.2.5 может открыть не меньше 31000 файловых дескрипторов и процесс на ядре 2.2.12 ? не меньше 90000 файловых дескрипторов (согласно установленным ограничениям). Верхняя граница зависит от доступной памяти. Увеличение этого числа до 90000 для пользователя root делается следующим образом: отредактируйте файл /root/.bashrc, добавив следующую строку:
ulimit -n 90000
Теперь вы должны перелогиниться. Для проверки, что вы все сделали правильно, дайте команду (как root):
ulimit -a
в строке с open files должен быть текст "90000".
Атрибут atime (access time). В дополнении к информации о дате создания и последней модификации файла, Linux создает запись о последнем обращении к файлу. Эта информация не очень полезна и при этом происходят затраты системных ресурсов на ее ведение. Файловая система ext2 позволяет суперпользователю маркировать отдельные файлы, чтобы запись о времени последнего доступа к ним не велась. Это может существенно улучшить эффективность системы, особенно, если установить этот атрибут для часто используемых файлов, например, для /var/spool/news. Для установки атрибута на один файл используется команда:
chattr +A filename
Для всех файлов в каталоге:
chattr -R +A /var/spool/
Для снятия же атрибута надо писать не +A, а -A.
Атрибут noatime. Linux имеет опцию монтирования файловой системы, называемую noatime. Она может быть добавлена в поле опций файла /etc/fstab. Если файловая система смонтирована с этой опцией, то при доступе к ней по чтению информация atime изменяться не будет. Важность установки опции noatime в том, что она устраняет необходимость операции записи в файловую систему для файлов, которые просто читаются. Так как запись "дорогая" операция, то ее отсутствие может существенно улучшить эффективность системы. Обратите внимание, что информация wtime продолжает изменяться при записи в файл. В нашем примере мы устанавливаем опцию noatime для файловой системы /mnt/linux_games. Отредактируйте файл /etc/fstab и добавьте, например, такую строку:
/dev/hda7 /mnt/linux_games ext2 defaults,noatime 1 2
Перезагрузите вашу систему и проверьте, что у вас получилось:
reboot
cat /proc/mounts
В результате одной из строк, выводимых на экране, должна быть
/dev/hda7 /mnt/linux_games ext2 rw,noatime 0 0
Мы видим, что /mnt/linux_games имеет атрибут noatime.
Swap-раздел. Поместите ваш swap-раздел вблизи начала вашего диска, которое физически располагается на внешней стороне цилиндра. В результате за один оборот головка охватывает большую поверхность. При помощи команды hdparm -t я вижу, что с разделом, помещенным в конце диска, скорость работы на 3 MB/s медленнее.
Настройка производительности IDE-дисков. Быстродействие IDE- дисков увеличивается при использовании UDMA. Ядро использует консервативный режим работы с дисками, пока ему не скажешь изменить это. "Волшебная" команда для изменения установок ? это hdparm. Включение 32-bit I/O через шину PCI:
/sbin/hdparm -c 1 /dev/hda (или hdb, hdc и т.д.)
Руководство man для hdparm говорит, что для некоторых чипсетов нужно использовать "-c 3". Все (E)IDE диски до сих пор имеют 16-разрядное подключение через ленточный кабель к интерфейсной карте. Включение DMA:
/sbin/hdparm -d 1 /dev/hda (или hdb, hdc и т.д.)
Возможность использования этой команды зависит от поддержки чипсета вашей материнской платы ядром. При включении DMA отменяется синхронизация буферизированного чтения диска, в результате чего быстродействие может увеличиться в 2 раза. Для включения multiword DMA mode 2:
/sbin/hdparm -d 1 -X34 /dev/ hda (или hdb, hdc и т.д.).
Эта установка используется для (E)IDE/ATA2 дисков (посмотрите документацию к вашему диску). Для включения UltraDMA mode2:
/sbin/hdparm -d 1 -X66 /dev/ hda (или hdb, hdc и т.д.)
Вам нужно будет заранее подготовить ваш чипсет к использованию UltraDMA, так что прочитайте man-ы к hdparm. Используйте этот режим очень осторожно!
Для включения multiple sector mode I/O:
[root@deep]# /sbin/hdparm -m XX /dev/hda (или hdb, hdc и т.д.)
где "XX" ? максимальные установки, поддерживаемые вашим диском. Для поиска максимальных значений установленных жестких дисков может использоваться флаг -i (в выводимой информации смотрите значение MaxMultSect).
Многосекторный режим (IDE Block Mode) поддерживается большинством современных IDE жестких дисков, передача нескольких секторов за одно I/O прерывание быстрее, чем обычное односекторное. Когда эта возможность включена, обычно, понижаются "накладные расходы" на операциях ввода/вывода на 30-50%. На многих системах в результате также увеличивается пропускная способность от 5% до 50%. Вы можете проверить, чего добились, запустив hdparm в режиме проверки производительности:
/sbin/hdparm -t /dev/hda (или hdb, hdc и т.д.)
Как только вы определили все параметры hdparm, не забудьте добавить соответствующие команды в файл /etc/rc.d/rc.local.
Последнее, что мы сделаем, это заставим Linux обрабатывать большее число TCP/IP соединений за определенное время. Нижеописанные настройки уменьшают время TCP/IP подключения, чтобы можно было обработать больше соединений за тот же интервал. Также будет уменьшено время, которое Linux ждет до закрытия соединения, и время, через которое Linux разрывает устаревшее соединение. Эти настройки отключат некоторые расширения протокола TCP/IP, которые нам не нужны. Значения параметров TCP/IP стека, принятые в Red Hat по умолчанию:
tcp_fin_timeout "180"
tcp_keepalive_time "7200"
tcp_window_scaling "1"
tcp_sack "1"
tcp_timestamps "1"
Чтобы изменить параметры TCP/IP, используйте следующие команды:
echo 30 > /proc/sys/net/ipv4/ tcp_fin_timeout
echo 1800 >/proc/sys/net/ipv4/ tcp_keepalive_time
echo 0 > /proc/sys/net/ipv4/ tcp_window_scaling
echo 0 > /proc/sys/net/ipv4/ tcp_sack
echo 0 > /proc/sys/net/ipv4/ tcp_timestamps
Вы можете добавить эти команды в /etc/rc.d/rc.local, чтобы они выполнялись каждый раз при загрузке компьютера. Или отредактируйте файл /etc/sysctl.conf и добавьте следующие строки:
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
Чтобы изменения вступили в силу, стоит перезагрузить систему.
Мы рассмотрели некоторые ухищрения, которые помогают заоптимизировать систему. Но многие спрашивают, а почему я не написал про то, как освободить память или, скажем, "обрезать" Linux. Исправляю эту оплошность.
Начнем с того, что заставим наш Linux занимать меньше места на винчестере. Для этого нам понадобятся следующие инструменты: архиваторы gzip или bzip2 (жмет лучше, чем первый), входящие в любой современный дистрибутив, и упаковщик исполняемых файлов upx, который можно найти в Интернете. Не помешает также иметь ровные руки и трезвую голову:).
Итак, приступим. Для начала мы удалим исходные тексты ядра. Вы могли их поставить просто случайно, ставя первый раз Линукс или просто так, но я практически на сто процентов уверен, что вы ими не пользуетесь. А так как исходные тексты ядра занимают 20-100 и больше мегабайт, то, скорее всего, вы захотите их удалить. Если так, то откомпилируйте новое ядро, которое будет работать с вашей машиной, и освободитесь от исходных текстов. Они лежат в /usr/src/linux. Но удалять их лучше разынсталлируя пакет, их содержащий. Не рекомендуется удалять исходные тексты ядра до тех пор, пока вы не удостоверитесь, что новое ядро, которое вы, возможно, создали, правильно установлено и работает. Кроме того, вам могут понадобиться header-файлы ядра для того, чтобы компилировать программы на C.
Теперь приступим к удалению лишних приложений. Решите, какие приложения вам на самом деле необходимы. Некоторые могут оказаться излишествами: например, уверены ли вы в том, что вам очень нужен Emacs? Вместо него можно использовать другой, более мелкий и удобный текстовый редактор. От вас зависит, что оставлять, а что удалять. Вот несколько основных принципов:
? компилятор gcc довольно велик по размеру. Он используется для компиляции ядра и практически всех программ Linux. Разумеется, он вам понадобится, если вы будете писать собственные программы на C, поэтому определитесь с вашими потребностями, перед тем как удалить его. Также можно удалить все остальные пакеты для разработки программ, если вы не программист;
? X11/X-Window система еще больше, но это вещь, которую хотелось бы иметь под рукой. Если вы решились его удалить, то не удаляйте все, постарайтесь обойтись необходимым минимумом: нужный Х-сервер, один простенький менеджер окон, единственный xterm, никаких шрифтов на 100 dpi, и т.п.;
? TeX и сопутствующие программы занимают большой объем. Уход от LaTeX и переход на чистый TeX сэкономит много места; это же дает удаление программ предварительного просмотра в X11, таких как xdvi и ghostview, и, возможно, если у вас есть dvitty, dvivga или некоторые им подобные;
? игры никогда не являются "необходимостью";).
Практически все программы можно удалить, просто удалив пакет, который их содержит. Для этого используются программы kpackage и gnorpm.
Теперь давайте приступим к уменьшению объема самих программ. Перейдите в /usr/bin и наберите команду
strip *
Она удалит из запускамых файлов всю информацию, которая может понадобиться только тем, кто занимается debug'ом программ, но не относится к телу программы. Повторите это действие в /usr/X11R6/bin и других каталогах, содержащих исполняемые программы (не забывайте про программы TeX и gcc), но не делайте этого в /sbin, /bin или /usr/sbin, т.к. здесь это особо не уменьшит размер файлов, но может повредить некоторые из них.
Следующий шаг ? сжатие программ при помощи upx. Сначала установите upx и прочтите документацию к нему. Затем перейдите в /usr/bin и запустите там команду
upx *
Она закомпрессирует все исполняемые файлы. Повторите эти действия во всех каталогах, описанных выше. Помните, что архивировать исполняемые файлы надо всякий раз, когда вы устанавливаете новую программу. Т.е. заново пересжимать уже сжатые файлы, конечно, никто не будет, но только что установленные будут сжаты.
Есть множество других файлов, которые можно заархивировать раз и навсегда. Начнем с каталога /usr/doc. Перейдите в этот каталог и наберите команду
find. -type f -exec gzip -9 {} ; 2> /dev/null
Эта команда сожмет все файлы документации, расположенные в данном каталоге. Но это не помешает их смотреть, т.к. при просмотре в большинстве случаев автоматически происходит распаковка сжатых gzip или bzip2 файлов. Помните, что архивировать документацию надо всякий раз, когда вы устанавливаете новую программу, к которой прилагается документация. Здесь справедлив тот же принцип, который применялся к предыдущему пункту. Повторите эти действия в других ваших каталогах, содержащих документацию. Если же использовать при сжатии архиватор bzip2, то результат операции будет лучше, но распаковка будет чуть медленнее. Если вы уверены, что документация вам не нужна, то вы просто можете удалить все эти каталоги.
С "обрезанием" и уменьшением Linux' а покончено. Теперь можно приступить к освобождению памяти.
Начнем с ядра. Все ядра Linux, которые поставляются вместе с дистрибутивами, раздуты и поддерживают множество возможностей, которые вам могут никогда не понадобиться. Если вы еще не пересобирали ядро, то можете попробовать это сделать, но здесь нужен трезвый ум и полное понимание того, что делаешь. Существуют множество прекрасных книг и руководств по Linux, которые также рассказывают об этом, а я тоже писал про это в последних "Вопросах и ответах".
Если вы пересобираете ядро, запомните, что совсем не надо использовать все возможности ядра. Например, как часто вы включаете, к примеру, поддержку PLIP в ядро? Как часто вы будете это использовать? Маленькое ядро требует меньше времени для загрузки, меньше памяти и меньше загружает процессор.
Другая важная вещь в ядре ? модули. Использование модулей позволяет не держать код ядра, который реализует какую-нибудь фишку, в памяти, а подгружать его только тогда, когда это необходимо.
Виртуальные консоли ? это прекрасный путь освободить память. Большинство дистрибутивов Linux запускают около 6 виртуальных консолей ? именно между ними вы переключаетесь, используя комбинации Alt+F1 ? Alt+F6. В среднем, использование 6 консолей требует около 4 Мб памяти. Если убрать пару консолей, можно освободить пару мегабайт памяти. Большинство пользователей используют 3-4 консоли. Например, я использую только две. Сколько консолей вы оставите ? это ваше личное дело. Просто запомните, что чем меньше виртуальных консолей вы используете, тем больше памяти остается для работающих приложений. Количество используемых консолей описывается в файле /etc/inittab. Для того чтобы убрать виртуальную консоль, загрузите /etc/inittab в текстовый редактор, найдите строки, похожие на:
c1:12345:respawn:/sbin/getty tty1 38400 linux
c2:12345:respawn:/sbin/getty tty2 38400 linux
Начиная с наибольшего номера (например, c6), закомментируйте строку, поставив знак '#' в начале строки. Повторите этот шаг столько раз, сколько вам нужно. Запомните, каждая закомментированная строка убирает одну виртуальную консоль. Перезапустите систему, чтобы изменения вступили в силу.
Большинство дистрибутивов Linux запускают множество демонов (что это такое, я уже писал раньше; но _грубо_ говоря это типа сервисов, как в Win2k, но только лучше), которые никогда не используются. Чаще всего они запускаются через скрипты. Где находятся скрипты и какие из них запускаются, зависит от дистрибутива. Чаще всего их можно найти в /etc/rc.d/rc.*.
Прежде чем продолжить, стоит сказать, что вам было бы неплохо уметь писать скрипты. Книга по скриптам лежит на моем сайте в разделе документации. Для тех, кто уже знаком со скриптами, напомню, что скрипт должен начинаться со строки "#!/bin/sh" или подобной, после которой каждая строка запускается командным интерпретатором так, как будто она была введена с клавиатуры (так что скрипт ? не что иное, как простые макросы клавиатуры).
Строки, начинающиеся с '#', являются комментариями и не исполняются. Большинство скриптов запуска демонов выглядят следующим образом:
if условие then
что-то
fi
Все, что мы хотим сделать ? это закомментировать строки между if и fi.
Для того чтобы найти скрипт, в котором запускается демон, нужно поискать скрипт на предмет наличия в нем названия демона. Если я хочу найти, где запускается inetd, то должен сделать следующее:
cd /etc/rc.d
grep -n inetd rc.*
Кратко перечислю демоны, которые можно удалять (список не претендует на полноту и достаточность):
? inetd ? этот демон поддерживает такие вещи, как telnet, ftp и talk. Если вы не используете свою машину как сервер или не хотите иметь удаленный доступ к своей машине, то можете убрать inetd;
? lpd ? используется для печати файлов на принтере командой lpr. Если вы не пользуетесь печатью на своей машине, то можете убрать lpd;
? nfsd и mountd ? это два демона, образующие NFS сервер. Если вы не используете свою машину как NFS сервер, то можете спокойно убрать эти два демона;
? portmap ? этот демон используется для поддержки сервиса RPC. Если вы не используете NFS или любую другую программу, использующую RPC, то можете убрать portmap;
? sendmail ? это еще один демон, требующий достаточно много памяти. Если вы не используете свою машину в качестве почтового сервера, то можете убрать sendmail. Если вы пользуетесь электронной почтой, то программу чтения почты можно настроить на другой почтовый сервер.
Могут быть также другие демоны в системе, которые вам не нужны. Удалите их, если они не нужны. Вы должны обязательно оставить только два демона ? это syslogd и klogd, которые ведут логи вашей Линукс-системы.
В более новых дистрибутивах запуск демонов прописан другим способом. В etc/rc.d есть другие подкаталоги, каждый из которых соответствует определенному runlevel'у. Для отключения какого-либо сервиса достаточно удалить соответствующую символическую ссылку в нужном каталоге на скрипт, запускающий этот сервис. Все скрипты, как правило, лежат в /etc/rc.d/init.d. Стоит также заметить, что еще проще и удобнее делать отключение сервисов при помощи соответствующих конфигурационных программ: linuxconf, drakconf (для Mandrake Linux).
Вот и все. Стоит заметить, что результат выполнения вышеописанных действий зависит лишь от того, насколько вы разобрались в Linux. Так что используйте эти принципы на свой страх и риск. А также побольше читайте документацию (RTFM ? кто знает, тот поймет;). Удачи!
Источник - LinuxBegin.ru
http://linuxbegin.ru
Адрес этой статьи:
http://linuxshop.ru/linuxbegin/article73.html
Продвинутые средства общения
Процессы посылают друг другу сигналы, передают данные через неименованные и именованные каналы, а также "гнезда". Все это замечательно, но как быть, если один процесс должен передавать другому огромные объемы информации и притом быстро (это нужно, например, при воспроизведении видео)? Могут ли процессы, адресные пространства которых строго разделены, каким-либо образом получить в совместное пользование часть памяти? Да, с помощью временных файлов.
Для передачи обширных массивов данных между процессами служит системный вызов mmap, представляющий собой довольно неожиданное применение страничной виртуальной памяти. Он позволяет, грубо говоря, сказать: "я хочу обращаться к такому-то участку такого-то файла как к оперативной памяти". Данные, которые процесс читает из указанной области памяти, по мере надобности считываются из файла, а те, которые он туда пишет, когда-нибудь попадут на диск. Но процесс сам не работает с диском, этим занимается ядро.
Если два процесса обращаются таким образом к одному и тому же участку одного и того же файла, данные будут переданы непосредственно от одного процесса к другому. Конечно, периодически ядро сбрасывает данные на диск. В некоторых случаях это полезно, но когда mmap обеспечивает только общение процессов между собой, обмен с диском лишь замедляет работу. Для процессов, имеющих общего предка, можно использовать флаг MAP_ANONYMOUS, указывающий, что данные не должны попадать в файл (дескриптор файла тогда никак не используется и может быть любым).
Вызов mmap применяется также для "загрузки в память" исполняемых файлов и библиотек, так что если программа использует 25 библиотек общим объемом во много десятков мегабайт, это вовсе не значит, что она и в памяти будет занимать такое же количество мегабайт.
С помощью временных файлов можно, кроме того, синхронизировать работу процессов, используя возможности системы, предназначенные для работы с рекомендательными (advisory) блокировками файлов. Это позволяют сделать системные вызовы fcntl и его более быстрый и простой вариант flock.
Иногда создавать временные файлы нежелательно, поэтому в Linux включены также функции для общения процессов из Unix SVR4 (Unix System V Release 4). Это shmget - создание области памяти для общения процессов, semget - создание семафора, msgget - создание очереди сообщений. В версии 2.4 к ним добавились еще более мощные функции mq_open, shm_open из SUS2 (Single Unix Specification Version 2).
Программа для редактирования раскладки - xkeycaps
Вообще-то, нормальной программы для создания/редактирования раскладок клавиатур в формате XKB - не существует.
Но при желании, для этой цели можно использовать "редактор xmodmap'ов" - xkeycaps. Обратите внимание, что она позволяет на каждую клавишу "подвешивать" до 8-и символов. Что вполне соответствует "четырем группам по два уровня" в терминах XKB.
И хотя она и сохраняет результат вашей работы в формате xmodmap, преобразовать его в формат файла типа xkb_symbols достаточно просто. Можете воспользоваться моим "скриптом" modmap2xkb, который делает это автоматически (конечно, программка очень "сырая". Если у кого-то есть желание ее улучшить - welcome).
Не могу не заметить, что xkeycaps в нынешнем виде - довольно плохой редактор. И дело даже не в том, что она не работает с файлами XKB и, соответственно, не может использоваться для редактирования xkb_types, xkb_compat и т.п. и, кроме того, не использует "геометрию" из xkb_geometry (все "геометрии" "зашиты" в самой программе).
Основные ее недостатки в том, что
нет групповых операций - перемещения символов сразу всех (или выбраных) клавиш в другую группу вообще нет "вырезания-вставки" даже для одной клавиши нет возможности "подгружать" раскладки из файлов (даже в формате xmodmap). Выбирать можно только из тех раскладок, которые "вшиты" в саму программу. и наконец - при сохранении результата она сама сочиняет имя файла (если вы хотите наделать несколько раскладок, вам после каждого сохранения придется вручную переименовывать файл)
Короче, xkeycaps представляет собой скорее забавный "эмулятор клавиатуры", чем полноценный "редактор раскладок".
Программа fkeyc
Просто "вычитывает" из syscons последовательности, генерируемые "функциональными" клавишами.
Никаких специальных библиотек не требует.
Программа kbdcontrol
Загрузка таблицы раскладки клавиатуры.
Изменение последовательностей, которые выдают клавиши fkey.
Изменение размера буфера терминала.
Другие команды
Общие замечания.
Программа kbdcontrol служит для управления параметрами syscons, которые относятся к клавиатуре.
Полное ее описание можно посмотреть в соответствующем man'уале (man kbdcontrol).
Я только опишу ее основные функции.
Программа на C
Код программы на C, являющийся "ракетоносителем" (точнее "программоносителем" 8-), приведен ниже. Сохраните его в файле write.c.
#include <sys/types.h> /* unistd.h needs this */ #include <unistd.h> /* contains read/write */ #include <fcntl.h>
int main() { char boot_buf[512]; int floppy_desc, file_desc;
file_desc = open("./bsect", O_RDONLY);
read(file_desc, boot_buf, 510); close(file_desc);
boot_buf[510] = 0x55; boot_buf[511] = 0xaa;
floppy_desc = open("/dev/fd0", O_RDWR);
lseek(floppy_desc, 0, SEEK_SET); write(floppy_desc, boot_buf, 512);
file_desc = open("./sect2", O_RDONLY); read(file_desc, boot_buf, 510); close(file_desc);
lseek(floppy_desc, 512, SEEK_SET); write(floppy_desc, boot_buf, 512);
close(floppy_desc); }
В первой части статьи я описал, как создать загрузочную дискету. В данном примере есть небольшие отличия. Сперва мы копируем в загрузочный сектор файл bsect, исполняемый код которого генерируется из bsect.s. Затем наступает очередь sect2 -- мы записываем его во второй сектор флоппи-диска. Вот и всё, изменения, делающие дискету загрузочной, выполнены.[6]
Программа pw
Программа pw - универсальная утилита для администрирования (создания, удаления, изменения, просмотра) и юзеров и групп.
Для "ведения" групп ее нужно вызывать с параметрами
pw group add группа- добавить группу
pw group del группа - удалить группу
pw group mod группа - "модифицировать" группу
(параметр группа может быть как именем группы, так и номером - groupID).
Последняя команда может использоваться для дополнения списка членов группы
pw group mod группа -m юзер1,юзер2,...
или полной замены этого списка (то есть, "старые" члены группы удаляются, а новые вписываются).
pw group mod группа -M юзер1,юзер2,...
Подробнее об этой команде (утилите) можно почитать в соответствующем man'уале (man pw). Ну, а чтобы не лазить в man каждый раз, когда захотите воспользоваться этой командой, можно вызвать ее с параметром help, например
pw group mod help
она выдаст вам список допустимых для данной операции ключей, с кратким пояснением.
О "полезности" этой программы могу сказать то же самое, что и о предыдущих. В обычных случаях все изменения в /etc/groups можно сделать и "вручную". Пользоваться этой программой имеет смысл только, если у вас очень много групп или вы уже привыкли ее использовать для администрирования юзеров.
Ну, и кроме того, ее удобно вставлять в командные файлы (скрипты). Конечно, создание и удаление групп достаточно редкая операция, а вот добавление юзеров в какую-нибудь группу (или даже в несколько сразу), вам, возможно, захочется "автоматизировать".
Программа reset_kbdc
Это программка очень специфического назначения.
Иногда, при "кривом" завершении программы X-сервер, клавиатура остается в режиме "сырых" скан-кодов. При этом, естественно, переключится в другой "виртуальный терминал" невозможно. Но, если к этой машине есть доступ телнетом, то можно исправить положение, вернув клавиатуру в нормальный режим.
Я обнаружил, что программа из комплекта XFree, которая должна это делать (kbd_mode), на самом деле свою задачу не выполняет (поскольку посылает команду на самый первый виртуальный терминал, а не на текущий).
Так вот, эта моя программка сама определяет текущий виртуальный терминал и "исправляет" клавиатуру именно на нем.
Для исполнения требуются привелегии root'а.
Иван Паскаль pascal@tsu.ru
Программа scancodec
Показывает скан-коды клавиш, именно в таком виде, в каком они указываются в таблице раскладки клавиатуры.
Ее надо "собрать" с библиотекой ncurses
сс scancode.c -lncurses -o scancode
Если вы хотите, чтобы она показывала и "код отпускания" клавиши, уберите проверку if (c > 0) или объявите c как unsigned char.
Если вас интересуют "сырые" скан-коды, то замените K_CODE на K_RAW
Программа vidcontrol
Программа vidcontrol служит для управления параметрами syscons, которые относятся к отображению на дисплее выводимой информации.
Полное ее описание можно посмотреть в соответствующем man'уале (man vidcontrol), а "краткую сводку" команд вы получите, если запустите ее без каких-либо аргументов.
Я только опишу ее основные функции.
Установка "режима отображения".
Загрузка шрифтов.
Загрузка "таблицы перекодировки" (screenmap)
Изменение цветов
Другие параметры.
Несколько общих замечаний.
Программное обеспечение
Bell работает под управлением Debian GNU/Linux 3.0r0 после беспроблемного обновления с версии 2.2r7. Версия ядра Linux -- 2.4.18.
Fish так же работает под Debian 3.0r0, портированным на Sparc64. Недавнее обновление с 2.2r7 повлекло за собой единственную проблему: XFree перестал запускаться из-под обычных пользователей (из-под root'а работает). Ядро Linux версии 2.4.18-SMP.
Тип файловых систем -- ext2.
Программы addgroup и rmgroup
Назначение этих программ понятно из названия.
addgroup добавляет группу в список групп. Достоинство этого способа (в отличии от добавления группы "вручную") заключается только в том, что эта программа может сама подобрать для вновь создаваемой группы groupID, который пока не используется другими группами. Ну и, естественно, не сделает никаких ошибок в /etc/group. Хотя формат /etc/group настолько простой, что там трудно ошибиться :-)
Кроме того, эта программа может использоваться для того, чтобы добавить юзера (юзеров) в "список членов" заданной группы.
rmgroup - удаляет заданную группу из /etc/group. Достоинство этого способа (по сравнению с "ручным") в том, что вам не придется искать нужную строчку в файле /etc/group :-). Кроме того, она не даст вам удалить те группы, которые "жизненно важны" для системы.
Естественно, более подробно об этих программах можно почитать в соответствующих man'уалах
man addgroup
man rmgroup
Программы для работы с графикой:
Конвертор граф.форматов Alchemy. Редактор изображений LView. Генератор изображений Fly. GIF Shaker; Ulead SmartSaver. Оптимизатор JPEG-графики WebOpt.
Программы, имеющие отношение к XKB
xkbcomp
setxkbmap
xmodmap
xkbwatch
xkbvleds и mxkbledpanel
xkbevd и xkbbell
xkbprint
Программа для редактирования раскладки - xkeycaps.
Индикаторы-переключатели.
Программы-оболочки
В той статье мы поговорим о неотъемлемой части пользовательского интерфейса Linux – о программах-оболочках. Именно программа-оболочка запускается после регистрации пользователя в системе. Программы-оболочки часто называют командными интерпретаторами, потому что они обрабатывают (интерпретируют) команды, введенные пользователем. Во времена DOS этим занимался файл C:\command.com.
В файле /etc/passwd для каждого пользователя указывается, какую оболочку он будет использовать. root:x:0:0:root:/root:/bin/bash den:x:501:501:Denis:/home/den:/bin/bash
Из листинга видно, что оба пользователя используют оболочку /bin/bash. Оболочка, как правило, указывается в последнем поле файла passwd.
Список всех установленных в системе программ-оболочек содержится в файле /etc/shells. У меня он выглядит так:
Листинг 1. /bin/sh /bin/bash /bin/ash /bin/bsh /bin/tcsh /bin/csh /bin/zsh
На любой Unix-системе, даже на самой старой, вы можете увидеть, по крайней мере, два интерпретатора из этого списка: sh, csh. Названия, как вы догадались, исходят от слова shell – оболочка. Csh – это оболочка, использующая командный язык, напоминающий язык программирования C. В ОС Linux по умолчанию используется оболочка bash (Bourne Again Shell). Bash является более «продвинутой» версией обыкновенной оболочки sh.
Все оболочки выполняют одну и туже функцию – интерпретируют команды пользователя. Например, когда вы вводите команду
$ program -s /etc/passwd
Интерпретатор запустит программу program и передаст ей два (точнее три)параметра: первый – это -s, второй – это /etc/passwd. А что делать с этими параметрами разберется сама программа. Я что-то говорит о третьем параметре? Существует еще один так называемый нулевой параметр. Этот параметр содержит полное имя файла программы. Например, если наша программа находится в каталоге /bin, то нулевой параметр будет содержать значение /bin/program.
Обратите внимание на знак доллара возле команды. Это признак того, что сейчас мы работаем как обыкновенный пользователь. Если мы зарегистрируемся как пользователь root (суперпользователь), то знак доллара измениться на решетку – #.
Отличием каждой программы-оболочки является ее командный язык. Вот поэтому одни пользователи предпочитают использовать bash, а другие – tcsh. Командные языки некоторых оболочек очень похожи, например, sh и bash, csh и tsch.
Командный язык используется для создания сценариев. Сценарий – это последовательность команд, которую должен выполнить интерпретатор команд. Пример простейшего сценария (командный язык bash):
Листинг 2. #!/bin/bash echo -n "Enter your name" read name echo "Hello, $name"
Для определенности скажем, что мы сохранили этот сценарий под именем script1. Чтобы мы могли выполнить этот сценарий нужно сделать этот файл исполнимым (например, с помощью команды chmod 550 ./script1) и ввести команду (я предполагаю, что вы создали этот файл в текущем каталоге):
./script1
При запуске сценария программа-оболочка определяет, какую программу нужно запустить для обработки этого сценария. После этого интерпретатор запускает нужную программу и передает ей имя файла сценария в качестве параметра. В нашем случае интерпретатор выполнит команду (первая строка листинга 2):
/bin/bash ./script1
При этом не имеет значения, какой интерпретатор сейчас активен: будет запущена программа, указанная в первой строке сценария. Вы можете указать также и опции программы-оболочки:
#!/usr/bin/myshell -option
При запуске сценария, в первой строке которого стоит такая команда, интерпретатор выполнит команду:
/usr/bin/myshwll -option <имя_файла_сценария>
Обратите внимание на первую строку сценария script1
#!/bin/bash
Это указание программы для обработки этого сценария. Если же вы напишете
# !/bin/bash
то это будет уже обыкновенным комментарием и система не сможет выполнить ваш сценарий, поскольку не будет знать, какую программу-оболочку нужно использовать. В лучшем случае, если сейчас активным является интерпретатор, на языке которого написан сценарий, файл все-таки будет выполнен, а в другом случае вы получите сообщение об ошибке. Например, если вы написали сценарий на bash, не указав (или неправильно указав) интерпретатор, и пытаетесь выполнить его при запущенном интерпретаторе csh, то получите сообщение о синтаксической ошибке.
Программы печати
CUPS умеет печатать самостоятельно текстовые файлы, файлы PostScript, файлы HP-GL/2 и некоторые картинки. Можно использовать для этого обычный lpr, но тогда надо указывать параметры в командной строке или переопределить
их при помощи lpoptions (man lpoptions). Возможно. Вам будет удобнее воспользоваться графическими фильтрами xpp или qtCUPS. Первый требует fltk, второй - более тяжелой qt2.
В этом случае печать осуществляется командами xpp <имя файла>
и qtCUPS <имя файла> соотвественно. Иконка принтера на столе KDE закреплена за qtCUPS, так что можно просто перетащить на нее нужный файл из konqueror. Печать
при помощи xpp и qtCUPS позволяет перед печатью задать самые разнообразные параметры. Если этот способ Вам по душе, то в настройках приложений поменяйте lpr на xpp или qtCUPS, если такая возможность есть.
Программы "правильные" и "неправильные"
Итак. Можно сказать, что программы могут быть "правильными" и "неправильными" в смысле "установки locale".
"Правильные" программы вызывают в начале setlocale() и в них "русские буквы вводятся" (если, конечно, у вас переменные окружения указывают на существующий файл XLC_LOCALE).
"Неправильные" программы "забывают" установить текущую locale (соответствено, в них используется locale "C") и в них "русские буквы НЕ вводятся" (хотя замечательно вводяться "западноеворопейские" буквы).
Программы в "бинарниках"
Что делать, если программы имеются только в "бинарниках"?
К сожалению - это самый трудный случай. Конечно, речь идет не о тех программах, исходные коды которых доступны, но почему-то отсутствуют у вас. Хуже всего то, что программы, распространяемые только в "бинарном" виде, зачастую еще и "статически слинкованы". То есть, они используют свою библиотеку Xlib "встроенную" в само приложение, а не ту, что в вашей системе. Поэтому, изменить "поведение" такой программы внешними настройками (о некоторых из них я расскажу позже), часто бывает просто невозможно.
В этом случае, самое правильное - попробовать уговорить авторов на соответствующую правку.
Но в некоторых случаях может помочь один из "хакерских" способов ...
Программы в "исходниках"
Если программы доступны в "исходниках", то их можно исправить. Обычно для этого достаточно вставить вызов setlocale()
где нибудь в самом начале программы (и уговорить авторов или maintainer'ов - включить этот вызов в официальный дистрибутив).
Не забудьте при этом о "иксовой заглушке" setlocale().
Если у вас Xlib собрана с X_LOCALE, то ...
Самое правильное - "выкинуть" ваши "иксы" и поставить "нормальные". Если же этого сделать нельзя, то и программы "лечить" с помощью "иксовой" setlocale() (что для этого нужно делать - я уже написал).
Надо также отметить, что не всегда для "лечения" требуется именно setlocale(...). В некоторых библиотеках-"тулкитах" (toolkits) существуют свои функции, которые выполняют те же действия. В конечном счете они вызывают ту же setlocale(), но могут выполнять и какие-то дополнительные настройки, необходимые для работы остальных подпрограмм своего "тулкита".
Естественно, программы использующие эти "тулкиты" лучше исправлять с помощью "родной" подпрограммы настройки locale.
Например. Своя собственная процедура для установки locale в приложении имеется в библиотеке Xt, которая работает "поверх" Xlib
и, в свою очередь, является основой для популярных "тулкитов" Xaw*
и Motif (lesstif).
Поэтому, как сказано в документации Андрея Чернова (о "коификации" всего и вся):
Если программа использует один из перечисленных "тулкитов" (Xt, Xaw*, Motif/lesstif), то для ее исправления лучше вставить вызов процедуры XtSetLanguageProc, например в таком виде
XtSetLanguageProc(NULL, NULL, NULL);
Также своя процедура имеется и в библиотеке GTK - gtk_set_locale() (без аргументов). Хотя она делает практически то же, что и обычная setlocale(...), но по крайней мере еще и выдает разнообразную диагностику, "если что не так".
Еще одна проблема, на которую надо обратить внимание при "исправлении" программ - шрифты (fonts). В некоторых программах могут оказаться "вшитыми" названия шрифтов, которыми эта программа должна отображать вводимые символы.
К сожалению, никаких общих рекомендаций для этого случая я дать не могу. Замечу только, что ...
если русские буквы "вводятся, но не так" (то есть, вместо русских букв печатаются какие-то "западноевропейские") и ни в каких настройках (конфигурационных файлах) исправить "фонт" не удается то имеет смысл поискать в "исходниках" - не прописаны ли там полные названия "фонтов".
И наконец, особые проблемы могут возникнуть с "мультиязыковыми" программами ...
Просмотр и редактирование файлов
cat имя_файла | more
Постраничный просмотр содержимого файла, называемого "имя_файла". Символ "|" означает "pipe(труба, конвейер)" (на большинстве клавиатур делит клавишу с символом "\"). more приостанавливает вывод при каждом заполнении экрана. Для длинных файлов иногда удобны команды head и tail которые показывают начало и конец файла, и less которая позволяет просматривать файл, свободно перемещаясь по нему вверх и вниз. Если вам случится использовать cat с двоичным файлом ваш терминал может начать показывать вам различные забавные символы, вы можете прекратить это использовав команду reset.
cat имя_файла | less
less имя_файла
(две команды, используйте любую) Свободный просмотр текстового файла. Нажмите q, когда закончите. Команда "less" - приблизительный эквивалент команды "more", которая есть даже в DOS, но "less" зачастую гораздо удобнее "more", поскольку позволяет свободно перемещаться по тексту вверх и вниз.
head имя_файла
Печатает первые 10 строк (длинного) текстового файла.
tail имя_файла
Печатает последние 10 строк (растущего) текстового фала. Используйте tail -f имя_файла для просмотра конца растущего файла в процессе роста -- очень удобно для просмотра файлов журнала.
pico имя_файла
Редактировать текстовый файл простым и стандартным текстовым редактором pico. Используйте <Ctrl>x для выхода. В Linux очень много текстовых редакторов, включая редакторы с графическим интерфейсом. Имя нового клона pico (GPLed) - nano.
pico -w имя_файла
Редактирование текстового файла, с запретом переноса слов. Удобно для редактирования конфигурационных файлов, например /etc/fstab.
kwrite
(в X-терминале) очень симпатичный и продвинутый текстовый редактор. Поддерживает даже вертикальное выделение текста!
kate
kedit
gedit
(в X-терминале). Простые, но симпатичные текстовые редакторы с графическим интерфейсом.
gxedit
(в X-терминале) Другой многоцелевой и насыщенный возможностями текстовый редактор. Поддерживает автосохранение.
latte
(в X-терминале) Редактор для написания программ.
nedit
(в X-терминале) Другой редактор для программистов. Красивый и мощный.
bluefish
(в X-терминале) редактор html (подсветка синтаксиса, много инструментов и возможностей).
ispell имя_файла
Проверка синтаксиса текстовых файлов. AbiWord, WordPerfect, StarOffice и OpenOffice снабжены проверкой синтаксиса "на лету", но и ispell может вам потребоваться. Новейшие дистрибутивы Linux (например RH7.0) содержат более свежую программу проверки синтаксиса aspell, которая ничем не отличается в использовании от предыдущей.
look термин
Поиск в словаре (/usr/share/dict/words) слов, начинающихся с "термин".
wvHtml документ_ms_word.doc > имя_файла.html
Конвертирует документ MS Word в файл формата html.
"Простая" конфигурация
Если в файле находится "простая" конфигурация, то в начале файла должен быть заголовок
[ Флаги ] ТипФайла [ Имя ]
после которого сразу следуют объявления (или инструкции). Например,
xkb_keyсodes
<TLDE> = 49; <AE01> = 10; .......
Просто []
Чаще всего, описание клавиши состоит из списков символов, заключенных в квадратные скобки без всякого указания типа - "symbols[...] =". Поскольку обычно для клавиши задается только набор символов, можно использовать сокращенную форму описания.
Например, описание
key <AE03> { [ 3, numbersign ], [ apostrophe, 3 ] };
полностью эквивалентно описанию
key <AE03> { symbols[Group1]= [ 3, numbersign ], symbols[Group2]= [ apostrophe, 3 ] };
То есть, первая пара квадратных скобок (с неким содержимым внутри) интерпретируется как описание symbols для первой группы, втора пара скобок - как описание symbols для второй группы и т.д.
Кстати, в некоторых файлах может содержаться только частичное описание полной "раскладки клавиатуры", например только символов второй группы. Естественно, такой файл как правило используется как добавка к другому файлу xkb_symbols, содержащему описание символов из первой группы.
Для того, чтобы явно пояснить, что символы из этого файла следует "загрузить" во вторую группу, а первую группу оставить без изменения, можно использовать два способа:
В каждом описании клавши явно указывать группу:
key <AE03> { symbols[Group2]= [ apostrophe, 3 ] };
Или для пропущенной группы использовать "пустые скобки":
key <AE03> { [], [ apostrophe, 3 ] };
Протоколирование
Автор: Денис Колисниченко, dhsilabs@mail.ru
Опубликовано: 30.03.2002
Оригинал: http://www.softerra.ru/freeos/17032/
В этой статье будет рассмотрен демон syslogd, а также как управлять протоколированием сообщений системы и ядра с помощью этого демона.
Прежде всего, нужно отметить, что демон находится в пакете sysklogd (если, вы, конечно, используете Red Hat-совместисую систему), поэтому перед его использованием нужно установить этот пакет. В большинстве случаев у вас пакет уже будет установлен, а демон syslogd – запущен. Чтобы проверить это введите команду syslogd. Вы должны получить сообщение: syslogd: Already running.
В пакет sysklogd на самом деле входят две программы: syslogd и klogd. Syslogd отвечает за протоколирования сообщений системы, а klogd – ядра.
Псевдо-юзеры
Часто бывает полезно ограничить некоторым программам (которые запускаются автоматически - ftp-сервер, www-сервер и т.п.) доступ к файлам и директориям.
Например, вы создаете на своей машине WWW-сервер. Естественно, его назначение - выдавать в сеть какие-то документы (файлы *.html), специально предназначенные для публичного обозрения. В то же время, не хотелось бы, чтобы он (из-за возможных ошибок или злонамеренных "закладок" в программе) мог выдавать наружу другие файлы находящиеся в системе.
В Unix предусмотренно, что права на чтение каждого файла можно связать с определенным пользователем. Юзер может читать файлы, для которых он является "хозяином" или "владельцем" (на самом деле разграничение прав несколько более сложное, но в данном объяснении это не важно). Все остальные файлы можно сделать для него недоступными.
Таким образом, для решения задачи нужно
- зарегистрировать фиктивного пользователя - например www;
- все файлы, к которым должна иметь доступ программа WWW-сервера, объявить "собственностью" юзера www (естественно, что ваши секретные файлы должны быть недоступны этому самому www);
- обяснить системе, что когда запускается программа WWW-сервера, все должно выглядеть так, как будто его запустил реальный юзер www.
Все остальное сделается автоматически средствами Unix.
Разумеется, при таком подходе никакого реального человека, который скрывается под именем www может не быть.
Следовательно, в учетной карточке такого фиктивного юзера не нужен реальный пароль (вместо пароля ставится какая-нибудь абракадабра, так, чтобы никто не мог даже подобрать его. Точнее, ставится знак "*", поскольку в настоящих шифрованных паролях такой знак никогда не встречается), никакой General information, не нужна также Home dir (хотя, иногда имеет смысл объявить его домашней директорией ту, где лежат его данные) и Shell.
Особым случаем псевдо-юзера является юзер ftp. Дело в том, что у ftp-сервера могут быть две задачи. Первая - дать возможность реальным пользователям этой машины перекачивать свои файлы из этого компьютера (или, наоборот, "вкачивать") по сети. Вторая - предоставить некую "свалку" файлов всем желающим (то, что обычно называют "анонимный ftp"). В первом случае каждый реальный юзер говорит серверу свое имя и пароль и получает доступ к файлам такой же, как если бы он вошел в систему. Во втором случае, если вы не зарегистрированы в качестве юзера на этой машине, вы можете сказать, что вы - юзер anonimous или юзер ftp. В этом случае, программа ftp-сервер проверяет - зарегистрирован ли в БД учетных карточек псевдо-юзер ftp (именно ftp, а не anonimous) и, если такой юзер зарегистрирован, то пускает вас в домашнюю директорию (Home dir) этого юзера, там и должна лежать "свалка" файлов для всех желающих.
Таким образом, в учетной карточке псевдо-юзера ftp существенным являются в основном поля Name и Home dir. Остальные, обычно, значения не имеют.
Таких псевдо-юзеров в любой системе существует несколько. Вы можете сами убедиться, заглянув в /etc/passwd.
Психология ответа
Искусство находить выход в критических ситуациях поможет сохранить вам не только настроение и нервы, но иногда и рабочее место. С опытом приходит умение читать между строк, улавливать настоящий ход мысли собеседника. Не вдаваясь в демагогию, приведу понятный пример.
Типичная ситуация: HDD полностью вышел из строя (а гарантийный срок уже прошел). Вы сидите за компьютером, тщетно пытаясь "оживить" девайс. Сотрудники стоят полукругом над душой: кто-то всхлипывает, вспоминая об утерянной информации, кто-то громко обвиняет БГ, кто-то перешептывается о том, что в "Эйвоне" сейчас рождественские скидки. Вот народ расступается, подходит "босс". Узнав причину столпотворения, задает вроде бы типичный вопрос: "Как это он поломался?!". Можно, конечно, блеснуть умом и прочитать "тупым юзерам" лекцию о том, что ":вероятно, люфт подшипников вызвал недопустимое осевое и радиальное биение, в результате чего дисковые пластины на огромной скорости (7200 об/мин) зацепили считывающие головки; соответственно, произошло разрушение пластин и головок:". Зря стараетесь, господа! Шефа не удовлетворит такой ответ, потому что вы не ответили на его вопрос! Ему не интересна причина поломки, из вашей тирады он все равно ничего не понял. На самом деле задаваемый вопрос на шефовском подсознательном уровне звучит так: "Кто виноват, и кто будет отвечать за поломку этого дорогого устройства?" Потенциальный виновник - конечно, сисадмин! И продолжение лекции не спасет - как он допустил люфт этих, как их там: подшипников? Выход из ситуации - срочно закрыть тему обсуждения. Мой личный рецепт: на подобные вопросы я отвечаю следующее: "Так же, как и штаны: вот были целые, а потом взяли и порвались:". Насколько ответ примитивен, настолько и всеобъемлющ - вопросы на этом прекращаются.
Пути
Не торопитесь. Несколько слов о том, как мне приходилось "бодаться" с Wine при подготовке этой статьи к публикации. Во-первых, вам следует знать, что при первом запуске Wine генерирует разделы [Drive X] на основании данных /etc/fstab. Если вы планируете использовать в качестве основы для работы Wine каталоги и файлы Windows, то можете оставить всё как есть. Если же нет, то придётся подправить секции [Drive X]. Я настроил Wine таким образом, что ему доступны два диска, [C] и [D] (жёсткий диск, CD-привод) и привод флоппи-дисков [A]:
[Drive A] "Path" = "/mnt/floppy" "Type" = "floppy" "Label" = "Floppy" "Filesystem" = "win95" "Serial" = "87654321" "Device" = "/dev/fd0"
[Drive C] "Path" = "/var/lib/wine" "Type" = "hd" "Label" = "MS-DOS" "Filesystem" = "win95"
[Drive D] "Path" = "/mnt/cdrom" "Type" = "cdrom" "Label" = "CDROM" "Filesystem" = "win95" "Device" = "/dev/cdrom"
При этом для диска [C] использовался "скелет" каталогов, сформированный Wine при инсталляции, /var/lib/wine. Решать, конечно, вам какую именно конфигурацию избрать. Можете оставить путь к подмонтированым vfat-разделам (надеюсь, понятно, что под vfat-разделами я понимаю разделы с файловыми системами FAT12, FAT16 и/или FAt32). Но, что там может натворить Wine? Лично я не знаю, поэтому работал с /var/lib/wine. К тому же этот вариант универсален, т.к. позволяет использовать Wine на машине, где нет vfat-разделов. И есть ещё одна неприятная особенность, которую я не смог побороть -- не-LATIN имена файлов сохраняются в кодировке cp1251. А в vfat-разделах они хранятся в кодировке cp866.
Обратите внимание на значение переменной "Temp" в разделе [wine] (выше, в примечаниях, я уже об этом говорил):
[wine] ... "Temp" = "C:\\Temp" ...
По умолчанию переменная "Temp" указывает на отдельный диск, который формируется в "/tmp/winetmp-${USER}". Я её исправил на C:\\Temp, предварительно создав подкаталог Temp на диске [C] (в моём случае это /var/lib/wine/Temp)
Проверьте значение переменной "Path" в этом же разделе. Возможно, понадобится добавить новые пути.
Pw groupmod
Также, вам может помочь "универсальная утилита" pw. Только, в отличии от предыдущей команды, для указания юзера (или сразу нескольких юзеров) надо использовать специальный ключ
pw groupmod games -m vasia
(добавить юзера vasia в группу games).
Надо заметить, что описанные команды хорошо добавляют юзеров в группы, но не приспособлены для удаления определенного юзера из определенной группы. Правда, у команды pw groupmod есть ключ -M, который, в отличии от ключа -m означает - не "дописать" указанных юзеров в список членов группы, а полностью заменить список членов на тех юзеров, которых вы и укажете (через запятую) после ключа -M. Однако, понятно, что удалять одного конкретного юзера из длинного "списка членов" таким способом - не очень удачное решение.
Короче, для удаления юзера из списка членов какой-либо группы, надо пользоваться обычным текстовым редактором.
Иван Паскаль pascal@tsu.ru
Pw useradd
Возможно, вам покажется более удобной утилита pw. Эта программа, по замыслу авторов, должна быть универсальной утилитой для администратора в вопросах создания/изменения/удаления юзеров и групп. Поэтому, для данной задачи (регистрации нового юзера) ее надо запускать в виде:
pw useradd .....
В отличии от adduser эта утилита очень не разговорчивая, то есть, она не задает никаких вопросов и все нужные сведения о новом юзере ей нужно сказать в командной строке с помощью соответствующих ключей.
Но, с другой стороны она имеет и ряд достоинств:
обычно, достаточно ей указать только имя нового юзера, все остальное она "сочинит" сама. Например:
pw useradd vasia
(программа сама подберет подходящий userID, и заполнит поля group, Home dir, Shell и т.п., взяв их из своего конфигурационного файла) все данные, подставляемые "по умолчанию", можно легко поменять, запустив эту же программу в виде
pw useradd -D ...
или отредактировав напрямую конфигурационный файл /etc/pw.conf
(если у вас в /etc такого файла нет, то просто наберите команду pw useradd -D и он сам создастся). при этом можно иметь несколько различных конфигурационных файлов, для разных типов юзеров, и явно указывать в команде - какие "умолчания" использовать для создания данного юзера. Например, у вас есть юзеры трех различных типов (отличающися своими group, Home dir, Shell и т.п.). Сделайте три разных конфигурационных файла (просто "растиражируйте" /etc/pw.conf и подправьте в каждом то, что нужно.) Теперь, чтобы создать юзера с "умолчаниями" из файла /etc/pw1.conf, наберите команду
pw useradd vasia -C/etc/pw1.conf
Подробнее о всех параметрах (ключах) этой программы можно посмотреть в соответствующем man'уале (man pw), краткий список ключей можно "спросить" у самой программы, командой
pw useradd help
(но man pw все равно лучше прочитать, хотя бы раз :-)
Здесь я хочу только обратить внимание на ключь -m. Дело в том, что pw useradd "по умолчанию" делает только запись в учетной карточке. А с этим ключем
pw useradd vasia -m
она, также, создаст домашнюю директорию для юзера и скопирует туда соответствующие стартовые и настроечные файлы.
Pwd_mkdb
Собственно, эта утилита только преобразует файл master.passwd в три остальных файла (см. "Где хранятся учетные карточки").
Вы можете любым текстовым редактором добавить строчку в master.passwd, взяв за образец любую из тех строчек, которые там уже есть (желательно, перед этим внимательно прочитать man 5 passwd). Если, после этого запустить команду
pwd_mkdb -p /etc/master.passwd
то она сделает соответствующие изменения в spwd.db, pwd.db, passwd.
Не забудьте, что пароль в учетной карточке хранится в зашифрованном виде. Поэтому, при составлении записи, это поле учетной карточки лучше оставить пустым, а потом занести пароль утилитой, которая специально для этого предназначена:
passwd
Конечно, это самый сложный способ, но... Если вы когда-нибудь возьметесь написать свою программу для регистрации, то она должна будет просто сформировать правильную строчку для файла master.passwd, занести ее в этот файл, а потом просто вызвать pwd_mkdb. Кстати, остальные программы, о которых дальше идет речь, именно так и делают.
Рабочий стол
Gnome
Количество глюков просто поражает, особенно если запускать на одном экране приложения для нескольких пользователей.
Запуск панели, если она грохнулась: panel.
Каждая программа из комплекта gnome имеет привычку прислушиваться к tcp порту из клиентского интервала. Это даже не дыра, а открытые ворота в системе безопасности. На многократно заданный вопрос один из авторов заявил: "gnome(ORBit) специально предназначен для работы в сетевом окружении и порты он будет прослушивать всегда, а наша система безопасности - непробиваема". Предполагается, что по этому порту программа получает команды от session-manager (попытка отключить его с помощью ключа запуска --sm-disable или заменой запуска gnome-session на gnome-wm ни к чему не привела - порты открываются в любом случае). Таким образом любой осталоп может сконнектиться на этот порт и "пообщаться" с программой, что иногда вызывает ее аварийное завершение (если постараться, то и очередной buffer overflow exploit найти можно). Под горячую руку я закрыл доступ к любым серверным программам на интервале клиентских портов (фильтруя SYN пакеты), но говорят, что можно закрыть это безобразие через tcpwrapper (host_access(5)).
Работа администратора с user account
Что такое "учетная карточка" (user account)?
Какие данные хранятся в учетной карточке?
Для чего используется учетная карточка?
Где хранятся учетные карточки?
Как добавить юзера?
Как поменять данные в учетной карточке?
Как удалить юзера?
Что может поменять сам юзер в своей учетной карточке?
Как временно убрать юзера (не удалить, но запретить вход)?
Что еще почитать?
Что такое "учетная карточка" (user account)?
Какие данные хранятся в учетной карточке?
Для чего используется учетная карточка?
Где хранятся учетные карточки?
Как добавить юзера?
Как поменять данные в учетной карточке?
Как удалить юзера?
Что может поменять сам юзер в своей учетной карточке?
Как временно убрать юзера (не удалить, но запретить вход)?
Что еще почитать?
Работа с "мышью"
К сожалению, на эту часть мне не хватило сил и времени. В свое оправдание скажу только, что
во-первых, это вопрос выходит за рамки собственно драйвера syscons (надо рассказать про драйвер "мыши", правильную настройку X-Window, взаимодействие с другими программами) во-вторых, эта часть syscons появилась сравнительно недавно, все еще совершенствуется, и, поэтому, ее описание может существенно отличаться для разных версий FreeBSD.
Надеюсь, что со временем я восполню этот пробел. Пока могу лишь посоветовать почитать на эту тему man moused и man sysmouse.
Иван Паскаль pascal@tsu.ru