Параметры и настройки
В zsh различаются параметры и настройки. Параметры используются для передачи и хранения данных, а настройки используются для управления поведением zsh.
Параметры ядра
Параметр debug ядра Linux задает уровень отладки. Сообщения ядра (важные и не очень) передаются через функцию printk(). Если сообщение очень важно, его копия будет передана на консоль, а также демону klogd для его регистрации на жестком диске. Сообщения передаются на консоль, потому что иногда невозможно
запротоколировать сообщение на жестком диске (например, отказ диска).
Предел того, что будет отображаться на консоли, задается переменной console_loglevel. По умолчанию на консоли отображается все, что выше уровня DEBUG (7). Список уровней можно найти в файле kernel.h
Вниманию вебмастеров: использование данной статьи возможно только в соответствии
с правилами использования материалов сайта «Софтерра» (http://www.softerra.ru/site/rules/)
Параметры командной строки
Здесь описаны самые используемые параметры lilo. Для более подробного описания, введите man lilo
-V | Номер версии |
-q= | Карта запроса |
-С conf_file | Конфигурационный файл |
-r root | Задает корневую файловую систему (выполнит chroot перед выполнением каких-нибудь действий) |
-u | Удаляет lilo |
Источник: www.softerra.ru
Связь | О проекте LinuxRSP | Редколлегия | Реклама
© 1999-2001 LinuxRSP
Параметры "пищалки"
bell = число (или bellvolume = число ) bellpitch = число bellduration = число click = число (или clickvolume = число )
Все эти инструкции устанавливают параметры "пищалки" (bell) и "клика" клавиатуры (обычно это более короткий сигнал, чем bell).
Инструкции bell и click могут также иметь вид
bell = [ on | off ] click = [ on | off ]
что (как нетрудно догадаться) просто означают включить/выключить эти сигналы. Если сигнал просто включен и не указано его "volume", то оно считается - 100.
Параметры "ускорения" курсора мыши
mousekeysdelay = число
задержка (в миллисекундах) до начала автоповтора клавиши эмулирующей движение "мышиного" курсора (то же самое, что и repeatdelay для обычных клавиш);
mousekeysinterval = число
интервал автоповтора (то же, что и repeatinterval);
mousekeysmaxspeed = число
максимальная скорость движения курсора в пикселах за один event (точнее - если в соответствующем "действии" эмуляции движения курсора - MovePtr уже задан параметр "смещение за один event" больше единицы, то максимальная скорость будет "смещение"*maxspeed);
mousekeystimetomax = число
через сколько повторов курсор достигает максимальной скорости
mousekeyscurve = число (в диапазоне -1000:1000)
"степень кривизны" кривой ускорения (в "режиме ускорения" скорость курсора нарастает от начального "смещения" до максимального не линейно, а пропорционально X^(1 + curve/1000).
Если mousekeyscurve = 0, то зависимость линейная)
Параметры запуска
Демон syslogd можно запускать с опциями, указанными в таблице 1.
Таблица 1
Опция | Описание |
-s socket | Этот параметр позволяет указать дополнительный сокет, который syslog должен прослушивать |
-d | Включает режим отладки. В этом режиме демон не будет использовать системный вызов fork(2) для переключения себя в фоновый режим и будет выводить больше отладочной информации |
-f file | Этот параметр определяет альтернативный файл конфигурации |
-h | По умолчанию демон не перенаправляет сообщения, которые он получает от других узлов. Этот параметр позволяет перенаправить сообщения другим хостам, которые определены |
-n | Этот параметр нужен, если syslogd запускается и контролируется программой init |
-p socket | Позволяет задать другой сокет Unix вместо /dev/log |
-r | Позволяет принимать сообщения из сети. Данная опция появилась в версии syslogd 1.3 |
-v | Выводит версию syslogd |
В таблице 1 указаны не все опции демона. Назначение всех остальных опций вы можете найти в справочной системе, введя команду man syslogd.
Пароли
"Стой, кто идет! Моя будет стрелять!"
При входе система задаст вам несколько вопросов. Будьте внимательны, от ответов на них зависит ваша дальнейшая судьба. Вот эти вопросы
login:
password:
Чтобы бесконечно долго не пытаться отгадать правильные ответы, следует попросить подсказки у рута (root'а). Кстати, попытки отгадать правильные ответы для других людей вообще-то противозаконны.
И вы попадаете в систему. Началом является ваш домашний каталог, который называется
/home/name
иногда
/home/group/name
Если вы зашли в графическом режиме, то к вашим услугам рабочий стол X Window (не путать с известным плагиаторским названием). Если нет, то консольное приглашение или shell (названий у нее много, но сейчас популярен bash - Borne Again SHell). Поскольку консоль важнее, то сначала о ней.
Password
Пароль. Для того, чтобы никто другой, кроме этого юзера не мог войти в систему, естественно, у каждого юзера должен быть его собственный секретный пароль для входа. Вообще-то, пароль может и отсутствовать, но это очень не рекомендуется. Особенно, если машина доступна по сети.
Кстати, пароли хранятся в базе в закодированном виде, поэтому, даже администратор не может его узнать. (Собственно администратору он и не нужен, у него и так права не ограничены. А вот если юзер забудет свой пароль, то проще попросить администратор записать новый пароль, чем пытаться извлечь старый).
Password change time
Здесь администратор может указать дату, когда юзеру следует поменять пароль. Дело в том, что, если требуется повышенная секретность, одной из мер предосторожности является то, что пароли должны периодически меняться (раз в неделю, месяц и т.п.). Для того, чтобы заставить юзера следовать этому правилу, администратор задает дату, после наступления которой компьютер будет предлагать юзеру при входе систему поменять свой пароль.
Paul Evans
Paul Evans любит все, что касается электроники и компьютеров в частности. Он достаточно стар, чтобы помнить, как он работал на Altair 8080A в свою юность. Он и двое его детей живут в дебрях Северной Британской Колумбии; они не лесорубы, но с ними все в порядке.
Copyright © 2001, Paul Evans.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 67 of Linux Gazette, June 2001
Вернуться на главную страницу
PDA
Эта статья в основном была написана при помощи Agenda VR3. Возможно единственным PDA со свободным ПО на пляже Gran Canaria.
Печать
Ссылки:
Printing-HOWTO Printing-Usage-HOWTO Пакеты printtool, rhs-printfilters и lpr обеспечивают вполне сносные средства для настройки и печати, но не поддерживают наш старый HP JetDirect (который вместо lpd использует просто порт TCP/9100). Приходится устанавливать LPRng. Читая документацию по LPRng, обнаружил ссылку на netcat, которого мне вполне хватает для печати страниц из Netscape и прочих PS-файлов. Устанавливаем netcat (например, из contrib). В /usr/local/bin уже лежит фильтр для преобразования PS в PCL (ps2pcl.sh). Добавляем туда же tojd.sh:
/usr/sbin/nc имя-принтера 9100
и pstojd.sh:
ps2pcl.sh | tojd.sh
Вот и все. Теперь вместо команды lp/lpr для печати PS-файлов можно использовать pstojd.sh. Когда мне потребуется настоящий спулинг, я буду изучать LPRng ;).
Печать текстовых файлов
Для печати форматированных текстовых файлов удобно использовать традиционные утилиты enscript и mpage. В нашем дистрибутиве они поддерживают кодировки KOI8-R(U), CP1251. Благодаря локальным настройкам из пакетов
etcskel-$LANG, необходимые преобразования должны быть прозрачны, с учетом сказанного выше про выбор Fontmap. Указанные кодировки поддерживает и ps- печать из groff, в /usr/share/groff/font/devps имеются их описания, а также
описания необходимых шрифтов. Вам нужно лишь отредактировать файл DESC в том же каталоге.
Переднеплановые процессы
[Ваш редактор спросил Брайана: "Мне казалось, что в системе не существует концепции переднепланового (foreground) процесса; это вымысел оболочки." Ниже его ответ. --Iron]
Обычно я думаю также; возможно, потому, что я читал документацию к Bash. Однако ядро Linux определяет "группу переднепланового процесса" (foreground process group). Каждый управляющий терминал имеет группу переднепланового процесса. По умолчанию, это процессовая группа процесса (*1), который изначально был открыт терминалом. Но процесс может установить группу процесса переднего плана любой процессовой группе в своей сессии с помощью ioctl. (*1) Примечание переводчика: Я вполне осознаю, что данное выражение звучит, по меньшей мере, жутко, но мне не удалось сразу подобрать хороший перевод выражения "process group of the process" без потери или искажениия смысла. Возможно, позже (во второй жизни) меня осенит, и я подкорректирую это и, вероятно, другие трудные места. --Alex
В статье я несколько вольно использовал ссылку на "foreground processes," который, как я думаю, можно легко интерпретировать как "процессы в группе процессов переднего плана".
Я думаю, что только смысл группы процессов переднего плана (сущность ядра) в том, что процессы в этих группах процессов получают сигналы control-C и hangup.
Управление заданиями в Bash используют этот ioctl, чтобы любое ваше "переднеплановое задание" ("foreground job") стало переднеплановой процессовой группой для вашего терминала. Вот почему, поместив что-либо в фон, например, "grep abc * &", вы не сможете прервать это с помощью control-C. Для прерывания вам необходимо сначала выполнить "fg", заставляя Bash использовать ioctl для перевода этого в foreground, а только затем ввести Control-C.
Много лет назад, до Web, когда терминалы имели гораздо большее значение, я потратил много часов, продираясь через код ядра и экспериментируя, чтобы изучить обработку групп, сессий, управляющих терминалов, управление заданием, SIGINT, SIGHUP и т.д. Я бы смог написать об этом длинную статью, но, думаю, это уже действительно архаичная информация.
[Читателям: если вы хотите подтолкнуть его выложить свою такую "архаичную информацию", пишите в Mailbag. Помните, также, что Mailbag -- это место, где вы можете заказывать статьи по любой другой тематике. -- Iron ]
Переключатель "альтернативной клавиатуры" (Рус/Лат)
Как я уже говорил, при загруженной (или встроенной) русской раскладке клавиатуры клавиша [CapsLock] начинает работать как "переключатель языка" - русский/латинский.
Если вам это не нравится, можно изменить раскладку так, чтобы [CapsLock]
всегда оставалась CapsLock'ом. А "переключатель языка" присвоить какой-нибудь другой клавише или комбинации клавиш.
Первым делом вернем CapsLock на место. Для этого надо в файле раскладки найти строчки, в которых содержится значение alock.
058 alock clock clock clock clock clock clock clock O 084 alock alock alock alock alock alock alock alock O 186 alock clock clock clock clock clock clock clock O 212 alock alock alock alock alock alock alock alock O
Строчки со скан-кодами 84 и 212 нас мало интересуют. (Честно говоря, я не знаю - что это за клавиша.) А вот строчки 58 и 186 - это как раз клавиша [CapsLock] в "нормальной" и "альтернативной" (русской) клавиатурах.
Как видите, без модификаторов (shift, ctrl или alt) она действует как alock (alt group), а с любым из модификаторов - как clock (caps lock).
Просто исправьте alock на clock.
058 clock clock clock clock clock clock clock clock O 186 clock clock clock clock clock clock clock clock O
Теперь надо придумать - чем мы будем переключаться на русскую клавиатуру и обратно.
Если у вас есть незадействованные клавиши, например, "окошки" на "микрософтовской" клавиатуре, то можно занять одну из них. Это достаточно просто и я не буду подробно рассматривать этот случай. Можете посмотреть пример с клавишей Meta - это делается практически так же.
Если же свободных клавиш нет, то можно переключатель alock "подвесить" на какую-нибудь комбинацию клавиш. Например - "два шифта". То есть, каждая кнопка [Shift] должна работать как shift, а если их нажать одновременно, должен получится alock.
Для начала, найдем строчки в которых есть слово shift
042 lshift lshift lshift lshift lshift lshift lshift lshift O 054 rshift rshift rshift rshift rshift rshift rshift rshift O
170 lshift lshift lshift lshift lshift lshift lshift lshift O 182 rshift rshift rshift rshift rshift rshift rshift rshift O
Учтем, что даже при "одновременном" нажатии этих кнопок, все равно одна из них будет нажата чуть-чуть раньше. Поэтому, та кнопка которая будет нажата раньше, переведет клавиатуру в состояние shift, при котором выбирается вторая колонка значений (точнее, все четные), а уже вторая - должна выполнить нужное нам действие.
Если мы хотим, чтобы последовательность нажатия была не важна, нам надо исправить значение и для клавиши lshift во второй колонке (считаем, что правый shift мы нажали чуть раньше) и для клавиши rshift (на тот случай, если первым будет нажат левый shift).
042 lshift alock lshift lshift lshift lshift lshift lshift O 054 rshift alock rshift rshift rshift rshift rshift rshift O
170 lshift alock lshift lshift lshift lshift lshift lshift O 182 rshift alock rshift rshift rshift rshift rshift rshift O
Дело сделано.
Переключатели виртуальных терминалов
Эти клавиши вызывают немедленное переключение на другой
"виртуальный терминал".
В таблице "раскладки клавиатуры" они называются scr01, scr02 ... scr16
(от слова screen). Понятно, что цифры в конце названия обозначают номер "виртуального терминала".
Кроме того существует еще одна клавиша - nscr (next screen) которая переключает syscons просто на следующий терминал.
По умолчанию, переключатели scr01 - scr10 назначены на комбинации клавиш [F1]+[Alt] - [F10]+[Alt], а оставшиеся scr11 - scr16 на комбинации [F1]+[Alt]+[Shift] - [F6]+[Alt]+[Shift]. Точнее, на клавиши [F1]-[F10] "при активном модификаторе alt" и "активном модификаторе shift", поскольку модификаторы alt и shift только "по умолчанию" находятся на одноименных клавишах и могут быть "переназначены" на любые другие.
Надо также отметить, что для того, чтобы реально переключиться на другой "виртуальный терминал", надо, чтобы он действительно существовал (как это описано в "Виртуальные терминалы") и был активным, то есть, чтобы на нем была запущена хоть какая-нибудь задача (getty, шелл, X-сервер и т.п.)
Клавиша nscr по умолчанию находится на физической клавише [Print Screen].
Перекомпиляция ядра
Пожалуй, это первый шаг с которого следует начать при оптимизации FreeBSD. Для этого из файла конфигурации ядра следует удалить все компоненты которые не являются важными для вашей системы и увеличить значения параметров maxusers и NMBCLUSTERS. Я использовал такой файл: # Основано на GENERIC-ядре
machine i386 cpu I686_CPU # Оптимизация для процессоров Pentium Pro и выше
ident TUNED # Название сборки ядра maxusers 512 options NMBCLUSTERS=65536 # maxusers и NMBCLUSTERS самые важные настройки в оптимизированной конфигурации
options INET # Поддержка TCP/IP options FFS # Berkeley Fast Filesystem (файловая система FreeBSD) options FFS_ROOT # FFS может являться корневой файловой системой options SOFTUPDATES # Разрешить мягкие обновления для файловых систем options MFS # Файловая система в оперативной памяти options PROCFS # Файловая система процессов options COMPAT_43 # Совместимость с BSD4.3 options SCSI_DELAY=5000 # Задержка перед пробой SCSI-устройств options UCONSOLE # Позволяет пользователям захватить консоль options USERCONFIG options VISUAL_USERCONFIG options KTRACE options SYSVSHM options SYSVMSG options SYSVSEM options P1003_1B options _KPOSIX_PRIORITY_SCHEDULING #options ICMP_BANDLIM # Включает лимитирование ICMP-трафика options KBD_INSTALL_CDEV # Обратите внимание параметр ICMP_BANDLIM закомментирован, так как ограничение # ICMP трафика может сказаться на других видах трафика (на мой взгляд это излишняя # перестраховка, прим. переводчика) # Удалены ненужные файловые системы ISO9660 (CDROM), NFS (сетевая файловая система)
device isa device pci
# Поддержка дисководов device fdc0 at isa? port IO_FD1 irq 6 drq 2 device fd0 at fdc0 drive 0 device fd1 at fdc0 drive 1
device ahc # Adaptec SCSI-контроллерAHA2940 и AIC7xxx device scbus # SCSI-шина device da # Прямой доступ (для дисков)
# Удалены многочисленные ненужные SCSI/IDE/RAID драйверы
device atkbdc0 at isa? port IO_KBD device atkbd0 at atkbdc? irq 1 flags 0x1 device psm0 at atkbdc? irq 12 device vga0 at isa? pseudo-device splash # необходимо для screensaver device sc0 at isa? flags 0x100 # системная консоль
device npx0 at nexus? port IO_NPX irq 13 # сопроцессор
# COM-порты device sio0 at isa? port IO_COM1 flags 0x10 irq 4 device sio1 at isa? port IO_COM2 irq 3 device sio2 at isa? disable port IO_COM3 irq 5 device sio3 at isa? disable port IO_COM4 irq 9
device ppbus # Шина параллельного порта
device miibus # Поддержка шины MII (необходима для сетевой карты) device xl # Драйвер сетевой карты 3COM 3c90x
pseudo-device loop # Интерфейс loopback (необходим) pseudo-device ether # Поддержка Ethernet #pseudo-device sl 1 # Kernel SLIP #pseudo-device ppp 1 # Kernel PPP #pseudo-device tun # Пакетный туннель pseudo-device pty # Псевдо-ttys (telnet etc) # Заметьте PPP и SLIP, а также туннель закомментированы. # Не добавляйте эти интерфейсы в ядро, если они вам не нужны
Перекрытия (Overlay)
В модуле XKB можно для некоторых клавиш (группы клавиш) задать набор "альтернативных" скан-кодов. То есть, при нажатии такой клавиши клавиатура выдает некоторый скан-код, который и должен быть интерпретирован XKB (выбрать подходящий символ), но, если включен режим замены скан-кода на "альтернативный", то XKB прежде всего заменяет этот скан-код соответствующим "альтернативным", а потом уже новый скан-код пытается интерпретировать.
Такая группа называется "перекрытием" (overlay). Их может быть всего две. Принадлежность конкретной клавиши к конкретной группе-"перекрытию" и "альтернативный" скан-код задаются в поле "поведение клавиши".
Это свойство используется для клавиатур, у которых очень маленький набор клавиш (например в "лаптопах"). Например, на такой клавиатуре может полностью отсутствовать "дополнительная цифровая клавиатура" (keypad). Поскольку некоторые приложения могут потребовать, чтобы какие-то действия в них вызывались нажатием кнопок именно на keypad, модуль XKB может эмулировать эту дополнительную клавиатуру, используя, например, "цифровые" кнопки на основной клавиатуре.
Переменная окружения TERM
Для "сообщения" программам названия вашего терминала служит "переменная окружения" TERM. Если вы работаете с syscons в стандартном "режиме отображения" (25 строчек), эта переменная должна иметь значение cons25 или cons25r (если syscons русифицирован).
Вообще-то, переменная TERM автоматически устанавливается при входе в систему. FreeBSD берет ее значение из файла /etc/ttys или она явно устанавливается в ваших "стартовых командных файлах" (.login, .profile, .cshrc и т.п.).
Но, если вы в ходе работы измените настройки syscons, которые меняют размер экрана, коды "функциональных" клавиш или набор "псевдографики", то реальные свойства syscons уже не будут соответствовать тому описанию, которое хранится в termcap. В этом случае, скорее всего, придется найти "более подходящее" описание терминала в базе данных и, соответственно, поменять значение переменной TERM.
Напомню, что кроме cons25, в termcap имеются описания для того же syscons, но с большим количеством строк (cons30, cons50, cons60) или с другим набором "псевдографики" (cons25r).
В конце концов, если вы не сможете подобрать подходящий терминал из имеющихся в базе, можно подправить какое-нибудь описание из уже имеющихся или (что, пожалуй, лучше) сочинить новое имя и составить для него описание.
При этом учтите, что вам совсем не обязательно делать полное описание всех свойств. Существует специальное "свойство" в termcap - tc="имя терминала". Оно означает - "остальные свойства взять из описания указанного терминала". Поэтому, вам достаточно "до-определить" или "пере-определить" только несколько параметров, а в конце указать - tc=cons25 ("остальное взять из описания cons25"). Естественно, если вы опишете в вашем новом терминале какой-нибудь параметр, который и так уже описан в cons25, то использоваться будет именно ваше определение.
Переменные
Начнем с отличий между переменными bash и командного языка DOS. Их удобно продемонстрировать на примере.
Рассмотрим команду, которая «дописывает» в переменную окружения CLASSPATH путь к архиву JAVApackage (подобные команды часто вставляются в конфигурационные файлы инсталляторами различных программ). В DOS она имела бы приблизительно следующий вид:
set CLASSPATH=%CLASSPATH%;c:Program FilesBig Program JAVApackage.jar
А в «версии для Linux» она может выглядеть так:
CLASSPATH=”$CLASSPATH${CLASSPATH:+:} /opt/big-program/ JAVApackage.zip” export CLASSPATH
или так:
export CLASSPATH=”$CLASSPATH${CLASSPATH:+:}/opt/ big-program/JAVApackage.zip”
Как видим, в DOS переменные ограничиваются с двух сторон символами ‘%’, а в bash маркируется только их начало — символом ‘$’: признаком конца служит первый символ, не разрешенный в именах переменных (разрешены буквы, цифры и символ подчеркивания). Кроме того, в bash нет команды, аналогичной SET: интерпретатор распознает присваивание значения переменной просто по наличию знака равенства.
Кстати, благодаря тому, что установка переменной окружения в bash не требует отдельной команды, ее можно сделать частью любой команды (рис. 2). Присвоенное таким образом значение действительно только для данной команды, а в среду bash изменения не вносятся.
Рис. 2. Присваивание значения переменной окружения может быть не только отдельной командой, но и частью другой команды |
Вернемся, однако, к нашему примеру. Несмотря на более короткую форму записи самих переменных и операции присваивания, «Linux-версия» оказалась длиннее. Во-первых, там, где командный язык DOS обходится одним-единственным знаком ‘;’, она содержит устрашающего вида конструкцию ${CLASSPATH:+:}, а во-вторых, в ней присутствует несколько загадочная для пользователя DOS команда export.
И то, и другое — следствие заботы о безопасности. Команда export делает переменную доступной другим командам. В командных файлах DOS переменные всегда внешние, и в подавляющем большинстве случаев это действительно нужно, поскольку переменные служат почти исключительно для обмена данными между программами. В bash же широко используются внутренние переменные — в качестве счетчиков, для хранения промежуточных результатов вычислений или имен файлов и т. д. Поэтому переменные, которые должны быть доступны за пределами данного скрипта, специальным образом отмечаются. Конечно, маловероятно, что имя внутренней переменной случайно совпадет с именем переменной окружения, в результате чего значение последней окажется испорченным и какая-то программа начнет работать неправильно, но, как говорил Козьма Прутков, «лучше перебдеть, чем недобдеть».
Конструкция ${CLASSPATH:+:} вставляет в строку двоеточие (которое в bash служит разделителем элементов CLASSPATH, а также PATH, играющей ту же роль, что и в DOS), но лишь при условии, что строка CLASSPATH не является пустой. Без этой меры предосторожности результатом выполнения команды могла бы оказаться переменная CLASSPATH вида :/opt/big-program /JAVApackage. zip, т. е. с пустым элементом в начале. Такой элемент обозначает текущий каталог, который в Linux, в отличие от DOS, необходимо включать в CLASSPATH (и в PATH) в явной форме. Причем в большинстве дистрибутивов это не делается — из тех же соображений «как бы чего не вышло».
Данное обстоятельство часто сбивает с толку начинающих пользователей Linux:
— Как же так: я ведь и атрибуты executable for all на файл MyGreatCommand поставил, и в первой строке #!/bin/sh написал, а мне все равно говорят: command not found!
— Конечно! Ведь ты же ее в PATH не поместил!
— Какой PATH? Она у меня в текущем каталоге!
— А у тебя разве текущий каталог входит в PATH?
— ???
Впрочем, путь к команде, находящейся в текущем каталоге, можно указать в форме ./MyGreatCommand, и этого будет достаточно, чтобы она запустилась.
Если в DOS с переменной можно сделать, грубо говоря, две вещи — присвоить ей значение и извлечь значение, присвоенное ранее, — то в bash вариантов намного больше: скажем, извлечь значение можно десятком разных способов, включая условное извлечение (с которым мы познакомились на примере конструкции ${CLASSPATH:+:}), извлечение подстроки и извлечение с использованием шаблона. В частности, конструкция ${X##шаблон} позволяет, извлекая строку, удалить из нее максимально возможную соответствующую шаблону подстроку, считая от начала, а ${X%шаблон} — минимально возможную, считая с конца. Так что отсечь «хвосты» упомянутым в предыдущем разделе именам файлов можно было бы, например, следующим образом:
for i in /bin/*.static do j=${i##*/} cp ”$i” ”${j%.static}” done
Подробнее о разных вариантах извлечения переменных рассказывается во врезке на с. 156. А операторами for и do мы займемся во второй части статьи.
Переменные shell
$CDPATH
Это малоизвестная и часто недооцениваемая переменная shell. CDPATH выполняет те же действия для встроенной команды cd, что и PATH для исполняемых файлов. Мудро установив ее значение, вы можете сократить количество нажатий клавиш в день.
Попробуйте это:
$ export CDPATH=.:~:~/docs:/mnt:/usr/src/redhat/RPMS:/usr/src:/usr/lib:/usr/local:
После использования вышеуказанной команды, cd i386 вероятно переместит вас в /usr/src/redhat/RPMS/i386 в Linux-системе на основе Red Hat.
$HISTIGNORE
Установите значение этой переменной во избежание попадания в историю команд подряд идущих одинаковых команд и другой не слишком полезной информации. Это сократит бесконечные нажатия клавиши «стрелка вверх» для получения команды, которая находится до команды, введенной вами 20 раз. Это также позволит избежать заполнения большей части истории команд ненужными записями.
Попробуйте это:
$ export HISTIGNORE="&:ls:ls *:mutt:[bf]g:exit"
После использования вышеуказанной команды, повторяющиеся команды, вызовы ls, запуски почтового клиента mutt без каких-либо дополнительных параметров, плюс вызовы встроенных команд bg, fg и exit не попадут в историю команд.
$MAILPATH
bash сообщит вам о новой почте в любом каталоге, указанном в переменной MAILPATH. Это очень полезно если вы пользуйтесь утилитами типа procmail для сортировки вашей почты по каталогам.
Попробуйте добавить следующие команды к вашему ~/.bash_profile, чтобы получать уведомления о появлении новой почты в любом ящике в ~/Mail.
MAILPATH=/var/spool/mail/$USER for i in `echo ~/Mail/[^.]*` do MAILPATH=$MAILPATH:$i done export MAILPATH unset i
Если вы используете mutt и во многие из каталогов не попадает автоматически отфильтрованная почта, вы можете выбрать только те, куда попадает новая почта, также просматриваемые mutt.
В это случае, попробуйте что-нибудь похожее на нижеследующее в своем ~/.bash_profile:
export `perl -ne 's/^mailboxes /MAILPATH=/ && tr/ /:/ && print && exit' < ~/.muttrc`
$TMOUT
Если вы установите эту переменную в значение больше нуля, bash завершит свою работу по истечении указанного количества секунд, если в течении этого времени не будет ничего введено.
Эти установки полезны при работе под root для уменьшения риска безопасности в тех случаях, когда кто-то забывает выйти из системы, работая как суперпользователь.
Опции set
ignoreeof
Обычно, нажатие Ctrl-D в командной строке выкинет вас из командного интерпретатора. Это может раздражать, если вам регулярно необходимо набирать Ctrl-D в других ситуациях, например для завершения Telnet-сессии. В такой ситуации слишком частое нажатие Ctrl-D закроет ваш shell, что может очень вас расстроить. Это опция делает невозможным использование Ctrl-D для выхода из shell.
Опции shopt
Вы можете установить все нижеуказанные опции, введя shopt -s <опция>.
cdspell
Данная опция исправляет незначительные синтаксические ошибки в вызове команды cd, в этом случае переставленные местами символы, пропущенные и лишние символы будут исправлены без перепечатывания.
cmdhist Использование данной опции - дело вкуса. Указание данной опции заставит bash записывать многострочные команды в историю как однострочные. Это сделано для упрощения редактирования команд.
dotglob
Эта опция позволяет файлам, чьи имена начинаются с точки ('.'), быть возвращенными в результате раскрытия имени пути ( при использовании символов *,?, [] в командах - прим. переводчика ).
extglob
Эта опция позволяет вам использовать расширенный поиск по шаблону в стиле команды egrep ksh-88 или, другими словами, сверх-развитый поиск по шаблону в bash. Доступные операторы:
?(шаблон)
Соответствует количеству появлений указанного шаблона, равному нулю или единице
*(шаблон)
Соответствует количеству появлений указанного шаблона, равному нулю или больше
+(шаблон)
Соответствует одному или большему количеству появлений указанного шаблона
@(шаблон)
Соответствует одному появлению указанного шаблона
!(шаблон)
Соответствует всему, кроме одного появления указанного шаблона
Вот пример. Скажем, вы хотите установить все RPM-файлы в указанном каталоге, кроме тех, которые собраны для архитектуры noarch. Вы можете использовать что-нибудь типа этого:
rpm -Uvh /usr/src/RPMS/!(*noarch*)
Эти выражения могут быть также сгруппированы, тогда, если вы хотите вывести список всех не-PDF и не-Postscript файлов в текущем каталоге, вы можете сделать так:
ls -lad !(*.p?(df|s))
Перемещение курсора
Esc[nA | вверх на n строк |
Esc[nB или Esc[ne | вниз на n строк |
Esc[nC или Esc[na | вправо на n позиций |
Esc[nD | влево на n позиций |
Esc[nE | в начало строки и на n строк вниз |
Esc[nF | в начало строки и на n строк вверх |
Esc[n1;n2f или Esc[n1;n2H | переместить в позицию n1 и строку n2 |
Esc[nZ | на n табуляций назад (как Tab, но в обратную сторону) |
Esc[n` | в той же строке в позицию n |
Esc[nd | в той же позиции в строку n |
EscM | сдвинуть курсор на строчку вверх, если он был в самой верхней строке, то сдвинуть содержимое экрана на строчку вниз (то же самое, что делает NewLine, только "вверх ногами") |
Перенаправление ввода/вывода
Практически все операционные системы обладают механизмом перенаправления ввода/вывода. Linux не является исключением из этого правила. Обычно программы вводят текстовые данные с консоли (терминала) и выводят данные на консоль. При вводе под консолью подразумевается клавиатура, а при выводе – дисплей терминала. Клавиатура и дисплей – это, соответственно, стандартный ввод и вывод (stdin и stdout). Любой ввод/вывод можно интерпретировать как ввод из некоторого файла и вывод в файл. Работа с файлами производится через их дескрипторы. Для организации ввода/вывода в UNIX используются три файла: stdin (дескриптор 1), stdout (2) и stderr(3).
Символ > используется для перенаправления стандартного вывода в файл.
Пример:
$ cat > newfile.txt Стандартный ввод команды cat будет перенаправлен в файл newfile.txt, который будет создан после выполнения этой команды. Если файл с этим именем уже существует, то он будет перезаписан. Нажатие Ctrl + D остановит перенаправление и прерывает выполнение команды cat.
Символ < используется для переназначения стандартного ввода команды. Например, при выполнении команды cat < file.txt в качестве стандартного ввода будет использован файл file.txt, а не клавиатура.
Символ >> используется для присоединения данных в конец файла (append) стандартного вывода команды. Например, в отличие от случая с символом >, выполнение команды cat >> newfile.txt не перезапишет файл в случае его существования, а добавит данные в его конец.
Символ | используется для перенаправления стандартного вывода одной программы на стандартный ввод другой. Напрмер, ps -ax | grep httpd.
Перенаправление вывода
Zsh поддерживает такое же перенаправление вывода как и bash, но кроме этого он поддерживает множество расширений. Некоторые расширения работают только если заданы соответствующие настройки. Например, если не задана опция CLOBBER, то использование команды > для существующего файла приведет к возникновению ошибки и невыполнению команды. На этот случай, для практически всех команд существуют их модификации, которые не зависят от настроек. Например, для команды > существуют ее модификации >! и >|.
Для одновременного перенаправления стандартного вывода и стандартного потока сообщений об ошибках определены дополнительные команды >&, &>, >>&, &>> и их модификации со знаками | и ! (например, &>|). Эти команды соответственно переписывают и дополняют информацию в указанных файлах. Эти команды позволяют избавиться от неуклюжих конструкций вида 1>FNAME 2>&1.
Zsh также позволяет перенаправлять информацию более чем в один файл, аналогично использованию команды tee (это доступно только если определена переменная MULTIOS, что обычно указано по умолчанию). Кроме этого можно одновременно использовать перенаправление и конвейеры. Например, команда date >foo | cat запишет дату в файл foo и выведет ее в стандартный поток вывода. Если установлена переменная MULTIOS, то имя файла, указанное в качестве того, куда перенаправлять информацию, подвергается раскрытию шаблонов (globbing). Таким образом можно использовать команду : > * для обрезания всех файлов в текущем каталоге.
Множественное перенаправление также работает и при вводе информации, позволяя заменять конструкции вида cat foo fubar | sort на конструкции sort <foo <fubar или даже sort <f{oo,ubar}. Zsh даже позволяет использовать перенаправление без указания команды. Если не установлена переменная NULLCMD, то при таком использовании будет возникать ошибка. Но если установлена переменная NULLCMD, или READNULLCMD (она имеет преимущество над NULLCMD), то эти команды будут использоваться для обработки данных. По умолчанию NULLCMD имеет значением команду cat, а READNULLCMD значением команду more. Таким образом команда < file приведет к показу указанного файла.
Perenos
Перенос Linux на другой жесткий диск с сохранением работоспособности
Предстоял мне вчера перенос Linux на сервере с Fujitsu MPE3064AT (6 гиг) на MPG3409AT (40 гиг). Перенести надо было быстро и так, чтобы никто подмены не заметил ;) То есть главное требование полное сохранение работоспособности сервера после замены диска - никаких переустановок. Итак, мой 6-гиговый разбит был так: /dev/hda1 (127M) - swap /dev/hda2 (32M) - ext2fs (/tmp) /dev/hda3 (450M) - ext2fs (/) /dev/hda4 (все остальное) - ext2fs (/var) Домашние каталоги пользователей были в /var/home, куда вела ссылка из /home. Таким образом на 450-мегабайтном разделе были /root, /etc, /bin, /sbin, /usr, /proc и /dev, а /var и /home были на отдельном большом разделе, занимавшем весь остальной объем диска. Ядро версии 2.4.5 (дистрибутив RedHat 6.2) Итак, мои действия: 1. Потушил сервак (/sbin/halt), поставил в него новый винт как /dev/hdb 2. Загрузился, сделал fdisk /dev/hdb и разметил его, но немного по-другому: /dev/hdb1 (127M) - swap /dev/hdb2 (127M) - ext2fs (/boot), сам не знаю зачем, но говорили о проблемах с большими дисками и невозможности грузить ядро расположенное за 1024 цилиндром, я-то о проблеме знал, но столкнулся с совсем другой, о которой позже /dev/hdb3 (1020M) - ext2fs (/) /dev/hdb4 (все остальное) - ext2fs (/var) 3. Отформатировал разделы: mkswap /dev/hdb1 mke2fs /dev/hdb2 mke2fs /dev/hdb3 mke2fs /dev/hdb4 4. Прописал hdb2, hdb3 и hdb4 в /etc/fstab строками: /dev/hdb2 /mnt/boot ext2 defaults 1 1 /dev/hdb3 /mnt/root ext2 defaults 1 1 /dev/hdb4 /mnt/var ext2 defaults 1 1 5. Создал каталоги /mnt/boot, /mnt/root и /mnt/var 6. Примонтировал туда новые разделы: mount /mnt/boot mount /mnt/root mount /mnt/var 7. В Midnight Commander (mc) скопировал: содержимое /boot в /mnt/boot содержимое /var в /mnt/var содержимое / (кроме, разумеется, /mnt и /proc) в /mnt/root Главное при копировании НЕ включать Follow Symlinks, иначе скопируются не ссылки (которые нам надо сохранить в целости и сохранности), а то, на что они указывают. 8. Создал каталог /mnt/root/proc 9. Отредактировал /mnt/root/etc/fstab приведя в соответствие нумерации разделов нового винта. 10. Потушил сервак, переставил новый винт как /dev/hda, старый вообще пока отключил. 11. Перезагрузился с новым винтом в качестве /dev/hda. Загрузиться с системной дискеты (при установке дистрибутива наверянка было предложение таковую создать). При загрузке с нее в приглашении LILO вводим: linux single root=/dev/hda3 12. Сделал /sbin/lilo, дабы записать в MBR нового винта загрузчик и распрощаться с загрузочной дискетой ;) Примечание. Пришлось столкнуться с проблемой больших винтов. LILO после прописывания себя в MBR 40-гигабайтного винта, все равно отказывалось загружаться (вернее загружать /boot/boot.b - несмотря на то, что он был в первых 1024 цилиндрах, вроде бы...). Я взял lilo новее (из дистрибутива RedHat 7.1, обновил его (rpm -U ), прописал вместо linear в lilo.conf строку lba32, снова переписал MBR (/sbin/lilo) и все заработало. Готово! Ничего не переустанавливая (не считая обновления старой версии lilo), мы перенесли всю настроенную ОС со всеми ее разделами на другой винт. |
Перенос каталога /boot в раздел DOS
Последние версии ядра Linux поддерживают возможность размещения файлов, необходимых на этапе загрузки, в файловой системе MS-DOS (или UM-DOS). Поскольку в большинстве случаев разделы DOS занимают как раз те области диска, где связанные с BIOS ограничения не действуют, это позволяет решить многие проблемы больших дисков, возникающие в тех случаях, когда раздел, отведенный для Linux, не может быть использован для размещения в нем каталога /boot. Для того чтобы реализовать такой вариант загрузки, раздел DOS монтируется в режиме чтение/запись, создается каталог (например, /dos/linux), в который перемещаются все файлы из каталога /boot и образы ядер Linux, каталог /boot заменяется символической ссылкой на каталог /dos/linux, новое местоположение каталога /boot указывается в файле /etc/lilo.conf, и, наконец, запускается /sbin/lilo.
Перенос системы и данных на другой компьютер
Виктор Костромин
О смене компьютерного "железа" с сохранением всего программного обеспечения и наработанного файлового багажа.
Смена поколений компьютерной техники происходит сегодня стремительными темпами -- давно ли Pentium 2/233 казался чудом техники? В результате, по крайней мере, раз в два года приходится целиком обновлять "железо". А отдельные компоненты, в частности, жесткий диск иногда приходится менять и независимо от остальных составляющих компьютера. И возникает проблема переезда с одного компьютера на другой или со старого диска на новый. А как гласит народная мудрость – два переезда равны одному пожару. Вот и получается, что смена компьютера грозит потерей половины того, что было наработано в старой системе. Мы столько времени потратили на обустройство своей системы: установку необходимых пакетов, их настройку, прилаживание всяких красивостей и просто накопили массу полезных файлов, потерять которые в спешке переезда вовсе не хочется. А восстановить все это хозяйство, даже если была сделана полная резервная копия системы, непросто [1].
Вот и передо мной недавно встала такая проблема -- получил новый компьютер, а старый нужно было сдать. Требовалось перебраться на новый компьютер со всей настроенной, обжитой и привычной средой, основу которой составляет ОС Linux. Причем имелась еще лицензированная система виртуальных машин VMware, в которой вполне удовлетворительно работала NT 4.0 с MS Office. Если устанавливать на новый компьютер все заново, то пришлось бы устанавливать две операционных системы и массу ПО. Просто обменять жесткие диски старого и нового компьютера тоже не хотелось -- старый был объемом 10, а новый 20 Гбайт. Поэтому возникло желание переместить ОС Linux со всем ПО, которое под ней работает, на новый диск. Задача осложнялась тем, что на новом диске была уже установлена лицензионная ОС Windows 98, а на старом лицензионная ОС Windows 2000 и организована многовариантная загрузка. Хотя я и редко перезагружался в Windows 2000, довольствуясь работой NT в окне Linux, но терять лицензионные версии тоже не хотелось -- не все пользователи перешли пока на Linux и компьютеры с лицензионным ПО еще какое-то время послужат.
из Linux и с ее помощью сначала удалил все вновь созданные разделы (сохранив два первых, где было предустановленное производителем ПО), а затем создал разделы, подобные разделам на первом диске. Вот что было на первом диске:
Disk /dev/hda: 1306 cylinders, 240 heads, 63 sectors/track
Units = cylinders of 7741440 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/hda1 * 0+ 1 2- 15088+ 12 Compaq diagnostics
/dev/hda2 2 321 320 2419200 b Win95 FAT32
/dev/hda3 322 490 169 1277640 83 Linux
/dev/hda4 491 1305 815 6161400 f Win95 Ext'd (LBA)
/dev/hda5 491+ 499 9- 68008+ 82 Linux swap
/dev/hda6 500+ 848 349- 2638408+ 83 Linux
/dev/hda7 849+ 1305 457- 3454888+ 83 Linux
и вот что получилось на втором:
Disk /dev/hdd: 2498 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/hdd1 * 0+ 382 383- 3076416 b Win95 FAT32
/dev/hdd2 383 498 116 931770 b Win95 FAT32
/dev/hdd3 499 669 171 1373557+ 83 Linux
/dev/hdd4 670 2497 1828 14683410 f Win95 Ext'd (LBA)
/dev/hdd5 670+ 702 33- 265041 82 Linux swap
/dev/hdd6 703+ 1259 557- 4474071 83 Linux
/dev/hdd7 1260+ 2497 1238- 9944203+ 83 Linux
Видно, что разбиения существенно различаются, но это нам не помешает. Единственное требование, которое тут надо соблюсти -- новые разделы для Linux по объему должны быть не меньше старых.
Шаг 3.
Монтируем все разделы типа 83 (Linux) нового диска в работающую систему и выполняем для каждого из них команду
[root]# mke2fs /dev/hddN
(в моем случае N принимало значения 3,6,7), а для swap-раздела - команду
[root]# mkswap /dev/hdd5.
Шаг 4. Теперь можно выполнить копирование каждого раздела со старого диска в соответствующий раздел нового диска. Для разделов, не содержащих каталога /boot (у меня это был корневой раздел), можно выполнить такое копирование с помощью программы Midnight Commander (как обычно, с помощью клавиши F5) или же командами
[root]# cp -Rpd /usr /mnt/hdd6
[root]# cp -Rpd /home /mnt/hdd7
(не забудьте про опции). А вот раздел, содержащий каталог /boot, копировать таким образом не имеет смысла. Для него лучше использовать команду
[root]# dd if=/dev/hda3 of=/dev/hdd3
причем раздел /dev/hdd3 нового диска предварительно лучше размонтировать. Размонтировать создаваемый раздел я рекомендую потому, что вначале я выполнил эту команду, не размонтировав /dev/hdd3. Когда копирование закончилось, я попробовал войти в каталог /mnt/hdd3, то есть во вновь скопированный раздел, однако получил сообщение об ошибке. Запуск команды [root]# /sbin/fsck /dev/hdd3 показал, что ошибок в файловой системе раздела /dev/hdd3 просто огромное количество (возможно такой эффект стал следствием того, что операция копирования занимает довольно большое время, и я что-то еще делал в это время в системе).
После завершения процедур копирования имеет смысл проверить файловые системы на новых разделах, для чего выполнить команды (учтите, что команда fsck
предпочитает работать с размонтированными разделами):
[root]# /sbin/fsck /dev/hdd3
[root]# /sbin/fsck /dev/hdd6
[root]# /sbin/fsck /dev/hdd7
При выполнении команды fsck для корневого раздела (/dev/hdd3) у меня появилось несколько сообщений об ошибках, но fsck их успешно исправила.
Вероятно у вас здесь возникает вопрос: почему для раздела с каталогом /boot используется команда dd, а остальные разделы переносятся простым копированием? Потерпите, небольшие пояснения будут даны на шаге 7.
Шаг 6.
Возвращаем новый диск на его законное место в новый компьютер. Однако пытаться загрузиться с него еще рано -- в загрузочной записи (MBR) у него по-прежнему прописан стандартный загрузчик от Microsoft, который знать не знает о Linux. Установленная ранее на компьютере Windows 98 загрузится без проблем, а новых разделов вы не увидите. Копировать главную загрузочную запись со старого диска на новый не имеет никакого смысла -- таблицы разбиения дисков различаются. Я, впрочем, попытался скопировать программу-загрузчик из MBR старого диска, не трогая таблицу разбиения, что делается командой
[root]# dd if=/dev/hda of=/dev/hdd bs=446 count=1, однако это к желаемой цели не привело: загрузчик lilo, который стоял на старом компьютере остановился на полпути, выдав на экран только две буквы: LI. Поэтому не стоит копировать загрузочную запись, лучше переустановить LILO, для чего надо запустить систему с помощью заготовленной на шаге 1 загрузочной дискеты. В процессе загрузки Linux с дискеты утилита проверки конфигурации аппаратного обеспечения kudzu обнаруживает, что это самое аппаратное обеспечение существенно изменилось (естественно, что пакет kudzu должен быть у вас установлен). Сначала kudzu
сообщает, что некоторые аппаратные составляющие удалены и предлагает либо удалить соответствующие настройки, либо сохранить их. Я выбирал вариант "Удалить настройки". Затем kudzu
обнаруживает новое оборудование (видеокарту, монитор, сетевую плату, USB-порты и т.д.) и предлагает настроить новые устройства, с чем, конечно, нужно соглашаться.
После того, как процесс загрузки системы с дискеты завершен, необходимо переустановить lilo командой [root]# /sbin/lilo.
Шаг 7. Теперь уже можно перезагрузиться без дискеты и вы имеете возможность работы в привычной программной среде. Однако нужно еще ликвидировать некоторые потери, явившиеся следствием использования команды dd
для копирования корневого раздела. Дело в том, что первоначальным применением команды dd было создание копии всей файловой системы [1, стр.223]. Что мы и сделали на шаге 5, скопировав файловую систему с корневым разделом в новый раздел /dev/hdd3. При этом все файлы, включая ядро, размещенное в каталоге /boot, копировались по-блочно, с сохранением относительного порядка блоков, отведенных каждому файлу. Если попытаться на шаге 5 копировать раздел /dev/hdd3 с помощью команды cp, то загрузчику lilo, даже после его переустановки загрузить систему не удается. Вероятно, это является следствием того, что нарушается непрерывность размещения ядра на диске и загрузчик уже не может его отыскать. Однако, поскольку с помощью dd мы скопировали файловую систему целиком из раздела, имевшего меньший размер, чем новый раздел /dev/hdd3, та часть нового раздела, которая осталась за пределами файловой системы, стала нам недоступна. Это и есть те потери, которые были упомянуты выше. С этим можно бороться по разному. Можно попытаться на шаге 2 создать этот раздел по размеру в точности равным аналогичному разделу на старом диске. Если размеры соответствующих разделов различаются незначительно, можно просто смириться с небольшими потерями. Я использовал третий вариант, заключающийся в повторном применении утилиты переразбиения дисков Partition Magic. Она умеет трансформировать разделы диска с сохранением всех данных, а значит умеет правильно преобразовывать файловые системы. Поскольку полезная информация занимает не весь раздел /dev/hdd3, можно с помощью программы Partition Magic вначале уменьшить объем этого раздела, а затем расширить один из других разделов, отдав ему освободившееся пространство. В процессе этого преобразования Partition Magic успешно возвратила все потерянные области диска.
На этом процесс переезда можно считать завершенным. По крайней мере у меня все получилось: после перезапуска я снова оказался в привычной программной среде. Даже система Vmware с Windows NT 4.0 запустилась без проблем.
В заключение одно замечание по поводу возможных опасностей, которые могут вас подстерегать при таком переезде. Если просто поменять жесткий диск, то особых опасностей нет, но вот если целиком сменить компьютер, то о некоторых последствиях надо подумать заранее. Во-первых, если вы компилировали ядро под свою конфигурацию аппаратного обеспечения, то на новом компьютере могут возникнуть проблемы с запуском. Во-вторых, чтобы переезд прошел гладко, надо установить пакет kudzu. И третья опасность связана с правильным заданием параметров для частот вертикальной и горизонтальной разверток монитора [3]. Поэтому стоит перед началом описанных манипуляций отключить автоматический переход в графический режим и проводить всю процедуру в текстовом режиме, а после ее завершения до первой загрузки графической оболочки проверить задание параметров в файле /etc/X11/XF86Config-4 (или /etc/X11/XF86Config).
<Об авторе> Виктор Костромин (kos@nbrt.kazan.su), независимый эксперт
0. Литература
[1] "Обновление Linux", http://linuxbegin.by.ru/articles/article20.shtml
[2] Э.Немет, Г.Снайдер, С.Сибасс, Т.Хейн. "UNIX: руководство системного администратора", пер. с англ. С.М.Тимачева, К., BHV, 1999 г.
[3] В.А.Костромин, "Linux для пользователя", изд."БХВ-Петербург", Санкт-Петербург, серия «Самоучитель», 2002 г.
Пересборка ядра
Все делать из /usr/src/linux (если ядро из поставки). Если был сделан upgrade пакета kernel_headers, то м.б. придется сделать ссылки для /usr/include/asm и /usr/include/linux.
make mrproper (удалить весь мусор от предыдущей конфигурации). Если хочется сохранить предыдущую конфигурацию, то сказать: make dep; make clean. конфигурация ядра (не советую делать SCSI-драйвера модулями; увы приходится это делать, если надо писать на ATAPI CD-RW)
make config (в виде ответов на вопросы: Y, N или M), надежно (ничего не забудешь поменять ;), 500 вопросов, на половину из которых не знаешь что сказать. make menuconfig (в виде меню), удобно (нужен ncurses_devel). make xconfig (под X-Windows), очень удобно :) make oldconfig (все ответы из .config)
make dep make bzImage (не надо слепо следовать устаревшей инструкции и делать make boot, он не влезет в загрузчик) make modules insmod loop до перемещения модулей, а то не найдет loop0 удаляем совсем старую копию модулей (если она есть)
rm -rf /lib/modules/2.2.5-22-old (нужен для mkinitrd) делаем текущий набор модулей старым
mv /lib/modules/2.2.5-22 /lib/modules/2.2.5-22-old инсталируем новый набор модулей (в /lib/modules/2.2.5-22)
make modules_install если все-таки сделал SCSI в виде модуля (или еще какой-нибудь модуль нужен при загрузке; ide-scsi не нужен), то пересобери initrd (отредактировать /etc/conf.modules (/etc/modules.conf в RedHat 7.0) - вставить alias scsi_hostadapter имя-драйвераи соответствующие options имя-драйвера имя-драйвера="параметры"; проверить alias eth0 - и выполнить
mkinitrd /boot/имя-нового-initrd 2.2.5-22
после чего отредактировать /etc/lilo.conf). Также необходимо сделать, если раньше был модуль SCSI, а теперь его убрал или включил в ядро. копируем получившийся arch/i386/boot/bzImage в /boot/bzImage.new (переименовав старый, если надо) копируем получившийся System.map в /boot/System.map (переименовав старый?), klogd сначала пытается смотреть в /boot/System.map; если версия ядра не совпадает, то в /System.map, а если и там не совпадает, то в /usr/src/linux/System.map добавляем новую секцию в /etc/lilo.conf со ссылками на новое ядро и м.б. initrd (обязательно сохранив возможность загрузки старого ядра, System.map, modules?, где взять module-info для нового ядра?) /sbin/lilo -v перезагружаемся - DMA все-равно приходится включать вручную через hdparm, ибо не любит он WD :( /usr/src/linux занимает теперь 70МБ (RH 6.2 - 80 MB, RH 7.0 - 106 MB) скомпилированный emu10k1 не грузится, приходится брать модуль из дистрибутива
Перевод WintiX, wintix@bkru
Январь, 2003
Это краткое описание того, что происходит в системе Linux с момента, когда вы включаете питание до момента входа в систему и получения командной строки bash. Понимание этих вещей помогает в решении проблем и настройке системы.
Permanent
Это не отдельное слово, а префикс, который может соединяться со словами radiogroup, overlay1, overlay2. Например,
permanentradiogroup = ..., permanentoverlay1 = ..., permanentoverlay2 = ...,
Означает, что данная функция и так отрабатывается "железом" и XKB не надо об этом заботиться.
Первая попытка
В первую очередь необходимо создать образ разрушенного устройства.
Поскольку на Fish нет достаточного количества свободного места, то будем копировать данные на жесткий диск компьютера Bell:
root@fish# ftp bell
ftp> put '|dd if=/dev/sda8' fishbackup
Но все оказалось не так просто из-за проблемы с сетью: передача большого файла обрывалась через некоторое время. Файл нужно было разбить на части. Размер раздела /dev/sda8 -- 10 ГБайт.
Прибегнув к утилите factor из пакета GNU shellutils:
root@fish# factor 10142
10142: 2 11 461
мы получаем размеры и количество неделимых "долек" раздела /dev/sda8[*2].
Первый метод - самый плохой
Можно "откатиться" к методам, которые использует xmodmap.
Для этого в раскладке клавиатуры Cyrillic коды надо заменить на однобайтные коды koi8-r (раскладку можно взять здесь). При этом "неправильные" программы начнут их воспринимать, принимая за "западноевропейские" символы.
А чтобы "правильные" программы их не "давили", нужно "испортить" XLC_LOCALE
для koi8. Для этого достаточно "закомментарить" (или вообще выкинуть) строчку с encoding_name в файле koi8-r/XLC_LOCALE.
Этот метод будет работать почти со всеми приложениями. Даже со "статически слинкованными бинарниками". Хотя могут возникнуть проблемы с некоторыми мультиязыковыми программами. Но он же, как я уже сказал - самый плохой. По сути, это "возврат к старому". Ради нескольких старых "глупых" программ, придется обманывать все новые "правильные" программы.
"Первый способ"
Если у вас используется первый способ - перечислением необходимых компонентов (keycodes, types, compat, symbols, geometry).
Просто скопируем из файла XF86Config все инструкции типа Xkb**** из секции "Keyboard" в наш файл. И слегка подправим.
Например, у вас там написано
XkbKeycodes "xfree86" XkbTypes "default" XkbCompat "default" XkbSymbols "us(pc104)+ru" XkbGeometry "pc(pc104)"
Надо -
во всех строчках заменить префикс Xkb на Xkb_ ("case" букв менять не обязательно), вставить в каждую строчку инструкцию include, получившиеся инструкции include "..." взять в фигурные скобки и закончить знаком ";", и, наконец, добавить "обрамление" - xkb_keymap { .... }; .
Должно получится
xkb_keymap { Xkb_Keycodes { include "xfree86" }; Xkb_Types { include "default" }; Xkb_Compat { include "default" }; Xkb_Symbols { include "us(pc104)+ru" }; Xkb_Geometry { include "pc(pc104)" }; };
Это и есть полное описание настройки XKB. Которое можно загружать в X-сервер, программой xkbcomp.
Все наши добавки мы можем "приплюсовывать" в соответствующие строчки этого описания.
Первый способ задания конфигурации заключается в том, что вы можете указать непосредственно каждый из компонентов, например
XkbKeycodes "xfree86" XkbTypes "default" XkbCompat "default" XkbSymbols "us(pc104)" XkbGeometry "pc(pc104)"
Как легко догадаться, это означает, что
описание keycodes берется из файла "xfree86" в директории {XKBROOT}/keycodes, причем из файла будет выбран тот блок, который помечен в нем флагом default; описание types берется из файла "default" в директории {XKBROOT}/types; описание compat берется из файла "default" в директории {XKBROOT}/compat; описание symbols берется из файла "us" в директории {XKBROOT}/symbols, блок "pc104"; описание geometry берется из файла "pc" в директории {XKBROOT}/geometry, блок "pc104";
Надо заметить, что в любом блоке (в любых компонентах) может встретиться инструкция
include "имя_файла(имя_блока)" (естественно, имя_блока может отсутствовать)
что, как нетрудно догадаться, означает, что в текущий блок должно быть вставлено другое описание из указанного файла (указанного блока).
Поэтому полное описание может неявно включать в себя данные из многих других файлов, кроме тех, которые вы явно укажете в файле конфигурации X-сервера.
Этот способ (пожалуй, наиболее "цивилизованный") заключается в том, что в учетную карточку надо вписать"Account expiration time" (с помощью программы chpass), естественно, поставив там уже прошедшую дату. В этом случае, юзер как бы существует в системе - письма к нему идут, файлы сохраняются, во всех диагностиках, где может встретиться его имя, оно отображается правильно. Но, в то же время, если юзер попытается войти в систему, ему просто выдастся сообщение, что "ваш account истек".
Однако, это способ тоже не лишен недостатков. Чтобы понять - почему, надо рассмотреть подробнее, что значит "доступ в систему" юзера.
Обычный юзер может войти в систему (и пользоваться ее ресурсами) через терминал или по сети, с помощью telnet. При этом должна проработать программа login (которая проверит имя и пароль юзера и, если все правильно, запустит для него Shell). Эта же программа обычно вызывается для тех, кто заходит через модем и устанавливает IP соединение по модемной линии (PPP или SLIP). (Кстати, login'у можно запретить пропускать юзера, если прописать правильную строчку (запрещающую вход конкретному юзеру) в файле /etc/login.access. Как это правильно сделать, можно посмотреть в man login.access). Но, кроме того, юзер может (если, конечно, ваша система предоставляет такой сервис):
иметь доступ к своим файлам через FTP, тогда проверкой имени/пароля занимается ftpd (программа-сервер FTP); читать свою почту через POP-сервер, тогда проверкой имени/пароля занимается программа popper; иметь доступ к своей домашней директории через сервер "samba", тогда проверкой имени/пароля занимается программа smbd; пользоваться RPC-сервисами - "удаленным запуском программ" (rlogin, rsh
и т.п.), тогда проверкой имени/пароля занимаются соответствующие демоны (rlogind, rshd и т.д.);
Так вот. Проблема в том, что не все перечисленные демоны (программы-серверы), ответственные за допуск юзера к ресурсам, могут обращать внимание на "Account expiration time". И, следовательно, все равно дадут юзеру возможность воспользоваться своими услугами.
Первый способ - простой и неудобный
Самый тривиальный способ - сделать две клавиши-переключатели, каждая с двумя состояниями. Одна клавиша переключает "лат./старый рус.", другая - "лат/новый рус.". Или в терминах "номер группы", первая клавиша переключает "group1/group2", другая - "group1/group3".
Выберем два скан-кода и "подвесим" на них "действия" -
key <...> { actions[Group1]= [ LockGroup(group=2) ], actions[Group2]= [ LockGroup(group=1) ] };
key <...> { actions[Group1]= [ LockGroup(group=3) ], actions[Group3]= [ LockGroup(group=1) ] };
Конечно, это - неполное описание. Надо добавить к первой клавише ее "поведение", когда включена группа 3, на тот случай, если мы нажмем ее в ситуации, когда с помощью второго переключателя уже выбрана третья группа. И, соответственно, "поведение" второй клавиши в состоянии "группа 2".
Кроме того, в описании должна быть кроме таблицы "действий" еще и таблица символов. В нашем случае можно использовать специальный "псевдосимвол" - NoSymbol.
Тогда полное описание будет выглядеть как
key <...> { [NoSymbol],[NoSymbol],[NoSymbol], actions[Group1]= [ LockGroup(group=2) ], actions[Group2]= [ LockGroup(group=1) ], actions[Group3]= [ LockGroup(group=1) ] };
key <...> { [NoSymbol],[NoSymbol],[NoSymbol], actions[Group1]= [ LockGroup(group=3) ], actions[Group2]= [ LockGroup(group=1) ], actions[Group3]= [ LockGroup(group=1) ] };
Но, на мой взгляд, такой способ переключения еще более неудобный. (Я же не обещал "хороших" решений :-).
Поэтому, я его даже не пробовал и вам не предлагаю.
План
Для начала напишем программу на ассемблере процессора 8086 (не паникуйте; я объясню как) и скопируем ее в загрузочный сектор флоппи-диска. Для копирования мы напишем программу на C. Загрузим компьютер с дискеты и будем наслаждаться. 8-) (немножко протащимся? -- прим. редактора:)
Plex
Это клон Bochs (разработчик – Kevin Lawton, создатель проекта Bochs), который позволяет увеличить скорость эмуляции аппаратного обеспечения за счет использования специфических x86-инструкций.
Почему BIOS ?
BIOS копирует загрузочный сектор в оперативную память и передаёт на него управление. Кроме этого, существует ещё несколько функций, которые могут выполняться BIOS'ом. В момент загрузки операционная система ещё не располагает драйверами для поддержки оборудования. Размещение такого драйвера в загрузочном секторе -- задача практически невыполнимая. Должен существовать другой способ решить эту проблему и в этом нам поможет BIOS. Он содержит множество подпрограмм, служащих для различных целей и которыми мы можем воспользоваться. Например, существуют подпрограммы проверки установленного оборудования, подпрограммы управления выводом на печать, определения размера оперативной памяти и пр. Эти подпрограммы называются подпрограммами или обработчиками прерываний BIOS.
Почему иногда вводятся "не те буквы"?
Надеюсь, вы поняли - почему бывает, что "русские буквы не вводятся" или "вводятся, но не везде" (не вводятся, если программа - "неправильная").
Почему же бывает, что "вводятся, но не те"?
Ну, во-первых, возможно у вас программа использует "не те шрифты" (fonts).
В обычных "фонтах" на месте "русских" букв расположены "западноевропейские" (которые имеют те же коды, то и русские в koi8-r).
Во-вторых, может быть, что у вас неправильно настроена locale (переменными окружения). То есть, она указывает на "русский" XLC_LOCALE, но не для кодировки KOI8-R, а для ISO8859-5. Такая ситуация может быть, если вы используете "сокращенное" название locale (ru, ru_RU, ru_SU, russian), которое в файле locale.alias указывает на locale "ru_RU.ISO8859-5".
И, наконец, как это ни странно звучит, возможно, что ошибка в Xlib. Дело в том, что в XFree86 3.3.3 как-раз в Xlib содержится ошибка. Из-за которой Cyrillic коды перекодируются в iso8859-5, если encoding_name - KOI8-R
(если encoding_name ISO8859-5, то вообще ничего не получится, поскольку они, в свою очередь, перепутаны там с Arabic).
Почему не нужно пользоваться VMware?
1. Скорость. В конце концов, мы делим единственный процессор между несколькими операционными системами. Хотя острота проблемы снижается, если запускать пользовательские программы одновременно только в одной системе. Кстати, было бы неплохо установить VMware на многопроцессорных системах, назначив по одному процессору каждой виртуальной машине... хотя, наверное, это невозможно без полной переделки ядра основной операционной системы.
2. Еще раз скорость. Для приемлемой скорости, в распоряжении виртуальной машины должно быть достаточно оперативной памяти. Постарайтесь выделить по крайней мере по 128 МБайт для каждой операционной системы, иначе готовьтесь к интенсивному свопингу. На ноутбуках это проблематично в любом случае (учтите, что жесткие диски ноутбуков не предназначены для интенсивной работы). Постарайтесь не использовать свопинг в виртуальных машинах.
3. В третий раз скорость. Вся периферия (диски, сетевые карты) делятся между виртуальными машинами. Например, если при большом везении на физической машине запущены две виртуальных, то общая полоса пропускания делится между ними поровну (по одной трети -- не забудьте про основную систему!). Реальные результаты могут быть намного ниже -- это зависит, в основном, от дизайна и эффективности основной операционной системы.
Почему работают другие способы руссификации?
Кроме "руссификации через XKB" часто используются "старые" методы - "загрузка xmodmap" и "программы - переключатели клавиатуры" (xruskb, xes и т.п.).
В общем-то, принципиальная разница между ними в том, что ...
Xmodmap "честно" размещает русские буквы во второй группе таблицы символов (при этом используются функции core protocol'а, а не XKB) и определяет клавишу - переключатель между группами. А программы-переключатели "сидят резидентом" в памяти и на каждое переключение раскладки, просто "нагло" переписывают первую группу таблицы символов.
А общее у них то, что они в качестве русских букв используют не коды Cyrillic, а их однобайтные аналоги. Которые, вообще-то, в X-Window отведены под символы национальных алфавитов Западной Европы ("умлауты", "тильды" и т.п.)
То есть, "неправильные" программы (работающие с locale "C") воспринимают их как "родные".
Проблемы как раз возникают с "правильными" программами, которые выставляют "кириллическую" locale. Но с ними, обычно борятся "шаманскими" методами - либо устанавливают "переменные окружения" так, чтобы они НЕ указывали на "кириллическую" locale, либо убирают из XLC_LOCALE строчку, описывающую encoding_name (именно по ней *LookupString "догадываются", что допустимыми являются только коды Cyrillic).
Почему руссификация через XKB не работает?
Кто виноват?
Что такое "русские буквы"?
Процедуры Xlib для преобразования кодов.
Что значит - "установить locale"?
"Иксовая" setlocale().
Программы "правильные" и "неправильные".
Почему работают другие способы руссификации?
Почему иногда вводятся "не те буквы"?
Что делать?
Настройка системы.
Что делать с "неправильными" программами?
Методы "грубого хака".
К сожалению, настроить XKB с "русской" раскладкой клавиатуры - это еще "полдела".
Очень часто при этом русские буквы вообще "не вводятся" или вводятся, но "не те", или вводятся, но "не везде" (не во всех программах).
Почему так легко написать неправильную программу
Как известно, язык shell (впрочем, как многие другие языки, скажем, тот же C) достаточно своенравен и требует от программиста понимания его "духа". Несколько лет назад автору довелось провести занятие по программированию на shell. Слушатели были настроены крайне самоуверенно и категорически отказывались выполнять упражнения, утверждая, что упражнения эти абсолютно банальны. Однако после того, им было предложено описать результат выполнения следующих примеров:
if 0 then echo aaaa fi if 1 then echo bbbb fi if [0] then echo cccc fi if [1] then echo dddd fi
выяснилось, что даже на таком простом уровне shell владели совсем немногие (а можете ли описать результат вы?).
К сожалению, вынужден констатировать, что лишние знания мешают писать правильные программы. Можете проверить это на себе. Попробуйте правильно (то есть для всех без исключения ситуаций) решить казалось бы тривиальную задачу:
Как удалить все файлы в текущем каталоге? Учли ли вы, что в этом каталоге могут быть "чужие"... файлы? Да, да, я догадываюсь, что у вас есть права суперпользователя. Вам их достаточно? Вы написали "rm *"? Вспомните, что в каталоге могут содержаться подкаталоги. Вы исправили команду на "rm -r *"? Но в каталоге могут быть файлы, имя которых начинается с точки. Вы остановились на "rm -r *.*"? Думаю, вас в полной мере позабавила диагностика о попытке удалить вышележащий каталог. Не был ли это корневой каталог? Сердце екнуло? Да целы ваши данные ... скорее всего. Вы уже вспомнили о том, что в каталоге могут быть файлы с именем "-r" или "-f"? Допускаете ли вы, что в текущем каталоге может быть несколько тысяч файлов? Вы уже учли, что имя файла может содержать самые разнообразные символы, в частности, переход на следующую строку? Сколько уровней вложенности каталогов "по зубам" вашему решению – 400-500 каталогов не слабо? Подумайте и скажите, какую еще свинью (список выше не полон) может подложить вам автор? Согласны ли вы, что правильной программы не существует?
С удовольствием познакомлюсь со всевозможными решениями данной задачи.
Почитать на ту же тему на сайте «Софтерра»:
Консольные игрища(http://www.softerra.ru/freeos/11579/)
Разведение и содержание консолей в условиях виртуальности...
Вниманию вебмастеров: использование данной статьи возможно только в соответствии
с правилами использования материалов сайта «Софтерра» (http://www.softerra.ru/site/rules/)
Как заставить cron выполнять наши приказания(http://www.softerra.ru/freeos/16683/)
Автомониторинг системы с помощью cron. Выполнение заданий по расписанию.
Вниманию вебмастеров: использование данной статьи возможно только в соответствии
с правилами использования материалов сайта «Софтерра» (http://www.softerra.ru/site/rules/)
Введение в автоматизацию. Часть 1(http://www.softerra.ru/freeos/18966/)
Реальное использование сценариев cron с подробным описанием каждого случая.
Вниманию вебмастеров: использование данной статьи возможно только в соответствии
с правилами использования материалов сайта «Софтерра» (http://www.softerra.ru/site/rules/)
"Журналируемые файловые системы для GNU/Linux: мифы и реальность"(http://www.softerra.ru/freeos/13019/)
Прошло третье заседание семинара. Интересное сравнение четырех журналируемых файловых систем и другая полезная информация.
Вниманию вебмастеров: использование данной статьи возможно только в соответствии
с правилами использования материалов сайта «Софтерра» (http://www.softerra.ru/site/rules/)
FreeBSD. Свободные записки о свободной системе. Вступление.(http://www.softerra.ru/freeos/12486/)
Начало цикла заметок о FreeBSD. Источники получения дистрибутивов и ссылки на литературу.
FreeBSD. Свободные записки о свободной системе. Инсталляция.(http://www.softerra.ru/freeos/12940/)
Продолжение разговора о FreeBSD. Несколько слов об установке системы.
FreeBSD. Свободные записки о свободной системе. Конфигурирование.(http://www.softerra.ru/freeos/13061/)
Очередная статья цикла о FreeBSD. Настройка некоторых важных параметров после установки.
Новое в мире демонов: FreeBSD 4.4(http://www.softerra.ru/freeos/13601/)
О новой версии FreeBSD - 4.4. Отличия, особенности установки и постинсталляционного конфигурирования.
Вниманию вебмастеров: использование данной статьи возможно только в соответствии
с правилами использования материалов сайта «Софтерра» (http://www.softerra.ru/site/rules/)
Исследуем процессы. Часть 1(http://www.softerra.ru/freeos/18189/)
Какие бывают процессы, как их отличить и как с ними работать.
Вниманию вебмастеров: использование данной статьи возможно только в соответствии
с правилами использования материалов сайта «Софтерра» (http://www.softerra.ru/site/rules/)
Почтовые юзеры
В последнее время получил большое распространение способ доставки почты по протоколу POP. Суть его состоит в том, что почта для конкретного адресата копится на "почтовом сервере" в его личном "почтовом ящике", а сам адресат время от времени запускает на любой машине, имеющей доступ по сети к "почтовому серверу", специальную программу (POP-клиент), которая связывается с сервером и забирает все письма, накопившиеся в "почтовом ящике".
Если в качестве "почтового сервера" используется Unix-машина, то самым простым способом обеспечить прием почты и поддержание "почтового ящика" для конкретного человека - это зарегистрировать его как обычного юзера этой машины. (Точнее, это единственный стандартный способ.) Кроме того, для того, чтобы никто посторонний не мог получить доступ к "почтовому ящику", при соединении с "почтовым сервером" используется процедура аналогичная входу в систему обычного юзера - то есть POP-клиент должен предьявить серверу имя и секретный пароль юзера. Причем, обычно, программа POP-сервер ищет эти имя и пароль в той же базе учетных карточек.
Особенность этой ситуации состоит в том, что человек, который пользуется этой Unix-машиной как "почтовым сервером", может больше никакого отношения к ней не иметь. То есть ему нет необходимости заходить на эту машину как ее пользователю, запускать программы, хранить файлы. Более того, возможно, администратору и не хотелось бы, чтобы такой юзер имел доступ к чему-либо, кроме своего "почтового ящика".
Следовательно, в учетной карточке такого юзера нет домашней директории, или ставится какя-нибудь "левая" директория, одна на всех таких юзеров.
А, самое главное, не должно быть реальной программы Shell. Вместо нее лучше всего подставить какую-нибудь программу, которя просто напечатает сообщение типа: "Sorry, вам сюда нельзя" и завершит работу. В качестве такой программы можно использовать /bin/date - она напечатает текущую дату и завершится.
Кстати, если поле Shell в учетной карточке просто оставить пустым, то система все равно впустит юзера и даст ему "исполнителя комманд" /bin/sh.
Поддержка автономной работы с данными
Использование распределенной файловой системы увеличивает зависимость компьютерных систем от сети. Эта зависимость от данных, к которым люди могут обращаться только по сети, вызывает некоторые интересные проблемы для пользователей лаптопов/мобильных компьютеров, которые нуждаются в доступе к своим данным даже тогда, когда доступ к сети невозможен. Это называется «автономная работа» – система должна функционировать, если ресурсы, которые обычно присутствуют в сети (например, пользовательские данные), по каким-то причинам не доступны. Даже Windows обеспечивает графический интерфейс для возможности маркировки файлов, с которыми вы хотите работать, когда вы отключены от сети, и для синхронизации этих файлов, когда вы соединяетесь повторно.
Распределенные файловые системы Coda и InterMezzo, которые являются в настоящее время доступными для Linux, тоже обеспечивают интегрированную поддержку для автономной работы. Так же сейчас ведется работа над обеспечением этой возможности для файловых систем NFS. Coda и InterMezzo уже поддерживаются ядром Linux – поддержка Intermezzo встроена в ядро, начиная с версии 2.4.5, а Coda вообще была интегрирована в ядро 2.4 с самого начала.
Coda – распределенная файловая система с происхождением из OpenAFS, которая разрабатывается в университете Carnegie Mellon с 1987 года. InterMezzo – относительно новая распределенная файловая система, упор в разработке которой сделан на высокой доступности, гибком дублировании каталогов, поддержке автономных операций, и постоянном кэшировании. Создатели InterMezzo были вдохновлены CMU Coda, но этот проект не основан на исходном тексте Coda. Начальный создатель InterMezzo, Питер Браам, был главой проекта Coda в CMU в течение нескольких лет, и после этого он сам начал разрабатывать InterMezzo и несколько других проектов.
Примеры использования этих файловых систем будут представлены в последующих статьях этой серии.
Подгонка страниц
Мы закончим рассмотрением метода оптимизации подгонкой страниц. Подгонка является методом оптимизации, разработанным для того, чтобы доступ в последовательные страницы виртуальной памяти максимально использовал кэш процессора. В далеком прошлом (то есть больше 10 лет назад) процессорные кэши предпочитали отображать виртуальную память, а не физическую. Это приводило к огромному количеству проблем, включая необходимость очистки кэша в некоторых случаях при каждом переключении контекста и проблемы с замещением данных в кэше. В современных процессорах кэши отображают физическую память именно для решения этих проблем. Это означает, что две соседние страницы в адресном пространстве процессов могут не соответствовать двух соседним страницам в кэше. Фактически, если вы об этом не позаботились, то соседние страницы в виртуальной памяти могут использовать ту же самую страницу в кэше процессора--это приводит к сбросу кэшируемых данных и снижению производительности CPU. Это так даже с множественными ассоциативными кэшами (хотя здесь эффект несколько сглажен).
Код выделения памяти во FreeBSD выполняет оптимизацию с применением подгонки страниц, означающую то, что код выделения памяти будет пытаться найти свободные страницы, которые являются последовательными с точки зрения кэша. Например, если страница 16 физической памяти назначается странице 0 виртуальной памяти процесса, а в кэш помещается 4 страницы, то код подгонки страниц не будет назначать страницу 20 физической памяти странице 1 виртуальной памяти процесса. Вместо этого будет назначена страница 21 физической памяти. Код подгонки страниц попытается избежать назначение страницы 20, потому что такое отображение перекрывается в той же самой памяти кэша как страница 16, и приведет к неоптимальному кэшированию. Как вы можете предположить, такой код значительно добавляет сложности в подсистему выделения памяти VM, но результат стоит того. Подгонка страниц делает память VM предсказуемой, как и обычная физическая память, относительно производительности кэша.
Подготовка диска к использованию в эксклюзивном режиме из командной строки
Выполните следующие команды, заменяя ad2 на имя вашего диска.
# dd if=/dev/zero of=/dev/ad2 count=2
# disklabel /dev/ad2 | disklabel -B -R -r ad2 /dev/stdin
We only want one partition, so using slice 'c' should be fine: # newfs /dev/ad2c
Если вам нужно отредактировать метку диска для создания нескольких разделов (например, раздела подкачки), выполните следующее:
# dd if=/dev/zero of=/dev/ad2 count=2
# disklabel /dev/$d > /tmp/label
Edit disklabel to add partitions: # vi /tmp/label
# disklabel -B -R -r ad2 /tmp/label
newfs partitions appropriately
Теперь ваш диск готов к работе.
Подготовка дисков, используемых в режиме совместимости, при помощи sysinstall
Запустите sysinstall, работая как пользователь root, набрав
# /stand/sysinstall
в командной строке.
Выберите пункт меню Index.
Выберите пункт меню Partition.
Выберите диск для работы при помощи клавиш управления курсором и клавиши SPACE.
Если вы собираетесь использовать для FreeBSD весь диск, нажмите A.
Когда будет выдан вопрос:
Do you want to do this with a true partition entry so as to remain cooperative with any future possible operating systems on the drive(s)?
ответьте yes.
Выберите Write.
Когда будет выдано диалоговое окно для установки менеджера загрузки, выберите None при помощи клавиши SPACE, а затем нажмите ENTER для подтверждения.
Выберите Quit для выхода из FDISK.
После выдачи предупреждения о менеджере загрузки, выберите None
снова.
Выберите пункт Label из меню Index.
Разметьте диск так, как вам нужно. В случае единственного раздела примите размер по умолчанию, тип с наличием файловой системы и точку монтирования (которая не будет использоваться).
Файловая система будет вновь создана, если вы не задали обратное (эту операцию обязательно нужно делать для новых разделов!). Вы получите сообщение об ошибке:
Error mounting /mnt/dev/ad2s1e on /mnt/blah : No such file or directory
Проигнорируйте его.
Выйдите, последовательно нажимая ESCAPE.
Теперь ваш новый диск готов к использованию.
Подготовка дисков в режиме эксклюзивного использования при помощи утилиты sysinstall
/stand/sysinstall, программа установки системы, в последних версиях была расширена так, что позволяет сделать процесс подготовки дисков простой задачей. Редакторы fdisk и disklabel, встроенные в sysinstall, являются инструментами с графическим пользовательским интерфейсом, устраняющими большинство неясностей при разбиении дисков. Для версий FreeBSD 2.1.7 и выше это, наверное, самый простой способ подготовки дисков.
Запустите sysinstall как пользователь root, набрав
# /stand/sysinstall
в командной строке.
Выберите пункт Index.
Выберите пункт Partition.
Выберите диск для редактирования с помощью клавиш управления курсором пробела.
Если вы используете этот диск полностью для FreeBSD, выберите A.
Когда будет выдано сообщение:
Do you want to do this with a true partition entry so as to remain cooperative with any future possible operating systems on the drive(s)?
ответьте No.
Когда будет задан вопрос о том, действительно ли вы хотите это сделать, ответьте Yes.
Выберите Write.
При выдаче предупреждения Writing on installed systems, ответьте Yes.
Выберите Quit для выхода из редактора FDISK и нажмите ESCAPE для возврата в меню Index.
Выберите пункт Label из меню Index.
Разметьте диск так, как это нужно. Для работы с единственным разделом нажмите C для создания раздела, примите размер по умолчанию, установите тип раздела в Filesystem и укажите точку монтирования (которая не используется).
Нажмите W, когда все закончите и захотите продолжить. Файловая система будет размечена вновь, если вы не указали противное (для новых разделов вам это делать необходимо!). Вы получите сообщение об ошибке:
Error mounting /mnt/dev/ad2s1e on /mnt/blah : No such file or directory
Проигнорируйте это сообщение.
Выйдите по нескольким нажатиям клавиши ESCAPE.
Подготовка разделов на диске
Разбивать диск на разделы необходимо, потому что Windows и Linux используют разные способы организации хранения информации на диске и разные способы организации доступа. Рекомендации относительно того, каким образом поделить диск на разделы, давать довольно сложно, так как это во многом зависит от конфигурации дисков и от прихоти хозяина диска. Но все же попробую сформулировать несколько советов. При этом диски и разделы я буду именовать так, как это принято в Linux.
Вначале определим, сколько места оставить для раздела подкачки Linux, учитывая следующее.
В Linux оперативная память и пространство подкачки складываются, образуя общую виртуальную память. Например, если емкость оперативной памяти 8 Mбайт RAM, а под пространство подкачки отведено 12 Mбайт, то размер виртуальной памяти будет равен 20 Mбайт. Для работы Linux требуется, по крайней мере, 16 Mбайт виртуальной памяти. В Linux размер одного раздела подкачки не может превышать 128 Mбайт. Если требуется больше виртуальной памяти, надо создать два раздела подкачки или использовать файл подкачки. Рассчитывая емкость пространства подкачки, следует иметь в виду, что слишком большой его размер может оказаться бесполезным. На компьютере с 16 Mбайт памяти со стандартной конфигурацией Linux и типичном наборе программ вполне достаточно 48 Mбайт пространства подкачки, а для минимальной конфигурации ОС можно вообще обойтись без него.
Теперь оценим размер основных разделов. Если объем диска не превышает 8,4 Гбайт (число цилиндров не более 1024), то диск надо просто разделить пропорционально тому, сколько места требуется для установки каждой из операционных систем. По моему опыту, для нормальной работы с Windows 95/98, Windows NT и Linux вполне достаточно выделить разделы размером 800-1000 Мбайт, а для Windows 2000 надо оставить не менее 1500.
Рассмотрим теперь случай диска с числом цилиндров более 1024. Программы-загрузчики должны располагаться в пределах первых 1024 цилиндров. Между прочим, NT Loader не обязательно должен располагаться в разделе NTFS, да и вообще не в том разделе, где расположены остальные файлы ОС. Для Linux также можно расположить каталог /boot в цилиндрах, а остальное - где угодно. Поэтому мои предложения сводятся к следующему:
загрузочные части всех систем от Microsoft поместить в первый первичный раздел диска, отформатированный в системе FAT16 (в DOS);
следующий первичный раздел выделить для корневого каталога Linux (/), размер которого положить равным примерно 1 Мбайт; выделить раздел подкачки для Linux, а все остальное дисковое пространство сделать расширенным разделом; в расширенном разделе создать логические разделы для каждой из устанавливаемых операционных систем (для Linux можно создать отдельные разделы для каталогов /home и /usr, причем в /home располагаются файлы пользователей, а в /usr устанавливаются все приложения).
Если имеется только Windiws 95 с FAT16, то можно оставить ее в первом разделе. Если же была установлена Windows NT или FAT32, то наличие небольшого раздела с FAT16 будет не лишним. Во-первых, даже в случае любого краха системы всегда можно загрузиться с загрузочной дискеты DOS и хотя бы увидеть, что жесткий диск работоспособен. Во-вторых, файловая система FAT16 видна в любой ОС, так что этот раздел может служить для обмена файлами между разными системами. Но делать этот раздел большим не стоит (FAT16 очень нерационально использует дисковое пространство); достаточно 256 или 512 Мбайт.
Спланировав разделы, приступим к разбиению диска. Во всех ОС имеется тот или иной вариант программы fdisk, предназначенной для создания разделов. Ничего другого, может быть, и не потребовалось бы, если бы речь шла о разбиении чистого диска. Однако мы рассматриваем случай, когда какая-то ОС на диске уже имеется, и надо переразбить диск, не потеряв информации на нем. fdisk для таких операций не подходит.
Лучше всего производить переразбиение с помощью программы PartitionMagic компании Power Quest. Эта программа не только создает новый раздел на свободном месте на диске, но и произвольным образом перемещает существующие разделы. Кроме того, даже для DOS-варианта этой программы предусмотрен графический интерфейс. Программа не работает под Windows NT, однако в ее дистрибутиве есть возможность изготовить две дискеты, служащие для загрузки компьютера в режиме DOS и последующего запуска программы. Эти дискеты позволяют переразбить и диск, на котором установлена NT.