Глава 19. Различные полезные мелочи

Глава 19. Различные полезные мелочи

Русский перевод: Михаил Сгибнев

В этой главе собраны в единое целое различные полезные советы, которым не нашлось места в предыдущих главах.

19.1. Создание установочной/загрузочной дискеты i386

Возможно, Вы захотите изготовить собственные загрузочные дискеты для платформы i386, вместо того, чтобы использовать уже прекомпилированные.

В идеале, собираемый нами образ дискеты должен иметь файловую систему с некоторым набором утилит (такими как sysinst, ls), виртуальный диск и ядро операционной системы. Ядро должно включать в себя поддержку псевдо-устройства "md", которое необходимо для работы виртуального диска.

В первую очередь, в текущем ядре должна быть установлена поддержка псевдо-устройства vnd (в ядре GENERIC присутствует).

  1. Создайте работоспособное ядро, пусть оно буден называться FLOPPY. Это ядро должно быть получено из некоторой модели INSTALL. Таким образом Вы будете иметь файл /sys/arch/i386/compile/FLOPPY/netbsd Смотрите Глава 28, Компиляция ядра для получения инструкций по сборке ядра.

  2. Первым шагом будет создание виртуального диска и помещение в него файла ядра. RAM-диск содержит файловую систему с необходимыми утилитами. Для создания стандартного диска проследуйте в каталог /usr/src/distrib/i386/floppies/ramdisk-big и выполните команду make.

    Эта команда создаст файл ramdisk.fs. Если вы хотите изменить содержимое файловой системы, то отредактируйте файл list.

  3. Теперь необходимо собрать ядро. Проследуем в каталог /usr/src/distrib/i386/floppies/instkernel и выполним команду make.

  4. Следующим нашим шагом будет создание одного или нескольких образов дискет(это зависит от размера ядра). Для этого перейдем в каталог /usr/src/distrib/i386/floppies/bootfloppy-big, и выполним команду make.

    Таким образом, мы получим один или два файла boot1.fs и boot2.fs

  5. И последнее: перенесем образы на дискету командой

    # dd if=boot1.fs of=/dev/fd0a bs=36b
    # dd if=boot2.fs of=/dev/fd0a bs=36b
  6. Все, вставляем дискету в дисковод и пользуемся!

19.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: <HP CD-Writer Plus 8100> type 5 cdrom removable

Замечание

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

19.2.1. Создание образа ISO

Так как 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 /dev/vnd0 cdimage
# mount -r -t cd9660 /dev/vnd0c /mnt
 ... browsing /mnt ...
# umount /mnt
# vnconfig -u vnd0

Содание гибридного CD

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

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

Проверьте man-страницу mkisofs для получения более полной информации.

19.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 -

Опция fs=16m указывает на использование большого fifo для уменьшения вероятности опустошения буфера.

19.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

19.2.4. Создание загрузочного CD

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

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

boot-big.fs - это загрузочный бинарник для CD. Обратите внимание, что путь к boot-big.fs отсчитывается отностительно каталога mydata/ и может отличаться для различных платформ.

19.3. Синхронизация системных часов

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

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

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

В первую очередь нам потребуется адрес публичного NTP сервера. Детальный их список может быть найден на http://ntp.isc.org/bin/view/Servers/WebHome. Для примера, в Италии есть два сервера 1 страты, которые могут быть использованы - tempo.cstv.to.cnr.it и time.ien.it

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

# ntpdate -b ntp1.ien.it ntp2.ien.it

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

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

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

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

Если Вы не имеете постоянного соединения с Internet (например модемное соединение), Вы можете запускать ntpdate из скрипта ip-up, как описано в Глава 21, Практическая настройка TCP/IP в NetBSD. Добавьте следующую строку в скрипт ip-up:

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

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

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

server ntp1.ien.it
server ntp2.ien.it

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

ntpd=YES

NTP - не единственный способ синхронизировать время в сети, Вы можете также использовать демон timed или команду rdate(8) разработанную для 4.3BSD.

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

19.4. Установка менеджера загрузки

Sysinst, программа инсталляции NetBSD, может установить загрузчик NetBSD на жесткий диск, но он может быть установлен или реконфигурирован в более позднее время, с помощью команды fdisk. Например:

# fdisk -B wd0

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

> boot wd0a:netbsd

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

Замечание

Иногда fdisk -B не приносит желаемого результата, например, когда Вы удаляли/ставили другую ОС, типа Windows 95 или Linux с LILO. В этом случае используйте команду fdisk /mbr из DOS, а затем воспользуйтесь fdisk от NetBSD.

19.5. Удаление раздела

Хотя эта операция не из тех, которые придется делать часто, будет полезно ее знать. Пожалуйста, удостоверьтесь, что вы точно себе представляете, что делаете. Например:

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

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

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

19.6. Спикер

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

echo 'BPBPBPBPBP' > /dev/speaker

Замечание

Устройство spkr не установлено в ядре GENERIC, требуется перекомпиляция ядра.

19.7. Забыли пароль root?

Если Вы забыли пароль пользователя root, Вы можете все поправить, воспользовавшись следующей методой:

  1. Загрузитесь в однопользовательском режиме: когда появляется подсказка загрузчика и обратный отсчет, дайте следущую команду:

    > boot -s
  2. При следующей подсказке

    Enter pathname of shell or RETURN for sh:

    нажмите Enter.

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

    # fsck -y /
    # mount -u /
    # fsck -y /usr
    # mount /usr
  4. Смените пароль:

    # passwd root
    Changing local password for root.
    New password: (not echoed)
    Retype new password: (not echoed)
    # 
  5. Используйте команду exit для перехода в многопользовательский режим.

    # exit

19.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

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

Теперь создадим разделы, используя команду 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: <UNUSED>
2: <UNUSED>
3: <UNUSED>

В этом примере диск уже содержит раздел DOS, который будет удален и заменен разделом NetBSD. Команда fdisk -u sd0 позволит в интерактивном режиме модифицировать разделы. Модифицированные данные записываются на диск только перед выходом и fdisk запрашивает подтверждение на запись, так что Вы можете работать спокойно.

Создавать разделы 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

Теперь мы создаем разделы, редактируя 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 могут использоваться, чтобы корректировать размеры разделы.

Заключительная операция - создание файловых систем на разделах (a и e):

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

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

# mount /dev/sd0a /mnt

Теперь можно добавить соответстующую запись в /etc/fstab.

19.9. Файл паролей занят?

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

 # rm /etc/ptmp 

Замечание

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

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

19.10. Как восстановить файлы устройств в /dev

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

# mount -u /
# mount -u /dev

Затем:

# mkdir /newdev
# cd /newdev
# cp /dev/MAKEDEV* .
# sh ./MAKEDEV all
# cd /
# mv dev olddev
# mv newdev dev
# rm -r olddev

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

# mkdir /newdev
# cd /newdev
# cp /usr/src/etc/MAKEDEV.local .
# ( cd /usr/src/etc ; make MAKEDEV )
# cp /usr/src/etc/obj*/MAKEDEV .
# sh ./MAKEDEV all
# cd /
# mv dev olddev; mv newdev dev
# rm -r olddev

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

# uname -m

или так

# sysctl hw.machine_arch
Обновлено: 16.03.2015