<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF118%3ADrBrown3</id>
		<title>LXF118:DrBrown3 - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF118%3ADrBrown3"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF118:DrBrown3&amp;action=history"/>
		<updated>2026-05-13T13:06:53Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF118:DrBrown3&amp;diff=10220&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF118:DrBrown3&amp;diff=10220&amp;oldid=prev"/>
				<updated>2010-05-20T10:23:22Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Собираем пакеты Debian==&lt;br /&gt;
&lt;br /&gt;
: '''Deb’ы''' Возможно, лучшее, что есть в Debian – это система управления пакетами, поэтому познакомимся с ''APT'' и создадим свои Deb-файлы.&lt;br /&gt;
&lt;br /&gt;
В данной статье мы заглянем внутрь Deb-пакета и пока жем, как собрать его самому. Deb-файл – это архив архивов. Его формат описан в странице руководства по Deb. На верхнем уровне это архив ar, внутри которого (обычно) три файла. Туда мы можем легко проникнуть:&lt;br /&gt;
&lt;br /&gt;
 $ ar x /var/cache/apt/archives/sox_14.0.0-5_i386.deb&lt;br /&gt;
 $ ls&lt;br /&gt;
 control.tar.gz data.tar.gz debian-binary&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF118_46_1.jpg|300px]]Препарирование Deb. Верхний уровень можно распаковать с помощью ''ar'', а нижние — с помощью ''tar''.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Файл debian-binary можно пропустить, он содержит только номер версии формата пакета (в данном слу чае 2.0). Файл '''data.tar.gz''' – это сжатый tar-архив реального содержимого пакета: файлов,&lt;br /&gt;
которые будут скопированы куда нужно при его установке. Ниже&lt;br /&gt;
приведены примеры строк из вывода – они дадут вам общее представление; этот пакет состоит из нескольких исполняемых файлов&lt;br /&gt;
и кое-какой документации:&lt;br /&gt;
&lt;br /&gt;
 $ tar tf data.tar.gz&lt;br /&gt;
 ./usr/bin/sox&lt;br /&gt;
 ./usr/lib/mime/packages/sox&lt;br /&gt;
 ./usr/share/doc/sox/&lt;br /&gt;
 ./usr/share/doc/sox/README.Debian&lt;br /&gt;
&lt;br /&gt;
Наконец, файл '''control.tar.gz''' содержит управляющую информацию о пакете:&lt;br /&gt;
&lt;br /&gt;
 $ tar tf control.tar.gz&lt;br /&gt;
 ./&lt;br /&gt;
 ./postinst&lt;br /&gt;
 ./postrm&lt;br /&gt;
 ./md5sums&lt;br /&gt;
 ./control&lt;br /&gt;
&lt;br /&gt;
Здесь '''postinst''' и '''postrm''' – скрипты, выполняемые сразу после установки и уда ления пакета соответственно. В сценарии '''postinst'''&lt;br /&gt;
можно, например, добавить приложение в меню рабочего стола, зарегистрировать MIME-тип, запустить или перезапустить службу или собрать информацию о пользователе для начального файла настроек. В скрипте '''postrm''' можно, например, удалить файлы, которые созданы пакетом и не являются частью его самого. Есть еще скрипты '''preinst''' и '''prerm''', они запускаются непосредственно перед&lt;br /&gt;
установкой или удалением пакета. Например, скриптом '''prerm''' останавливают работающий сервис, который собрались удалить.&lt;br /&gt;
&lt;br /&gt;
Файл '''md5sums''' хранит контрольные суммы файлов пакета, а в файле '''control''' собрана оставшаяся метаинформация. Вот (отредак тированный) пример:&lt;br /&gt;
&lt;br /&gt;
  Package: sox&lt;br /&gt;
  Version: 14.0.0-5&lt;br /&gt;
  Depends: libc6, libltdl3, libsamplerate0, libsox0&lt;br /&gt;
  Recommends: libsox-fmt-base, libsox-fmt-alsa&lt;br /&gt;
  Suggests: libsox-fmt-all&lt;br /&gt;
  Section: sound&lt;br /&gt;
  Priority: optional&lt;br /&gt;
  Description: Swiss army knife of sound processing&lt;br /&gt;
&lt;br /&gt;
'''Control''' – обычный текстовый файл, содержащий именованные поля, по одному на строку. Его формат описан на man-странице '''deb-control'''. Обязательны четыре его атрибута: '''Package, Version, Maintainer''' и '''Description'''.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что строка '''Depends''': в файле '''control''' означает абсолютную зависимость. Если A зависит от B, то A не может запускаться без B и программа управления пакетами не разрешит установить A, ес ли B у вас нет. Однако в файле '''control'''&lt;br /&gt;
можно указать и более слабые зависимости. Например, строка '''Recommends''': используется для перечис ления пакетов, которые&lt;br /&gt;
обычно должны устанавливаться вместе с данным. Еще более слабый вариант, строка '''Suggests''':, описывает пакеты, способные&lt;br /&gt;
улучшить работу данного. Например, пакет ''sox'', показанный выше, зависит от библиотеки '''libsox0''', рекомендует установку ''libsox-fmt-base'' (минимальный набор библиотек форматов ''sox'') и советует пакет ''libsox-fmt-all'' (метапакет, добав ляющий к декодеру&lt;br /&gt;
библиотеки для большинства существующих аудиоформатов). Для установленного пакета всю эту информацию можно получить командой&lt;br /&gt;
&lt;br /&gt;
  $ apt-cache show sox&lt;br /&gt;
&lt;br /&gt;
===Выкатим собственные пакеты===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF118_47_1.jpg|300px]]Минимальная структура директорий для создания пакета Deb. Выходной файл (сам Deb) можно&lt;br /&gt;
поместить в любой каталог.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Как же создать Deb-файл? Я начал с двух маленьких скриптов ''helloworld'' и ''world'', примерно таких:&lt;br /&gt;
&lt;br /&gt;
  #! /bin/bash&lt;br /&gt;
  echo -n hello&lt;br /&gt;
 world&lt;br /&gt;
 world:&lt;br /&gt;
  #! /bin/bash&lt;br /&gt;
  echo ‘ world’&lt;br /&gt;
&lt;br /&gt;
Предполагая, что они на ходятся в каталоге, который входит в мой путь поиска, я могу запустить ''helloworld'' и увидеть то, что ожидал:&lt;br /&gt;
&lt;br /&gt;
  $ helloworld&lt;br /&gt;
  hello world&lt;br /&gt;
&lt;br /&gt;
Я разбил задачу на две программы, потому что хочу создать два Deb-пакета (по одному на ка ж дую из них) и сделать эти пакеты зависимыми друг от друга. В частности, пакет ''helloworld'' будет зависеть от пакета ''world''. Начнем с пакета ''world''. Потребуется организовать достаточно специфичную структуру каталогов. Сначала создадим директорию '''wdir''' для работы:&lt;br /&gt;
&lt;br /&gt;
  cd; mkdir wdir; cd wdir&lt;br /&gt;
&lt;br /&gt;
Внутри создадим подкаталог debian, а в нем – иерархию, повторяющую структуру каталогов установленного пакета. В этом&lt;br /&gt;
примере установленный пакет состоит только из скрипта ''world'', и я решил установить его в '''/usr/local/bin'''. Поэтому моя структура&lt;br /&gt;
каталогов была очень простой, и я создал ее так:&lt;br /&gt;
&lt;br /&gt;
 $ mkdir -p debian/usr/local/bin&lt;br /&gt;
 $ cp world debian/usr/local/bin/&lt;br /&gt;
&lt;br /&gt;
Затем&lt;br /&gt;
я создал&lt;br /&gt;
контрольный&lt;br /&gt;
файл с описанием&lt;br /&gt;
пакета.&lt;br /&gt;
Он выглядит&lt;br /&gt;
так:&lt;br /&gt;
&lt;br /&gt;
 Package: world&lt;br /&gt;
 Version: 1.1-1&lt;br /&gt;
 Maintainer: Chris Brown &amp;lt;chris@example.com&amp;gt;&lt;br /&gt;
 Description: Program to print “world”&lt;br /&gt;
 Section: utils&lt;br /&gt;
 Priority: optional&lt;br /&gt;
 Architecture: all&lt;br /&gt;
 Depends: bash&lt;br /&gt;
&lt;br /&gt;
Отметьте,&lt;br /&gt;
что в качестве&lt;br /&gt;
'''Architecture''': я указал '''all'''. Так как наши&lt;br /&gt;
программы&lt;br /&gt;
являются&lt;br /&gt;
сценариями,&lt;br /&gt;
они не привязаны&lt;br /&gt;
к конкретной&lt;br /&gt;
двоичной&lt;br /&gt;
архитектуре,&lt;br /&gt;
такой&lt;br /&gt;
как '''i386''' или '''Sparc'''. Я скопировал&lt;br /&gt;
свой контрольный&lt;br /&gt;
файл в подкаталог&lt;br /&gt;
'''DEBIAN''' внутри&lt;br /&gt;
каталога&lt;br /&gt;
'''debian''' (туда,&lt;br /&gt;
где его найдет&lt;br /&gt;
программа&lt;br /&gt;
сборки&lt;br /&gt;
пакетов).&lt;br /&gt;
&lt;br /&gt;
 $ mkdir debian/DEBIAN&lt;br /&gt;
 $ cp /home/chris/control debian/DEBIAN/&lt;br /&gt;
&lt;br /&gt;
Теперь&lt;br /&gt;
можно&lt;br /&gt;
собрать&lt;br /&gt;
пакет:&lt;br /&gt;
&lt;br /&gt;
$ dpkg-deb --build debian/ .&lt;br /&gt;
&lt;br /&gt;
Готово!&lt;br /&gt;
Теперь&lt;br /&gt;
в текущем&lt;br /&gt;
каталоге&lt;br /&gt;
есть пакет&lt;br /&gt;
'''world_1.1-1_all.deb''', и я могу&lt;br /&gt;
установить&lt;br /&gt;
его так же, как и любой&lt;br /&gt;
другой.&lt;br /&gt;
&lt;br /&gt;
 $ sudo dpkg -i world_1.1-1_all.deb&lt;br /&gt;
 Selecting previously deselected package world.&lt;br /&gt;
 (Reading database ... 174457 files and directories currently installed.)&lt;br /&gt;
 Unpacking world (from .../chris/wdir/world_1.1-1_all.deb) ...&lt;br /&gt;
 Setting up world (1.1-1) ...&lt;br /&gt;
&lt;br /&gt;
Таким&lt;br /&gt;
же манером&lt;br /&gt;
я собрал&lt;br /&gt;
второй&lt;br /&gt;
пакет&lt;br /&gt;
''helloworld'', только,&lt;br /&gt;
конечно,&lt;br /&gt;
с другими&lt;br /&gt;
данными&lt;br /&gt;
в файле&lt;br /&gt;
'''control'''. В частности,&lt;br /&gt;
строка&lt;br /&gt;
зависимостей&lt;br /&gt;
в контрольном&lt;br /&gt;
файле&lt;br /&gt;
пакета&lt;br /&gt;
''helloworld'' выглядит&lt;br /&gt;
так:&lt;br /&gt;
&lt;br /&gt;
 Depends: bash, world&lt;br /&gt;
&lt;br /&gt;
===Мал, но хорошо сложен===&lt;br /&gt;
&lt;br /&gt;
Хотя&lt;br /&gt;
мои пакеты&lt;br /&gt;
''world'' и ''helloworld'' могут&lt;br /&gt;
показаться&lt;br /&gt;
тривиальными,&lt;br /&gt;
все же это полноправные&lt;br /&gt;
члены&lt;br /&gt;
мира&lt;br /&gt;
пакетов&lt;br /&gt;
Debian. Ими&lt;br /&gt;
можно&lt;br /&gt;
управлять&lt;br /&gt;
и запрашивать&lt;br /&gt;
о них информацию&lt;br /&gt;
с помощью&lt;br /&gt;
стандартных&lt;br /&gt;
утилит.&lt;br /&gt;
Например,&lt;br /&gt;
просмотрим&lt;br /&gt;
контрольную&lt;br /&gt;
информацию&lt;br /&gt;
пакета&lt;br /&gt;
или его содержимое:&lt;br /&gt;
&lt;br /&gt;
 $ dpkg -L world&lt;br /&gt;
 /.&lt;br /&gt;
 /usr&lt;br /&gt;
 /usr/local&lt;br /&gt;
 /usr/local/bin&lt;br /&gt;
 /usr/local/bin/world&lt;br /&gt;
&lt;br /&gt;
Управление&lt;br /&gt;
зависимостями&lt;br /&gt;
тоже&lt;br /&gt;
работает.&lt;br /&gt;
Если&lt;br /&gt;
попробовать&lt;br /&gt;
установить&lt;br /&gt;
''helloworld'' без установки&lt;br /&gt;
''wolrld, dpkg'' не позволит&lt;br /&gt;
нам&lt;br /&gt;
этого&lt;br /&gt;
сделать:&lt;br /&gt;
&lt;br /&gt;
$ sudo dpkg -i helloworld_1.1-1_all.deb&lt;br /&gt;
...&lt;br /&gt;
 dpkg: dependency problems prevent configuration of&lt;br /&gt;
 helloworld:&lt;br /&gt;
 helloworld depends on world; however:&lt;br /&gt;
 Package world is not installed.&lt;br /&gt;
&lt;br /&gt;
Такой&lt;br /&gt;
же результат&lt;br /&gt;
я получу,&lt;br /&gt;
попробовав&lt;br /&gt;
удалить&lt;br /&gt;
пакет&lt;br /&gt;
''world'':&lt;br /&gt;
&lt;br /&gt;
 $ sudo dpkg -r world&lt;br /&gt;
 dpkg: dependency problems prevent removal of world:&lt;br /&gt;
 helloworld depends on world.&lt;br /&gt;
&lt;br /&gt;
Теперь,&lt;br /&gt;
пока&lt;br /&gt;
какой-&lt;br /&gt;
нибудь разработчик&lt;br /&gt;
Debian не пожаловался,&lt;br /&gt;
что я огрубляю&lt;br /&gt;
процесс,&lt;br /&gt;
позвольте&lt;br /&gt;
признаться,&lt;br /&gt;
что в нынешнем виде&lt;br /&gt;
мои пакеты&lt;br /&gt;
не прошли&lt;br /&gt;
бы отбор&lt;br /&gt;
на включение&lt;br /&gt;
в дистрибутив&lt;br /&gt;
Debian. Соответствие&lt;br /&gt;
пакета&lt;br /&gt;
политике&lt;br /&gt;
проверяет&lt;br /&gt;
программа&lt;br /&gt;
''Lintian''. Мой позорно&lt;br /&gt;
провалился:&lt;br /&gt;
&lt;br /&gt;
 $ lintian world_1.1-1_all.deb&lt;br /&gt;
 E: world: dir-in-usr-local usr/local/bin/&lt;br /&gt;
 E: world: file-in-usr-local usr/local/bin/world&lt;br /&gt;
 W: world: file-in-unusual-dir usr/local/bin/world&lt;br /&gt;
 W: world: non-standard-executable-perm usr/local/bin/world 0744 != 0755&lt;br /&gt;
 E: world: no-copyright-file&lt;br /&gt;
 E: world: extended-description-is-empty&lt;br /&gt;
 E: world: depends-on-essential-package-without-using-version depends: bash&lt;br /&gt;
&lt;br /&gt;
Мы видим:&lt;br /&gt;
не хватает&lt;br /&gt;
файла&lt;br /&gt;
авторских&lt;br /&gt;
прав, скрипт устанавливается&lt;br /&gt;
в каталог,&lt;br /&gt;
который&lt;br /&gt;
(хотя&lt;br /&gt;
он и подходит&lt;br /&gt;
для моих&lt;br /&gt;
целей)&lt;br /&gt;
не соответствует&lt;br /&gt;
политике&lt;br /&gt;
Debian, у скриптов&lt;br /&gt;
нет прав&lt;br /&gt;
на выполнение&lt;br /&gt;
для всех пользователей,&lt;br /&gt;
а еще я наивно&lt;br /&gt;
указал&lt;br /&gt;
зависимость&lt;br /&gt;
от ''Bash'', и совершенно&lt;br /&gt;
зря: он и так объявлен&lt;br /&gt;
обязательным&lt;br /&gt;
('''essential''').&lt;br /&gt;
&lt;br /&gt;
===Виртуальные и метапакеты===&lt;br /&gt;
&lt;br /&gt;
Debian поддерживает&lt;br /&gt;
концепции&lt;br /&gt;
виртуальных&lt;br /&gt;
пакетов&lt;br /&gt;
и метапакетов.&lt;br /&gt;
Они упрощают&lt;br /&gt;
управление&lt;br /&gt;
пакетами&lt;br /&gt;
(или усложняют&lt;br /&gt;
его – смотря&lt;br /&gt;
как посмотреть).&lt;br /&gt;
Виртуальный&lt;br /&gt;
пакет&lt;br /&gt;
– это имя, применяемое&lt;br /&gt;
для одного&lt;br /&gt;
или нескольких&lt;br /&gt;
физических&lt;br /&gt;
пакетов&lt;br /&gt;
с одинаковой&lt;br /&gt;
базовой&lt;br /&gt;
функциональностью.&lt;br /&gt;
Примеры&lt;br /&gt;
имен виртуальных&lt;br /&gt;
пакетов&lt;br /&gt;
– ''imap-client'' и ''pdf-viewer''. Чтобы&lt;br /&gt;
объявить&lt;br /&gt;
(реальный)&lt;br /&gt;
пакет&lt;br /&gt;
''kdpf ''средством&lt;br /&gt;
просмотра&lt;br /&gt;
PDF, добавьте&lt;br /&gt;
в его контрольный&lt;br /&gt;
файл строку&lt;br /&gt;
'''Provides: pdf-viewer'''&lt;br /&gt;
В контрольных&lt;br /&gt;
файлах&lt;br /&gt;
других&lt;br /&gt;
пакетов,&lt;br /&gt;
зависящих&lt;br /&gt;
от средства&lt;br /&gt;
просмотра&lt;br /&gt;
PDF (неважно&lt;br /&gt;
какого),&lt;br /&gt;
должна&lt;br /&gt;
быть строка&lt;br /&gt;
'''Depends: pdf-viewer'''&lt;br /&gt;
Другие&lt;br /&gt;
виртуальные&lt;br /&gt;
пакеты&lt;br /&gt;
– ''c-compiler, dhcp-client, ftp-server''&lt;br /&gt;
и ''mp3-decoder''.&lt;br /&gt;
В метапакетах&lt;br /&gt;
нет реального&lt;br /&gt;
содержимого,&lt;br /&gt;
они просто&lt;br /&gt;
определяют&lt;br /&gt;
список&lt;br /&gt;
зависимостей.&lt;br /&gt;
С их помощью&lt;br /&gt;
можно&lt;br /&gt;
установить&lt;br /&gt;
несколько&lt;br /&gt;
пакетов&lt;br /&gt;
одной&lt;br /&gt;
командой.&lt;br /&gt;
Например,&lt;br /&gt;
метапакет&lt;br /&gt;
''build-essential'', если&lt;br /&gt;
добавить&lt;br /&gt;
его, гарантирует,&lt;br /&gt;
что будут&lt;br /&gt;
установлены&lt;br /&gt;
такие&lt;br /&gt;
пакеты,&lt;br /&gt;
как ''gcc, g++'' и ''make''. '''LXF'''&lt;br /&gt;
&lt;br /&gt;
===Руководство по политике Debian===&lt;br /&gt;
&lt;br /&gt;
Руководство&lt;br /&gt;
по политике&lt;br /&gt;
Debian (Debian Policy Manual) – большой&lt;br /&gt;
(140‑страничный)&lt;br /&gt;
документ,&lt;br /&gt;
описывающий&lt;br /&gt;
создание&lt;br /&gt;
пакета&lt;br /&gt;
в довольно&lt;br /&gt;
формальных&lt;br /&gt;
терминах&lt;br /&gt;
и с большой&lt;br /&gt;
детализацией.&lt;br /&gt;
В нем также&lt;br /&gt;
рассмотрена&lt;br /&gt;
раскладка&lt;br /&gt;
файловой&lt;br /&gt;
системы&lt;br /&gt;
и содержатся&lt;br /&gt;
четкие&lt;br /&gt;
инструкции&lt;br /&gt;
по написанию&lt;br /&gt;
скриптов&lt;br /&gt;
управления&lt;br /&gt;
сервисами&lt;br /&gt;
из '''/etc/init.d''' и рекомендованные&lt;br /&gt;
диапазоны&lt;br /&gt;
'''UID''' для системных&lt;br /&gt;
и пользовательских&lt;br /&gt;
учетных&lt;br /&gt;
записей.&lt;br /&gt;
&lt;br /&gt;
Просмотреть&lt;br /&gt;
его можно&lt;br /&gt;
на сайте&lt;br /&gt;
http://www.debian.org/doc/debian-policy, а PDF-версию&lt;br /&gt;
загрузить&lt;br /&gt;
с сайта&lt;br /&gt;
http://www.debian.org/doc/debian-policy/policy.pdf.gz&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>