Различные полезные мелочи


Перевод: Сгибнев Михаил

Содержание
25.1. Создание установочной дискеты i386
25.2. Создание CD-ROM
25.3. Синхронизирование системных часов
25.4. Установка менеджера загрузки
25.5. Удаление раздела
25.6. Спикер
25.7. Забыли пароль root?
25.8. Добавление нового жесткого диска
25.9. Файл паролей занят?
25.10. Как восстановить файлы устройств в /dev

В этой главе собраны в единое целое различные полезные советы, которым не нашлось места в предидущих главах.
25.1. Создание установочной дискеты i386
В первую очередь, в текущем ядре должна быть установленна поддержка псевдо-устройств vnd (в ядре GENERIC присутствует).
Создайте работоспособное ядро, пусть это будет FLOPPY. Это ядро должно быть получено из некоторой модели INSTALL. Таким образом Вы будете иметь файл /sys/arch/i386/compile/FLOPPY/netbsd
Идите в /usr/src/distrib/i386/floppies/ramdisk и выполните:

# make

Это создаст файл ramdisk.fs в этом каталоге.
Следуем в каталог /usr/src/distrib/i386/floppies/fdset и выполняем:

# make KERN=/sys/arch/i386/compile/FLOPPY/netbsd

Эта команда создаст один или два (в зависимости от размера ядра) файла boot1.fs и boot2.fs
Перенесите эти файлы на дискету командой:

# dd if=boot1.fs of=/dev/fd0a bs=36b
# dd if=boot2.fs of=/dev/fd0a bs=36b

Вставьте первый диск в дисковод и пользуйтесь на здоровье!
25.2. Создание CD-ROM
Для записи данных на CD-ROM может использоваться программы mkisofs и cdrecord, поддерживаются SCSI и IDE устройства. Устройства IDE/ATAPI поддерживаются в NetBSD не требуя эмуляции, так как драйвер может принимать команды ATAPI, что является простым и красивым решением.

Требуется два шага для создания CD: создание ISO образа записываемых данных на жестком диске с помощью утилиты mkisofs и запись его на CD с помощью cdrecord. В следующем примере рассмаривается IDE/ATAPI CD-Writer, вот вывод сообщения dmesg:

cd1 at atapibus1 drive 0: type 5 cdrom removable

Внимание:

При прожиге CD критично значение скорости: поток данных на CD-Writer должен быть постоянным и без пауз, буфер данных ни в коем случае не должен опустошаться. Это означает, что просто не следует заниматься одновременно прожигом и перекомпиляцией ядра или кодированием mp3
25.2.1. Создание образа ISO
Файловые системы CD-ROM

CD-ROM может быть создан, используя различные (порой несовместимые) файловые системы. Может получиться так, что CD записанный на одном копьютере, может совсем или частично не прочитаться на другом. Такая ситуация может произойти, когда Вы открываете на NetBSD системе CD, который был записан в Windows. Следующий параграф расскажет об общих файловых системах CD-ROM.

ISO9660 первый такой сандарт, он был принят в 1988. Он стал общим знаменателем для таких систем, как Apple, MS-DOS, Unix и VMS. Реализация данного стандарта в Windows имеет некоторые ограничения: формат имени - 8.3 (имя.расширение) и 8 уровней вложенности для каталогов. По этой причине, если Вы создатите инсталляционный диск NetBSD под Windows, файлы, чьи имена казались нормальными в Explorer, в действительности будут обрезаны.

Для преодоления этих ограничений, к первоначальному стандарту ISO9660 были добавлены расширения. Их недостаток в том, что поддерживаются они не на всех платформах.

Формат Joliet, введенный Microsoft для систем DOS/Windows, расширяет ISO9660 на предмет длинных имен и увеличивает вложенность каталогов, но обычно не читаем системами Unix (поддерживается в NetBSD-current).

Расширение Rock Ridge было введено для систем Unix, чтобы поддержать соглашения Unix для файловых систем, не теряя совместимость с оригиналом ISO9660. Этот формат используется для создания CD в NetBSD или других Unix системах (в следующих параграфах мы расскажем как создать CD совместимый с Joliet и Rock Ridge).

Также есть некоторое количество других стандартов, например El Torito, используемый для создания bootable CD.

Так как ISO образы имеют обыкновение быть достаточно большими, то стоит проверить, достаточно ли свободного пространства на жестком диске (до 700 мб). Для создания образа, если данные находятся в каталоге mydata выполните:

# mkisofs -flrTv -o cdimage mydata/

Когда будет создан файл cdimage, он может быть просмотрен подобно обычной файловой системе и проверен на предмет наличия ошибок. Например:

# ls -l cdimage
-rw-rw-r-- 1 auser user 284672 Dec 1 11:58 cdimage
# vnconfig -v vnd0 cdimage 512/556/1/1
# mount -r -t cd9660 /dev/vnd0c /mnt
... browsing su /mnt ...
# umount /mnt
# vnconfig -u vnd0

Значение 556 - это результат деления размера файла cdimage на 512.
Содание гибридного CD
mkisofs может создать CD используя формат Joliet; такие компакт-диски будут читаемы на платформах Microsoft. Также возможно создать гибридные компакт-диски, с расширениями RockRidge и с Joliet, которые будут читаемы на платформах Windows и Unix. Например:

$ mkisofs -l -J -R -o cd.iso mydata/

Проверьте man-страницу mkisofs для получения более полной информации.
25.2.2. Запись образа CD
Второй шаг - запись образа CD на диск:

# cdrecord -v speed=2 dev=/dev/rcd1d cdimage

Внимание:

для приводов ATAPI должно использоваться устройство rcd#d, потому что устройство a не принимает команды ATAPI.
Перед прожигом есть возможность выполнить проверку используя опции -dummy и -nofix. Например:

# cdrecord -v -dummy -nofix speed=2 dev=/dev/rcd1d cdimage

Эти два этапа, создание и прожиг, могут быть обьединены в одну команду, без необходимости создания большого временного файла на диске. Посмотрите на эту команду:

# (nice -18 mkisofs -flrT mydata/) | cdrecord -v fs=16m speed=2 dev=/dev/rcd1d -

Опция s=16m указывает на использование большого fifo для уменьшения вероятности опустошения буфера.
25.2.3. Копирование CD
Для копирования CD может использоваться опция -isosize команды cdrecord. Для примера:

# cdrecord -v fs=16m -isosize speed=2 dev=/dev/rcd1d /dev/rcd0d

Примечание:
Если у Вас имеется два привода CD-ROM/RW, то будет лучше, если они будут находиться на разных каналах IDE. Например:

wd0: hard disk, IDE primary master
cd0: CD reader, IDE primary slave
cd1: CD writer, IDE secondary master

25.2.4. Создание загрузочного CD
Создание загрузочного CD - вопрос наличия загрузочного бинарника помщенного на CD: этот бинарный файл подражает дискете. Используйте опцию -b утилиты mkisofs. Для примера:

# mkisofs -vr -b boot.fs -o cdimage mydata/

boot.fs - это загрузочный бинарник для CD. Обратите внимание, что путь к boot.fs отсчитывается отностительно каталога mydata/
25.3. Синхронизирование системных часов
Не секрет, что системные часы идут не точно, часто разница с реальным временем может достигать нескольких минут. Проблема осложняется, если в подчинении у Вас несколько машин в сети - синхронизация часов может стать сущим кошмаром. Для решения этой проблемы на помощь приходит NTP protocol (version 3) - этот протокол позволяет синхронизировать время на сетевых рабочих станциях с помощью нескольких NTP серверов.

Благодаря протоколу NTP возможно корректировать часы отдельной рабочей станции или целой сети. Протокол NTP весьма сложен, определяя иерархическую master-slave структуру серверов, разделенных на страты: вершина иерархии занята сервером страты 1, соединенного с часами высокой точности (например, атомные часы). Ниже расположены серверы страты 2, синхронизирующие время с сервером страты 1 и т.д. Соответственно, от уровня к уровню точность уменьшается. Эта иерархическая структура позволяет избежать перегрузки сервера 1 страты. Если Вы хотите синхронизировать время в сети, то не запрашиваете его у сервера 1 страты, а организуете локальный сервер и хосты синхронизируют время по нему.

К счастью, чтобы использовать инструментальные средства NTP Вы не должны понимать подробности работы протокола (но если интерес есть, обратитесь к RFC 1305), необходимо только знать, как сконфигурировать и запустить некоторые программы. NetBSD уже содержит необходимые инструменты и утилиты для работы с этим протоколом (и другими протоколами синхронизации времени, если потребуется). Этот раздел описывает простой способ всегда иметь правильное системное время.

В первую очередь нам потребуется адрес публичного NTP сервера. Детальный их список может быть найден на http://www.eecis.udel.edu/~mills/ntp/servers.html. Для примера, в Италии есть два сервера 1 страты, которые могут быть использованы - tempo.cstv.to.cnr.it и time.ien.it

Затем, для корректировки системного времени выполните следующую команду с правами пользователя root:

# ntpdate -b tempo.cstv.to.cnr.it time.ien.it

(Замените имена серверов на те, которые больше вам подходят. Опция -b используется ntpdate для установки времени с помощью системного вызова settimeofday, по умолчанию используется вызов adjtime). Эта опция используется когда разница между локальным и правильным временем достаточно большая.

Как Вы могли заметить, ntpdate легок в применении. Следущим шагом мы сделаем автоматический запуск, для того, чтобы всегда иметь правильное системное время. Если Вы имеете постоянное подключение к Internet, Вы можете запустить программу на начальной загрузке со следующей строкой в /etc/rc.conf:

ntpdate=YES ntpdate_hosts="time.ien.it"

Имя NTP серверов может быть указано в переменной ntpdate_hosts; если Вы оставляете это поле пустым, то сценарий начальной загрузки будет искать адреса в файле /etc/ntp.conf.

Если Вы не имеете постоянного соединения с Internet (например можемное соединение), Вы можете запускать ntpdate из скрипта ip-up, как описано в "Глава 11. Работа в сети". Добавьте следующую строку в скрипт ip-up:

/usr/sbin/ntpdate -s -b time.ien.it

(Путь должен быть указан полностью, или скрипт может не найти программу). Опция -s направляет все сообщения со стандартного вывода в syslog(3), что олбычно означает, что все сообщения ntpdate могут быть найдены в /var/log/messages.

Помимо ntpdate есть другие полезные команды NTP. Также возможно превратить один из хостов в сервер NTP для остальных машин сети. Местный сервер синхронизирует свои часы с общедоступным сервером. Для этого типа конфигурации Вы должны использовать демон xntpd и создать файл конфигурации /etc/ntp.conf. Например:

server time.ien.it
server tempo.cstv.to.cnr.it

Xntpd может быть запущен из rc.conf используя следующую опцию:

xntpd=YES

NTP - не единственный способ синхронизировать время в сети, Вы можете также использовать демон timed, разработанный для 4.3BSD. Timed также использует иерархическую master-slave организацию. Когда демон запущен, он опрашивает master и соответственно изменяет время. Может использоваться смешанная структура - timed и xntpd. Одна из машин может получать время с общедоступного NTP сервера и быть timed master для остальных машин в сети. Следует с осторожностью и аккуратностью подойти к решению этого вопроса, timed необходимо запускать с опцией -F hostname, для того, чтобы не изменять локальное время.
25.4. Установка менеджера загрузки
Sysinst, программа инсталляции NetBSD, может установить занрузчик NetBSD на жесткий диск, но он может быть установлен или реконфигурирован в более позднее время, с помощью команды fdisk. Например:

# fdisk -B wd0

Если NetBSD не загружается с жесткого диска, Вы можете загрузить систему с инсталляционной дискеты и запустить ядро на жестком диске. Вставьте инсталляционную дискету ив строке загрузки введите следующую команду:

> boot wd0a:netbsd

Эта команда загрузит ядро с жесткого диска (учтите, что необходимо использовать праильное обозначение диска, например sd0a для SCSI диска).
Примечание:

Иногда fdisk -B не приносит желаемого результата, например, когда Вы удаляли/ставили другую ОС, типа Windows 95. В этом случае используйте команду fdisk /mbr в DOS, а затем воспользуйтесь fdisk от NetBSD.
25.5. Удаление раздела
Хотя эта операция не из тех, которые придется делать часто, будет полезно ее знать. Пожалуйста, удостоверьтесь, что Вы точно себе представляете, что Вы делаете. Например:

# dd if=/dev/zero of=/dev/rwd0c bs=8k count=1

Предыдущая команда удалит раздел (не MBR). Чтобы полностью удалить диск, устройство wd0d должно использоваться. Например:

# dd if=/dev/zero of=/dev/rwd0d bs=8k

25.6. Спикер
Я нашел этот совет в списке рассылки (я не помню автора), чтобы вывести звук от спикера (например в конце длинного сценария). Используется устройство spkr, отображаемое в /dev/speaker.

echo 'BPBPBPBPBP' > /dev/speaker

Внимание:

Устройство spkr не установлено в ядре GENERIC, требуется перекомпиляция ядра.
25.7. Забыли пароль root?
Если Вы забыли пароль пользователя root, Вы можете все поправить, воспользовавшись следующей методой:
Загрузитесь в однопользовательском режиме: когда появляется подсказка загрузчика и обратный отсчет, дайте следущую команду:

> boot -s

При следующей подсказке

Enter pathname of shell or RETURN for sh:

нажмите Enter.
Выполните следующие команды:

# fsck -y /
# mount -u /
# fsck -y /usr
# mount /usr

Смените пароль командой passwd.
Используйте команду exit для перехода в многопользовательский режим.
25.8. Добавление нового жесткого диска
В этом разделе описывается, как добавить новый жесткий диск к уже работающей ситеме NetBSD. В следующем примере будут добавлены новый SCSI контроллер и новый жесткий диск, связанный с контроллером. Если контроллер добавлять не надо, то пропустите соответствующую часть и сразу проследуйте в раздел конфигурации жесткого диска. Установка жесткого диска IDE идентична, разница только в именовании устройств (wd# вместо sd#).

Как всегда, перед закупкой новых аппаратных средств, проконсультируйтесь со списком поддерживаемых аппаратных средств NetBSD и удостоверьтесь, что новое устройство поддерживается системой.

Когда SCSI контроллер физически установлен в систему и новый жесткий диск был подключен, загрузите систему и удостоверьтесь, что устройства были корректно опознаны, используя команду dmesg. Для примера - вывод контроллера NCR-875:

ncr0 at pci0 dev 15 function 0: ncr 53c875 fast20 wide scsi
ncr0: interrupting at irq 10
ncr0: minsync=12, maxsync=137, maxoffs=16, 128 dwords burst, large dma fifo
ncr0: single-ended, open drain IRQ driver, using on-chip SRAM
ncr0: restart (scsi reset).
scsibus0 at ncr0: 16 targets, 8 luns per target
sd0(ncr0:2:0): 20.0 MB/s (50 ns, offset 15)
sd0: 2063MB, 8188 cyl, 3 head, 172 sec, 512 bytes/sect x 4226725 sectors

Если устройство не появляется в выводе, проверьте, поддерживается ли оно текущим ядром и в случае необходимости, перекомпилируйте ядро.

Теперь создадим разделы, используя команду fdisk. Спера проверим текущий статус диска:

# fdisk sd0
NetBSD disklabel disk geometry:
cylinders: 8188 heads: 3 sectors/track: 172 (516 sectors/cylinder)

BIOS disk geometry:
cylinders: 524 heads: 128 sectors/track: 63 (8064 sectors/cylinder)

Partition table:
0: sysid 6 (Primary 'big' DOS, 16-bit FAT (> 32MB))
start 63, size 4225473 (2063 MB), flag 0x0
beg: cylinder 0, head 1, sector 1
end: cylinder 523, head 127, sector 63
1:
2:
3:

В этом примере диск уже содержит раздел DOS, который будет удален и заменен разделом NetBSD. Команда fdisk -u sd0 позволит в интерактивном режиме модифицировать разделы. Модифицированные данные записываются на диск только перед выходом и fdisk запрашивает подтверждение на запись, так что Вы можете работать спокойно.
Геометрия диска
Геометрия диска, о котором сообщает fdisk может казаться запутанной. Dmesg сообщает о 4226725 секторах с 8188/3/172 для C/H/S, но 8188*3*172 дает 4225008 а не 4226725. Это чаще всего происходит для современных дисков, которые не имеют фиксированной геометрии и число секторов может быть различным в зависимости от цилиндра. Единственный интересный параметр - номер секторов. Диск сообщает о геометрии C/H/S, но это - фиктивная геометрия: значение 172 - результат общего количества секторов (4226725) разделенное на 8188 и затем на 3.

Чтобы делать вещи более запутанными, BIOS использует еще одну "поддельную" геометрию (C/H/S 524/128/63), который дает общее количество 4225536, значение, которое является лучшим приближением к реальному чем 425008. Чтобы поделить диск, мы будем использовать геометрию BIOS, чтобы сохранить совместимость с другими операционными системами, хотя мы будем неточны с количеством секторов (4226725 - от 4225536 до 1189 секторов = 594 Кбайта)

Создавать разделы BIOS будем с помощью команды fdisk -u. В результате:

Partition table:
0: sysid 169 (NetBSD)
start 63, size 4225473 (2063 MB), flag 0x0
beg: cylinder 0, head 1, sector 1
end: cylinder 523, head 127, sector 63
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>

Теперь пришло время создавать разделы для NetBSD. Порядок действий:

# disklabel sd0 > tempfile
# vi tempfile
# disklabel -R -r sd0 tempfile

Если Вы пробуете создать раздел непосредственно

# disklabel -e sd0

То получите следующее сообщение:

disklabel: ioctl DIOCWDINFO: No disk label on disk;
use "disklabel -r" to install initial label

потому что раздела еще не существует на диске.

Теперь мы создаем разделы, редактируя tempfile, по аналогии с нижеследующим:

# size offset fstype [fsize bsize cpg]
a: 2048004 63 4.2BSD 1024 8192 16 # (Cyl. 0*- 3969*)
c: 4226662 63 unused 0 0 # (Cyl. 0*- 8191*)
d: 4226725 0 unused 0 0 # (Cyl. 0 - 8191*)
e: 2178658 2048067 4.2BSD 1024 8192 16 # (Cyl. 3969*- 8191*)

Примечание:

Когда разделы были созданы, есть возможность оптимизировать их изучая вывод команды newfs -n /dev/sd0a, который предупреждает о существовании свободных секторов в конце раздела. Значения, о которых сообщает newfs могут использоваться, чтобы корректировать размеры разделы.
Заключительная операция - создание файловых систем на разделах:

# newfs /dev/sd0a
# newfs /dev/sd0e

На диске теперь создано два раздела и он готов к использованию. Например:

# mount /dev/sd0a /mnt

25.9. Файл паролей занят?
Если Вы изменяли пароль и получили такое таинственное сообщение “Password file is busy”, то обычно это означает, что файл /etc/ptmp не был удален. Этот файл - временная копия /etc/master.passwd. Проверьте и при необходимости удалите (ptmp, не master.passwd.)
Внимание:

Если файл /etc/ptmp существует, Вы можете также получить предупреждающее сообщение при запуске. Например:

root: password file may be incorrect - /etc/ptmp exists

25.10. Как восстановить файлы устройств в /dev
После перехода в однопользовательский режим разделы все еще остаются “rw” (read-write); Вы должны использовать shutdown now пока вы в многопользовательском режиме или загрузиться с опцией -s и сделать / и /dev доступными для записи.

# mount -u /
# mount -u /dev

Затем:

# mkdir /nudev
# cd /nudev
# cp /dev/MAKEDEV* .
# sh ./MAKEDEV all
# cd /
# mv dev odev
# mv nudev dev
# rm -r odev

Или если есть все исходники в /usr/src:

# mkdir /nudev
# cd /nudev
# cp /usr/src/etc/MAKEDEV.local .
# cp /usr/src/etc/etc.$arch/MAKEDEV .
# sh ./MAKEDEV all
# cd /
# mv dev odev; mv nudev dev
# rm -r odev

Вы можете определить $arch так:

# uname -m

Или так:

# sysctl hw.machine_arch

Используя второй путь копирования MAKEDEV's из дерева исходных текстов может прибавить лишних устройств для архитектуры i386. Например может оказаться 16 разделов вместо 8. Если Вы используете “old” MAKEDEV's из /dev, то лишние устройства не образуются.

Обновлено: 13.03.2015