CRUX Handbook

RELEASE 1.2

2003-09-17

Это руководство описывает инсталляцию, конфигурирование и управление CRUX линуксом. Пожалуйста, используйте это руководство только для решения вопросов, специфичных для CRUX. Информацию о Linux ищите на Linux Documentation Project.


Оглавление

Предисловие
1. Введение
1.1. Что такое CRUX?
1.2. Почему нужно использовать CRUX?
1.3. Лицензия
1.3.1. Пакеты
1.3.2. Инсталляционные скрипты
1.3.3. ОТСУТСТВИЕ ГАРАНТИЙ
2. Установка CRUX
2.1. Поддерживаемое аппаратное обеспечение
2.2. Установка с CD-ROM
2.3. Обновление с CD-ROM
2.4. Другие методы инсталляции
2.4.1. Сборка собственного загрузочного ядра
2.4.2. Инсталляция по сети
3. Система пакетов
3.1. Введение
3.2. Использование системы пакетов
3.2.1. Установка пакета
3.2.2. Обновление пакета
3.2.3. Удаление пакета
3.2.4. Запрос информации из базы пакетов
3.3. Создание пакета
3.4. Принципы сборки пакета
3.4.1. Главное
3.4.2. Каталоги
3.4.3. Удаление лишних файлов
3.4.4. Pkgfile
4. Система портов
4.1. Введение
4.1.1. Что такое порт?
4.1.2. Что такое система портов?
4.2. Использование системы портов
4.2.1. Синхронизация локальной структуры портов
4.2.2. Просмотр списка локальных портов
4.2.3. Просмотр соответствия версий
4.2.4. Сборка и инсталляция пакетов
5. Конфигурирование
5.1. Инициализационные скрипты
5.1.1. Уровни загрузки
5.1.2. Расположение
5.1.3. Параметры конфигурации в /etc/rc.conf
5.1.4. Конфигурация сети
5.2. Пароли
5.3. Обновление ядра
6. ЧаВО
6.1. Общее
6.2. Инсталляция
6.3. Конфигурирование

Предисловие

Пер Лиден (Per Liden) написал данное руководство. Роберт МакМикан (Robert McMeekin) сконвертировал его в DocBook. Александр Усков перевел его на русский язык. Многие другие давали отзывы и советы.

Параграф 1. Введение

1.1. Что такое CRUX?

CRUX - это компактный, i686-ориентированный дистрибутив Linux, нацеленный на опытных Linux-пользователей. Основная цель дистрибутива - сохранить его простым, это достигается за счет простой, основанной на tar.gz, пакетной системы, BSD-подобных инитскриптов, и относительно маленькой коллекции урезанных пакетов. Вторая цель - использование новых возможностей Linux, утилит и библиотек. Также в CRUX входит система портов, которая предназначена облегчить инсталляцию и обновление приложений.

1.2. Почему CRUX?

В настоящее время существует много разных дистрибутивов Linux, зачем использовать именно этот? Конечно, все, что перечислено дальше вопрос вкуса. Я попытаюсь объяснить вам мое мнение, возможно, вы его разделите. В первую очередь, мне нужен дистрибутив простой с начала и до конца. Далее я хочу, чтоб пакеты были не какие-то альфа-бета и т.п. версий, а стабильные. Я хочу очень просто создавать новые и обновлять старые пакеты (зачастую, для обновления пакета в CRUX достаточно сказать pkgmk -d -u). Я хочу пакеты, оптимизированные под мой процессор (это -march=i686). Я не хочу, чтоб мою файловую загромождали файлы, которые я ни когда не использую (например /usr/doc/*, и т.п.). Если мне нужна дополнительная информация о каких-то программах, ее можно найти в man или в сети. И на конец, я хочу использовать новые возможности Linux, такие как devfs, reiserfs, ext3fs и т.д.

Если вы достаточно опытный Linux-пользователь, вам нужна чистый и цельный Linux-дистрибутив, как база для ваших инсталляций, если вы для управления предпочитаете текстовый редактор графическому интерфейсу, не боитесь закачивать и компилировать программы самостоятельно, этот дистрибутив для вас.

1.3. Лицензия

1.3.1. Пакеты

CRUX - дистрибутив Linux-а, он содержит программы, написанные многими людьми. Каждый программный пакет имеет свою лицензию, выбранную автором(ами) программы. Для того чтобы узнать, какую лицензию имеет каждый конкретный пакет, необходимо посмотреть его исходные коды.

1.3.2. Скрипты сборки

Все скрипты сборки пакетов в CRUX (в категориях base и opt) принадлежат Перу Лиден (Per Liden) и лицензированы по GNU General Public License.

1.3.3. ОТСУТСТВИЕ ГАРАНТИЙ

CRUX распространяется в надежде, что он будет полезен, но БЕЗ ВСЯЧЕСКИХ ГАРАНТИЙ. Вы используете данный продукт на СВОЙ СТРАХ И РИСК.

Параграф 2. Инсталляция CRUX

2.1. Поддерживаемое аппаратное обеспечение

Пакеты в официальном CRUX ISO образе собраны с оптимизацией под i686 (Pentium-Pro/Celeron/Pentium-II и больше). Не пробуйте установить его на i586 (Pentium, AMD K6/K6-II/K6-III) и более слабых процессорах, это просто, но работать не будет. Для того чтобы установить CRUX на i586 системе, вам необходимо скачать i586 версию CRUX ISO образа.

Ядро, используемое для инсталляции (загружаемое с CRUX ISO образа (El Torito)) собрано с поддержкой следующих дисковых контроллеров и USB:

Система Драйвера, включенные в загрузочное ядро
IDE Generic PCI IDE chipset
SCSI 7000FASST, ACARD, Adaptec AACRAID, Adaptec AIC7xxx, Adaptec I2O RAID, AdvanSys, AM53/79C974, AMI MegaRAID, BusLogic, Compaq Fibre Channel, NCR5380/53c400, IBM ServeRAID, SYM53C8XX, Tekram DC390(T) and Am53/79C974
USB USB device filesystem, UHCI (Intel PIIX4, VIA, ...) support, USB Human Interface Device (full HID) support, HID input layer support

Для того, чтоб можно было установить CRUX, ваш дисковый контроллер должен быть перечислен в предыдущей таблице. Если ваше аппаратное обеспечение не указано в таблице, или вы имеете другие проблемы с инсталляцией CRUX, обратитесь к Разделу 2.4.

2.2. Установка с CD-ROM

  1. Выкачайте ISO образ CRUX (crux-1.2.iso). Для того чтобы удостовериться, что образ скачан правильно, используйте утилиту md5sum.

    $ md5sum crux-1.2.iso

    Сравните полученные данные с файлом crux-1.2.md5sum, который находится там же, откуда вы качали образ. Если контрольные суммы совпали, значит образ закачен правильно и его можно прожечь на CD.

  2. ISO образ загрузочный, вставьте свежезависанный CD в ваш привод и перегрузите компьютер. После приглашения загрузчика нажмите Enter.

  3. Подключитесь как root (пароль не нужен).

  4. Создайте (если необходимо) и отформатируйте партицию(ии) куда вы будете ставить CRUX.

    $ fdisk /dev/discs/disc?/disc
    $ mkreiserfs /dev/discs/disc?/part?
    $ mkswap /dev/discs/disc?/part?

    Необходимое количество дискового пространства зависит от тех пакетов, которые вы установите. Я рекомендую не более 1G на рут партицию (CRUX использует около 200MB-500MB в зависимости от конфигурации).

    Использование ReiserFS рекомендовано, поддержка Ext2fs/Ext3fs и JFS тоже есть. В будущем, я рекомендую разделять системные и пользовательские данные, например, использовать отдельную партицию для /home (и по возможности для /var), это заметно упростит вашу жизнь при обновлении/реинсталляции/удалении системы.

    [Note] Замечание

    Проверьте, чтобы значение BIOS Virus Protection стояло в DISABLED, эта опция может помешать fdisk-у правильно сохранить партиции.

  5. Смонтируйте партицию, на которую вы будете устанавливать систему.

    $ mount /dev/discs/disc?/part? /mnt

    Если вы устанавливаете систему на несколько партиций, смонтируйте их в том порядке, как оно должно быть. Например, для разных /home или /var, необходимо:

    $ mkdir /mnt/var
    $ mount /dev/discs/disc?/part? /mnt/var
  6. Активируйте вашу свап партицию(ии).

    $ swapon /dev/discs/disc?/part?
  7. Введите Setup для запуска скрипта установки пакетов. Скрипт спросит, куда смонтирован новая рут партиция и где находятся пакеты, которые планируется установить. Будут установлены ТОЛЬКО те пакеты, которые вы выберите. Однако, я рекомендую установку всех пакетов, отмеченных base.

    После того, как выбранные пакеты будут установлены,Setup покажет лог установки. Удостоверьтесь, что последняя строка в логе - 0 error(s)

    Если позже вам нужно будет добавить какой либо пакет, смонтируйте CRUX CD-ROM и используйте pkgadd для установки.

    [Note] Замечание

    В пакетах не проверяются зависимости. Это значит, что, например, если вы выбрали sendmail, вам необходимо выбрать еще и db.

    Скриншоты к Setup

  8. Теперь самое время собрать ваше ядро и сделать основную настройку системы. Сборка ядра требует "chroot" в вашу новую инсталяцию CRUX.

    $ mount -t devfs devfs /mnt/dev
    $ mount -t proc proc /mnt/proc
    $ chroot /mnt /bin/bash
  9. Установите пароль для root.

    $ passwd
  10. Отредактируйте /etc/fstab в соответствии с конфигурацией ваших файловых системы. Доступные редакторы vim и pico.

  11. Отредактируйте /etc/rc.conf для конфигурации клавиатуры, сервисов и таймзоны. /etc/rc.conf описан в Разделе 5.1.3.

  12. Отредактируйте /etc/rc.d/net, /etc/hosts и /etc/resolv.conf для настройки вашей сети (ip адрес/гейтвей/хостнейм/домен/dns).

  13. Перейдите в /usr/src/linux-2.4.21, отконфигурируйте и соберите новое ядро.

    $ cd /usr/src/linux-2.4.21
    $ make menuconfig
    $ make dep
    $ make clean
    $ make bzImage
    $ make modules
    $ make modules_install
    $ cp arch/i386/boot/bzImage /vmlinuz
    $ cp System.map /

    Запомните! Обязательно должны быть включены следующие опции:

    Code maturity level options  --->
          [*] Prompt for development and/or incomplete code/drivers
    
    File systems  --->
          [*] /dev file system support
          [*]   Automatically mount at boot
  14. Отредактируйте /etc/lilo.conf под ваше новое ядро и запустите lilo чтобы сделать систему загрузочной.

  15. Выньте CRUX CD-ROM из вашего привода и перезапустите систему с жесткого диска.

2.3. Обновление с CD-ROM

  1. Выкачайте CRUX ISO образ (crux-1.2.iso). Для того чтобы удостовериться, что образ скачан правильно, используйте утилиту md5sum.

    $ md5sum crux-1.2.iso

    Сравните полученные данные с файлом crux-1.2.md5sum, который находится там же, откуда вы качали образ. Если контрольные суммы совпали, значит образ закачен правильно и его можно прожечь на CD.

  2. ISO образ загрузочный, вставьте свежезаписанный CD в ваш привод и перегрузите компьютер. После приглашения загрузчика нажмите Enter.

  3. Подключитесь как root (пароль не нужен).

  4. Смонтируйте вашу рут партицию

    $ mount /dev/discs/disc?/part? /mnt

    Если вы устанавливали систему на несколько партиций, смонтируйте их в том порядке, как оно должно быть. Например, для разных /home или /var, необходимо::

    $ mount /dev/discs/disc?/part? /mnt/var
  5. Активируйте вашу свап партицию(ии).

    $ swapon /dev/discs/disc?/part?
  6. Введите Setup для запуска скрипта установки пакетов. Скрипт спросит, куда смонтирован новая рут партиция и где находятся пакеты, которые планируется обновить. Правильнее обновлять все пакеты, чтобы не иметь проблем в дальнейшем. Некоторые новые библиотеки не 100% обратно совместимы.

    Когда Setup обновит выбранные пакеты, будет выведен лог обновления. Удостоверьтесь, что последняя строка лога - 0 error(s).

    Если позже вам понадобятся еще какие либо пакеты, вы сможете смонтировать CRUX CD-ROM и используя pkgadd добавить их.

  7. Теперь необходимо собрать новое ядро. Сборка ядра требует "chroot" в вашу CRUX инсталляцию.

    $ mount -t devfs devfs /mnt/dev
    $ mount -t proc proc /mnt/proc
    $ chroot /mnt /bin/bash
  8. Перейдите в /usr/src/linux-2.4.21, отконфигурируйте и соберите новое ядро. Запомните! Обязательно должны быть включены следующие опции:

    Code maturity level options  --->
          [*] Prompt for development and/or incomplete code/drivers
    
    File systems  --->
          [*] /dev file system support
          [*]   Automatically mount at boot
  9. Отредактируйте /etc/lilo.conf для загрузки с вашего ядра и запустите lilo, чтобы сделать систему загрузочной.

  10. Выньте CRUX CD-ROM из вашего привода и перезапустите систему с жесткого диска.

2.4. Другие методы инсталляции

2.4.1. Сборка собственного загрузочного ядра

Если вы не можете установить CRUX с CD-ROM, потому что ваше оборудование не поддерживается загрузочным ядром, вы можете собрать собственное загрузочное ядро, в которое добавить поддержку того, что вам необходимо. Для этого необходима 1.44Mb дискета, доступ к другой Linux станции и CRUX ISO прожженный на CD. Общее понимание того, как конфигурировать и собирать Linux ядро, вообщем-то тоже необходимо.

  1. Соберите новое ядро с поддержкой вашего железа. Возьмите конфигурацию ядра, используемую старым загрузочным ядром, как начальную точку (вы можете взять конфигурацию здесь) и добавте поддержку вашего железа. Если ядро получается слишком большее, можно удалить SCSI и USB драйвера (конечно, если они вам не нужны), но ни в коем случае не меняйте настроек, связанных с файловыми системами.

  2. Скачайте и распакуйте boot floppy creation kit.

  3. Перейдите в каталог mkbootfloppy и выполните скрипт mkbootfloppy (от root). Этот скрипт требует один аргумент - ядро, которое нужно разместить на образе дискеты. Перед тем, как начать, проверьте, что у вас ни чего не примонтированно в /mnt, так как mkbootfloppy использует этот путь, как точку монтирования.

    $ cd mkbootfloppy
    $ ./mkbootfloppy /path/to/linux/kernel/arch/i386/boot/bzImage
    1440+0 records in
    1440+0 records out
    mke2fs 1.27 (8-Mar-2002)
    Added CRUX *
  4. Запишите полученный boot.img на дискету.

    $ dd if=boot.img of=/dev/fd0
  5. Вставьте дискету и CRUX CD в компьютер, на который вы хотите инсталлироваться, и перезагрузите его.

  6. Установите CRUX.

2.4.2. Установка по сети

Если у вас нет устройства записи CD, или вы не можете загрузить вашу машину с CRUX CD-ROM, или по любой другой причине, не позволяющей установить CRUX нормальным путем (Раздел 2.2) проверьте CRUX Network Setup Guide от Мартина Опель (Martin Opel) или HOWTO install CRUX via NFS от Юджина Дауберта (Jurgen Daubert).

Параграф 3. Система пакетов

3.1. Введение

Система пакетов (pkgutils) сделана максимально простой, в ней все пакеты обычные tar.gz файлы (т-е без всяческих метаданных). Пакеты именуются следующим образом <name>#<version>-<release>.pkg.tar.gz, где <name> название программы, <version> ее версия, и <release> версия пакета. Расширение pkg.tar.gz используется (в отличие от просто tar.gz) для отличия от простых tar.gz файлов, но tar.gz необходимо для использования в pkgadd. Этот путь позволяет легко отделять пакеты от остальных tar.gz файлов.

pkgadd(8), pkgrm(8), pkginfo(8), and pkgmk(8) утилиты управления пакетами. Эти утилиты позволяют устанавливать, удалять, проверять, создавать пакеты и проверять их наличие в базе пакетов.

Когда добавляется пакет, с помощью pkgadd в базу пакетов (расположенную в /var/lib/pkg/db) добавляется запись о нем. Система пакетов не проверяет зависимости и не выдает предупреждений, если вы ставите пакет, требующий наличие другого пакета.

В следующей секции коротко описывается, как использовать утилиты пакетной системы. Дополнительная информация об этих утилитах размещена в man-ах.

3.2. Использование системы пакетов

3.2.1. Установка пакетов

Установка пакета производится утилитой pkgadd. Эта утилита требует только один аргумент - пакет, который вы хотите установить. Например:

$ pkgadd bash#2.05-1.pkg.tar.gz

Устанавливая пакет, менеджер пакетов гарантирует, что ни какие установленные ранее файлы не будут перезаписаны. Если случится конфликт имен, будет выдано сообщение об ошибке, и pkgadd прекратит работу без установки пакета. Сообщение об ошибке содержит имена конфликтующих файлов. Например:

$ pkgadd bash#2.05-1.pkg.tar.gz
bin/sh
usr/man/man1/sh.1.gz
pkgadd error: listed file(s) already installed (use -f to ignore and overwrite)

Чтобы установить пакет, перезаписав конфликтующие файлы, используйте опцию -f (или --force). Например:

$ pkgadd -f bash#2.05-1.pkg.tar.gz

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

[Warning] Предупреждение

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

Как сказано раньше, пакет, сам по себе, не содержит никаких метаданных. Вместо этого менеджер пакета использует имя файла пакета, чтобы определить название пакета и его версию. Таким образом, устанавливая файл пакета с именем bash#2.05-1.pkg.tar.gz пакетный менеджер интерпретирует это, как пакет с именем bash версии 2.05-1. Если pkgadd не может интерпретировать имя файла (например # отсутствует или имя файла не заканчивается на .pkg.tar.gz) выдается ошибка и pkgadd прекращает работу без установки пакета.

3.2.2. Обновление пакетов

Обновление пакета производится командой pkgadd с ключом -u. Например:

$ pkgadd -u bash#2.05-1.pkg.tar.gz

Эта команда заменит ранее установленный bash новым. Если bash, раньше не был установлен, pkgadd выдаст сообщение об ошибке. Система пакетов не контролирует номера версий, следовательно вы можете "обновить" пакет версии2.05-1 до версии 2.04-1 (или до 2.05-1). Устанавливаемый пакет заменит старый.

Обновление пакета эквивалентно выполнению pkgrm перед pkgadd за одним (большим) исключением. Когда вы обновляете пакет (командой pkgadd -u) вы имеете возможность не заменять некоторые ранее установленные файлы. Это обычно нужно для того, чтобы сохранить файлы конфигурации и статистики.

pkgadd при выполнении читает файл /etc/pkgadd.conf. Этот файл содержит правила, описывающие, как pkgadd должен производить обновление. Правило состоит из 3х частей; событие, маска и действие. Событие описывает ситуацию, в которой должно быть применено правило. Сейчас доступен только один тип событий, это UPGRADE. Маска это маска имени файла, записанная, как регулярное выражение/ Действие, в случае события UPGRADE может быть YES или NO. Использование нескольких правил с одним типом события допустимо. Первое правило будет иметь самый низкий приоритет, последнее самый высокий. Например:

#
# /etc/pkgadd.conf: pkgadd(8) configuration
#

UPGRADE         ^etc/.*$                NO
UPGRADE         ^var/log/.*$            NO
UPGRADE         ^etc/X11/.*$            YES
UPGRADE         ^etc/X11/XF86Config$    NO

# End of file

В этом примере pkgadd ни когда не будет обновлять файлы в каталогах /etc/ и /var/log/ (включая подкаталоги), будет обновлять в /etc/X11/ (включая подкаталоги), не тронет /etc/X11/XF86Config. Правило по умолчанию - обновление всего.

[Note] Замечание

Маска ни когда не должна содержать начальный "/" т-к вы обращаетесь к файлам в пакете, а не к файлам на диске.

Если pkgadd находит файл, который не должен обновляться, файл перемещается в /var/lib/pkg/rejected/. Пользователь свободен в возможности исследования и/или удаления файла вручную. Файлы в этом каталоге ни когда не добавляются в базу пакетов. Пример (используя предыдущий /etc/pkgadd.conf):

$ pkgadd -u bash#2.05-1.pkg.tar.gz
pkgadd: rejecting etc/profile, keeping existing version
$ ls /var/lib/pkg/rejected/
etc/
$ ls /var/lib/pkg/rejected/etc/
profile

3.2.3. Удаление пакетов

Пакеты удаляются командой pkgrm. Эта утилита использует только один аргумент - имя удаляемого пакета. Пример:

$ pkgrm bash
[Warning] Внимание

Эта команда удаляет все файлы, принадлежащие пакету без всяких подтверждений. Подумайте дважды перед выполнением этой команды. Проверьте правильность написания имени пакета (например glibc вместо glib).

3.2.4. Запрос информации из базы пакетов

Запрос информации осуществляется утилитой pkginfo. Эта утилита имеет несколько опций для ответа на разные вопросы.

Опция Описание
-i, --installed Список установленных пакетов с версиями.
-l--list package|file Список файлов, принадлежащих указанному package или содержащихся в file
-o, --owner file Владелец (список владельцев) file.

Пример:

$ pkginfo -i
audiofile 0.2.3-1
autoconf 2.52-1
automake 1.5-1
<...>
xmms 1.2.7-1
zip 2.3-1
zlib 1.1.4-1
$ pkginfo -l bash
bin/
bin/bash
bin/sh
etc/
etc/profile
usr/
usr/man/
usr/man/man1/
usr/man/man1/bash.1.gz
usr/man/man1/sh.1.gz
$ pkginfo -l grep#2.5-1.pkg.tar.gz
usr/
usr/bin/
usr/bin/egrep
usr/bin/fgrep
usr/bin/grep
usr/man/
usr/man/man1/
usr/man/man1/egrep.1.gz
usr/man/man1/fgrep.1.gz
usr/man/man1/grep.1.gz
$ pkginfo -o bin/ls
e2fsprogs  usr/bin/lsattr
fileutils  bin/ls
modutils   sbin/lsmod

3.3. Создание пакетов

Пакеты создаются с помощью команды pkgmk. Эта команда использует файл Pkgfile, содержащий информацию о пакете (такую как имя, версия и т.п.) и команды, которые должны быть исполнены для сборки пакета. Более детально: Pkgfile - это bash(1) скрипт, с несколькими определенными переменными (name, version, release and source) и функцией (build). Ниже пример Pkgfile-а, как он должен выглядеть, для сборки утилиты grep(1). Добавлены некоторые комментарии.

# Название пакета.
name=grep

# Версия пакета.
version=2.4.2

# Релиз пакета.
release=1

# Исходник(и), используемые для сборки пакета.
source=(ftp://ftp.ibiblio.org/pub/gnu/$name/$name-$version.tar.gz)

# Функция build() вызывается pkgmk после того,
# как указанные исходники распакованы.
build() {
   # В первую очередь, переходим в каталог с распакованными исходниками.
   cd $name-$version

   # Запускаем configure скрипт с нужными аргументами.
   # В данном случае grep должен быть размещен в /usr/bin и
   # должен быть выключен NLS.
   ./configure --prefix=/usr --disable-nls

   # Сборка.
   make

   # Устанавливаем файлы, но не в /usr, а в $PKG/usr с помощью переменной
   # DESTDIR. Переменная $PKG указывает на временный каталог, который
   # позже  будет упакован в tar.gz-файл. Замечание: переменную
   # DESTDIR не все Makefile-ы, некоторые используют prefix,
   # другие ROOT, и т.д. Исследуйте Makefile не предмет этой возможности
   # Некоторые Makefile-ы вообще не имеют такой возможности.
   # В этом случае, необходимо их пропатчить.
   make DESTDIR=$PKG install

   # Удаляем ненужные файлы, в данном случае страницы info.
   rm -rf $PKG/usr/info
}

В реальном случае, не нужно вставлять все эти комментарии. Ниже приведен реальный Pkgfile для grep(1):

# $Id: package.xml,v 1.1 2003/04/28 23:18:22 per Exp $
# Maintainer: Per Liden <per@fukt.bth.se>

name=grep
version=2.4.2
release=1
source=(ftp://ftp.ibiblio.org/pub/gnu/$name/$name-$version.tar.gz)

build() {
  cd $name-$version
  ./configure --prefix=/usr --disable-nls
  make
  make DESTDIR=$PKG install
  rm -rf $PKG/usr/info
}
[Note] Замечание

Функция build() в этом примере показывает, как нужно собирать grep. Содержимое функции различается, в зависимости от программы, например, программа может не использовать autoconf.

После того, как build() завершит работу, каталог $PKG будет собран в пакет с именем <name>#<version>-<release>.pkg.tar.gz. Перед тем, как собрание пакета завершится, pkgmk сверит содержимое пакета с файлом .footprint. Если этого файла нет, то он будет создан и тест пропущен. Файл .footprint содержит список всех файлов в пакете, если файл был создан ранее или список всех файлов в $PKG (если .footprint не был создан). Если произойдет несовпадение сверки, пакет собран не будет и будет выдано сообщение об ошибке. Вы не должны создавать .footprint вручную. Вместо этого, после того, как пакет обновлен, вам нужно обновить содержимое .footprint файла командой pkgmk -uf.

Если пакет собрался без ошибок, то вы можете устанавливать его с помощью pkgadd. Я настоятельно рекомендую смотреть, как сделаны Pkgfile-ы в других пакетах. Это хороший способ научиться создовать свои.

3.4. Принципы сборки пакетов

3.4.1. Главное

  • Имя пакета всегда должно быть в нижнем регистре (т.е. name=eterm и не name=Eterm). В случае, если пакет добавлен в систему портов CRUX, то же самое имя должно быть использовано в структуре каталогов, т.е. /usr/ports/???/eterm.

  • Не совмещайте несколько разных программ/библиотек в одном пакете. Создайте несколько пакетов.

3.4.2. Каталоги

  • В основном, пакеты должны размещать файлы в следующих каталогах. Исключения конечно дозволяются, но нужно иметь для этого хорошую причину. Но всегда, когда возможно, старайтесь придерживаться следующей структуры.

    Каталог Описание
    /usr/bin/ Пользовательские команды/приложения
    /usr/sbin/ Системные команды/ приложение (например демоны)
    /usr/lib/ Библиотеки
    /usr/include/ Файлы заголовков
    /usr/lib/<prog>/ Плагины, аддоны и т.д.
    /usr/man/ Man страницы
    /usr/share/<prog>/ Файлы данных
    /usr/etc/<prog>/ Файлы конфигурации
    /etc/ Файлы конфигурации для системного софта (демонов и т.д.)
  • /usr/X11R6 и /usr/???/X11 зарезервированы для XFree86. X клиенты, не входящие в XFree86 должны быть размещены в /usr, а НЕ в /usr/X11R6 или /usr/???/X11.

  • /opt зарезервирован для ручной сборки/установки приложений. Пакеты ни когда не должны здесь размещаться.

  • /usr/libexec/ не используется в CRUX, пакеты не должны устанавливаться сюда. Используйте /usr/lib/<prog>/ .

3.4.3. Удаление ненужных файлов

  • Пакеты не должны содержать "ненужные файлы". Под ними подразумеваются info и другая документация кроме man (например usr/doc/*, README, *.info, *.html, и т.д.).

  • Программы, поддерживающие NLS, должны быть собраны с --disable-nls когда это возможно.

  • Бесполезный или устаревшие программы (такие как /usr/games/banner и /sbin/mkfs.minix).

3.4.4. Pkgfile

  • Не добавляйте новые переменные в Pkgfile. Только в очень редких случаях это увеличивает читаемость или качество пакета. Единственными переменными, которые будут гарантированно работать в будущих версиях pkgmk будут name, version, release, и source. Другие переменные могут конфликтовать с внутренними переменными pkgmk.

  • Используйте переменные $name и $version для упрощения модификации пакета. Например, source=(http://xyz.org/$name-$version.tar.gz) лучше, чем source=(http://xyz.org/myprog-1.0.3.tar.gz), потому, что URL автоматически будет изменен с изменением переменной $version.

  • Запомните, source это массив, т.е. всегда используйте source=(...) а не source=...

Параграф 4. Система портов

4.1. Введение

4.1.1. Что такое порт?

Порт, это каталог, содержащий файлы, необходимые для сборки пакета с помощью pkgmk. Это означает, что в этом каталоге как минимум содержатся Pkgfile (с описанием процесса сборки) и .footprint (для определения правильности сборки). Далее, каталог порта может содержать патчи и другие файлы, необходимые для сборки пакета. Важно понимать, что исходный код программы не обязательно должен присутствовать в каталоге порта. В место этого Pkgfile содержит URL, указывающий, откуда исходник может быть выкачен.

Использование слова порт (port) в данном контексте позаимствовано в мире BSD, где подразумевает программу, портированную на систему или платформу. Слово порт иногда может вводить в заблуждение, потому что большинство программ не требуют действительного портирования для запуска на CRUX (или Linux в целом).

4.1.2. Что такое система портов?

Термин Система портов (Ports System) описывает CVS репозиторий, содержащий порты и клиентские программы, которые могут выкачивать порты из этого CVS репозитория. Пользователи CRUX могут использовать команду ports(8) для выкачивания портов из CVS репозитория и размещения из в /usr/ports/. Утилита ports использует CVSup(1) для скачивания/синхронизации.

4.2. Использование системы портов

4.2.1. Синхронизация локальной структуры портов

Сразу после установки CRUX структура портов (/usr/ports/) пустая. Для того, чтобы создать локальную структуру используйте команду ports с ключом -u. Пример:

$ ports -u

Опция -u (update) указывает команде ports связаться с CVS репозиторием и выкачать новые и обновленные порты. В процессе работы программа выводит примерно следующее:

Connected to cvsup.fukt.bth.se
Updating collection base/cvs
...
Updating collection opt/cvs
...
Finished successfully

В выводе видно, какие файлы выкачиваются, обновляются или удаляются.

4.2.2. Просмотр списка локальных портов

Когда локальная структура обновлена, каталог /usr/ports/ содержит две категории пакетов, base и opt. В каждом, из этих каталогов вы можете искать порты. Вы просто просматриваете структуру каталога для просмотра, какие порты доступны.

$ cd /usr/ports/base/
$ ls
autoconf/   filesystem/  man/            sh-utils/
automake/   fileutils/   man-pages/      shadow/
bash/       findutils/   modutils/       sysklogd/
bin86/      flex/        nasm/           sysvinit/
binutils/   gawk/        ncurses/        tar/
bison/      gcc/         net-tools/      tcp_wrappers/
bsdinit/    glibc/       netkit-base/    tcsh/
bzip2/      grep/        patch/          textutils/
cpio/       groff/       perl/           time/
db/         gzip/        pkgutils/       traceroute/
dcron/      kbd/         procps/         util-linux/
devfsd/     less/        psmisc/         vim/
diffutils/  libtool/     readline/       wget/
e2fsprogs/  lilo/        reiserfsprogs/  which/
ed/         m4/          sed/            zlib/
file/       make/        sendmail/

Еще вы можете использовать команду ports с ключом -l для просмотра всех локальных портов. Например:

$ ports -l
base/autoconf
base/automake
base/bash
base/bin86
base/binutils
base/bison
...
opt/xfree86
opt/xmms

Если вы ищете определенный пакет, то проще будет использовать конструкцию вида ports -l | grep sendmail для проверки наличия пакета и его расположения.

4.2.3. Просмотр соответствия версий

Для того, чтобы узнать, есть ли в структуре портов порты, отличающиеся ( возможно более новые), чем те, что установлены у вас в системе, используйте ключ -d. Если разница в версиях найдена, то будет выдана информация, подобная этой:

$ ports -d
Collection  Name     Port     Installed
base        glibc    2.2.5-1  2.2.4-2
opt         xfree86  4.2.0-1  4.1.0-2

Если различий найдено не будет, вывод будет следующим:

$ ports -d
No differences found

4.2.4. Сборка и установка пакетов

После того, как вы нашли порт, который вы хотите собрать и установить, просто перейдите в его каталог и выполните команду pkgmk. Например:

$ cd /usr/ports/base/sendmail
$ pkgmk -d

Опция -d указывает pkgmk, что нужно выкачать недостающие исходники, указанные в Pkgfile (в случае, если исходники уже скачаны эта опция будет проигнорирована). После того, как исходники будут выкачены, пакет начнет собираться. Если пакет соберется нормально, вы можете использовать pkgadd, для его установки или обновления. Например:

$ pkgadd sendmail#8.11.6-2.pkg.tar.gz

Для облегчения жизни pkgmk -d имеет еще два параметра - -i (для установки собранного пакета) и -u (для обновления). Например:

$ pkgmk -d -i

или

$ pkgmk -d -u

Эти команды выкачают и установят/обновят пакет. Замечание: пакет будет установлен/обновлен только в том случае, если он будет нормально собран.

Параграф 5. Конфигурация

5.1. Скрипты инициализации

5.1.1. Уровни загрузки

Следующие уровни загрузки используются в CRUX (определены в /etc/inittab).

Уровень загрузки Описание
0 Halt
1 (S) Single-user Mode
2 Multi-user Mode
3-5 (не используются)
6 Reboot

5.1.2. Расположение

Инициализационные скрипты, используемые в CRUX следуют BSD-нотации и расположены следующим образом.

Файл Описание
/etc/rc Скрипт загрузки системы
/etc/rc.single Загрузочный скрипт для Single-user mode
/etc/rc.modules Скрипт инициализации модулей
/etc/rc.multi Загрузочный скрипт для Multi-user mode
/etc/rc.local Локальный загрузочный скрипт для multi-user mode (по умолчанию пустой)
/etc/rc.shutdown Скрипт выключения системы
/etc/rc.conf Системная конфигурация
/etc/rc.d/ Каталог старт/стоповых скриптов для сервисов

Изменяйте /etc/rc.modules, /etc/rc.local и /etc/rc.conf так, как вам нужно.

5.1.3. Конфигурационные переменные в /etc/rc.conf

Следующие конфигурационные переменные находятся в /etc/rc.conf.

Переменная Описание
KEYMAP

Описывает раскладку клавиатуры, используемую системой после загрузки. Содержимое этой переменной используется как параметр для loadkeys(1). Доступные раскладки клавиатуры находятся в /usr/share/kbd/keymaps/.

Пример: KEYMAP=sv-latin1

TIMEZONE

Описывает таймзону, используемую в системе. Доступные файлы описания зон находятся в /usr/share/zoneinfo/.

Пример: TIMEZONE=Europe/Stockholm

HOSTNAME

Описывает имя хоста.

Пример: HOSTNAME=pluto

SERVICES

Описывает сервисы, которые должна стартовать вместе с системой. Сервисы, описанные в этом массиве, должны иметь старт/стоп скрипты в /etc/rc.d/. Когда система переходит в multi-user mode описанные скрипты вызываются в указанном порядке с параметром start. Когда система выключается или переходит в single-user mode, скрипты вызываются в обратном порядке с параметром stop.

Пример: SERVICES=(crond identd sshd sendmail)

5.1.4. Конфигурация сети

Конфигурация сети находится в сервисном скрипте /etc/rc.d/net. Для включения этого сервиса вам нужно добавить net в массив SERVICES в /etc/rc.conf. По умолчанию, в скрипте сконфигурирован только lo интерфейс, вы можете добавить дополнительные ifconfig(8) и route(8) команды, если вы настраиваете другие сетевые интерфейсы (eth0, eth1, etc). Например:

#!/bin/sh
#
# /etc/rc.d/net: start/stop network
#

if [ "$1" = "start" ]; then
    /sbin/ifconfig lo 127.0.0.1
    /sbin/ifconfig eth0 195.38.1.140 netmask 255.255.255.224
    /sbin/ifconfig eth1 192.168.0.1 netmask 255.255.255.0
    /sbin/route add default gw 195.38.1.129
elif [ "$1" = "stop" ]; then
    /sbin/ifconfig eth1 down
    /sbin/ifconfig eth0 down
    /sbin/ifconfig lo down
else
    echo "usage: $0 start|stop"
fi

# End of file

Если вам нужно сконфигурировать систему с DHCP клиентом, используйте dhcpcd(8) команду (вместо ifconfig(8)). Например:

#!/bin/sh
#
# /etc/rc.d/net: start/stop network
#

if [ "$1" = "start" ]; then
    /sbin/ifconfig lo 127.0.0.1
    /sbin/dhcpcd eth0 [add additional options if needed]
elif [ "$1" = "stop" ]; then
    killall -q /sbin/dhcpcd
    /sbin/ifconfig lo down
else
    echo "usage: $0 start|stop"
fi

# End of file

5.2. Пароли

CRUX по умолчанию использует MD5SUM пароли. Это может быть выключено, если вам нужно использовать традиционные DES пароли. Не забывайте, что DES пароли менее безопасные. Для отключения MD5SUM криптования измените параметр MD5_CRYPT_ENAB в /etc/login.defs на no.

Далее, когда вы компилируете программы, использующие функцию crypt(3) для аутентификации пользователей, удостоверьтесь, что программы слинкованы с библиотекой libcrypt (т.е. используйте -lcrypt при линковке), которая содержит MD5SUM и совместима с DES).

5.3. Обновление ядра

Исходники ядра находятся в /usr/src/linux-2.4.21/ и установлены без использования pkgadd. Если вы решили обновить ваше ядро, вы можете безопасно заменить исходный код ядра более новой версией (или любой другой). Это не внесет противоречий в базу пакетов (потому, что ядро не устанавливалось pkgadd-ом), и при этом не затронет заголовочные файлы, находящиеся в /usr/include/linux и /usr/include/asm, так как они не симлинки, на исходники ядра, а копии.

Параграф 6. Часто задаваемые вопросы

6.1. Главное

  1. Почему название "CRUX"?

    Если вы посмотрите в словаре, то найдете следующее определение "основная, центральная или критическая точка или возможность", также слово CRUX созвучно UNIX/Linux... и наверное по этому я выбрал его.

  2. Когда выйдет следующая версия?

    Стандартный ответ на этот вопрос - "когда она будет закончена". Однако новые версии выходят каждые 3-4 месяца. Между выходом новых версий доступно обновление пакетов через систему портов.

6.2. Установка

  1. CRUX будет работать с AMD K6/K6-II/K6-III?

    Да и нет. AMD K6, K6-II и K6-III имеют i586 (Pentium) совместимый набор инструкций. Пакеты в официальном CRUX ISO собраны с -march=i686, что значит, что CRUX требует процессор с i686 совместимым набором инструкций (т.е. Intel PPro/Celeron/PII/PIII/P4 или AMD K7/Athlon). Однако Юджин Дауберт (Jurgen Daubert) собрал i586 версию CRUX ISO образа, которая находится здесь. i586 версия CRUX ISO работает на AMD K6/K6-II/K6-III.

  2. При загрузке с CRUX CD-ROM получаю kernel panic с диагностикой "VFS: Unable to mount root fs". Что не правильно?

    Это возможно, если в системе более одного CD-ROM устройства. Удостоверьтесь, что вы загружаетесь с "первого" CD-ROM устройства, т.е. /dev/cdroms/cdrom0. Если вы хотите загрузиться не с первого устройства, вы должны ввести CRUX root=/dev/cdroms/cdrom1 в загрузочном приглашении. (cdrom1 указывает на второе устройство, cdrom2 на третье, и так далее).

  3. При первой загрузке CRUX получаю ошибку "Unable to open initial console". Что не так?

    Вы забыли включить поддержку devfs или автоматическое монтирование devfs при загрузке. В инструкции (Секция 2.2) расказано, как включить их.

  4. Когда я логинюсь на свежеустановленный CRUX в первый раз, система спрашивает пароль, но в документации сказано "Подключитесь как root (пароль не требуется)". Что не правильно?

    Скорее всего, вы забыли отредактировать /mnt/etc/fstab перед перезагрузкой или вы ввели не правильное имя root-раздела в загрузочном приглашении.

6.3. Конфигурация

  1. Почему изменения, сделанные в /dev теряются после перезагрузки CRUX?

    CRUX использует devfs, виртуальную файловую систему, находящуюся в RAM. Изменения, сделанные в /dev всегда теряются после выключения питания. Однако, вы можете сконфигурировать devfsd(8) на восстановление настроек после загрузки. Вам нужно изменить /etc/devfsd.conf в соответствии с вашими потребностями. Дополнительную информацию смотрите в man devfsd(8). Пример:

    #
    # /etc/devfsd.conf: devfsd(8) configuration
    #
    
    REGISTER        .*              MKOLDCOMPAT
    UNREGISTER      .*              RMOLDCOMPAT
    
    LOOKUP          .*              MODLOAD
    
    REGISTER        ^sound/.*       PERMISSIONS root.users 660
    REGISTER        ^v4l/.*         PERMISSIONS root.users 660
    
    # End of file
  2. Как мне запустить sshd?

    Отредактируйте файлы /etc/hosts.deny и/или /ets/hosts.allow, чтобы указать, какие хосты (не)имеют доступ. Для того, чтобы разрешить соединяться с вами кому угодно, добавьте sshd: ALL в /etc/hosts.allow. Смотрите hosts_access(5) man для дополнительной информации о формате файлов. После того, как вы это сделаете, стартуйте sshd командой /etc/rc.d/sshd start и/или отредактируйте /etc/rc.conf и добавьте sshd в массив SERVICES, т.е. SERVICES=(... sshd ...), для того, чтобы sshd стартовал вместе с системой.

  3. Mozilla вываливается или отказывается стартовать, в чем проблема?

    Mozilla экстремально чувствительно к отсутствию файла fonts.cache-1. Если Mozilla отказывается стартовать (из-за нарушения сегментации или вообще без диагностики) это может происходить из-за того, что кеш-файл шрифтов отсутствует. Запустите fc-cache (как root) для создания/обновления кеш-файла. Смотрите fc-cache(1) man для информации об этой программе.