Глава 7. Основы системы управления пакетами Debian
В этой главе вкратце рассматривается внутренняя низкоуровневая организация системы управления пакетами Debian. Если вас главным образом интересует вопрос о том, как использовать соответствующие утилиты, переходите сразу к Глава 8, Инструменты управления пакетами Debian или Глава 9, Поддержание обновлений системы Debian.
7.1. Что такое пакет Debian?
Пакет обычно содержит полный комплект файлов, необходимых для реализации определённого набора команд или возможностей. Существует два типа пакетов Debian:
- Binary packages , which contain executables, configuration files, man/info pages, copyright information, and other documentation. These packages are distributed in a Debian-specific archive format (see Раздел 7.2, «Какой формат у двоичных пакетов Debian?»); they are usually characterized by having a ‘.deb’ file extension. Binary packages can be unpacked using the Debian utility dpkg (possibly via a frontend like aptitude ); details are given in its manual page.
- Source packages , which consist of a .dsc file describing the source package (including the names of the following files), a .orig.tar.gz file that contains the original unmodified source in gzip-compressed tar format and usually a .diff.gz file that contains the Debian-specific changes to the original source. The utility dpkg-source packs and unpacks Debian source archives; details are provided in its manual page. (The program apt-get can be used as a frontend for dpkg-source .)
Installation of software by the package system uses «dependencies» which are carefully designed by the package maintainers. These dependencies are documented in the control file associated with each package. For example, the package containing the GNU C compiler ( gcc ) «depends» on the package binutils which includes the linker and assembler. If a user attempts to install gcc without having first installed binutils , the package management system (dpkg) will send an error message that it also needs binutils , and stop installing gcc . (However, this facility can be overridden by the insistent user, see dpkg (8) .) See more in Раздел 7.9, «Что имеется в виду, когда говорят, что пакет Рекомендует (Recommends), Предлагает (Suggests), Заменяет (Replaces), Ломает (Breaks) или Предоставляет (Provides) другой пакет, Зависит (Depends) от него или Конфликтует (Conflicts) с ним?» below.
Инструменты управления пакетами Debian могут использоваться для:
- манипулирования и управления пакетами или их частями;
- управления локальными заменами файлов пакета;
- помощи разработчикам в сборке пакетов;
- aid users in the installation of packages which reside on a remote archive site.
7.2. Какой формат у двоичных пакетов Debian?
«Пакет» (или «файл-архив») Debian содержит исполняемые файлы, файлы настроек, библиотеки и документацию для определённого программного комплекта или набора связанных программ. Обычно имя файла-архива Debian имеет расширение .deb .
The internals of this Debian binary packages format are described in the deb (5) manual page. This internal format is subject to change (between major releases of Debian GNU/Linux), therefore please always use dpkg-deb (1) if you need to do lowlevel manipulations on .deb files.
7.3. Почему имена файлов пакетов Debian такие длинные?
Для именования файлов двоичных пакетов Debian используется следующее соглашение: _-_.deb
Note that foo is supposed to be the package name. Checking the package name associated with a particular Debian archive file (.deb file) can be done in one of these ways:
- inspect the «Packages» file in the directory where it was stored at a Debian archive site. This file contains a stanza describing each package; the first field in each stanza is the formal package name.
- воспользоваться командой dpkg —info foo_VVV-RRR_AAA.deb (где VVV, RRR и AAA — это, соответственно, версия, ревизия и архитектура пакета в запросе). В результате, помимо прочего, будет указано имя пакета, соответствующее распаковываемому файлу-архиву.
Компонент VVV определяет номер версии, установленный разработчиком программы. Его формат не стандартизован, поэтому номер версии может быть любым, например «19990513» или «1.3.8pre1».
The RRR component is the Debian revision number, and is specified by the Debian developer (or a user who chooses to rebuild the package locally). This number corresponds to the revision level of the Debian package, thus, a new revision level usually signifies changes in the Debian Makefile ( debian/rules ), the Debian control file ( debian/control ), the installation or removal scripts ( debian/p* ), or in the configuration files used with the package.
The AAA component identifies the processor for which the package was built. This is commonly amd64 , which refers to AMD64, Intel 64 or VIA Nano chips. For other possibilities review Debian’s archive directory structure at Раздел 6.7, «What are all those directories at the Debian archives?». For details, see the description of «Debian architecture» in the manual page dpkg-architecture (1) .
7.4. Зачем нужен файл control?
Содержимое файла control подробно рассматривается в разделе 5 «Руководства по политике Debian» (Debian Policy Manual) (см. Раздел 12.1, «Какая ещё документация существует по системе Debian?»).
Краткий пример файла control для пакета Debian hello приведён ниже:
Package: hello Version: 2.9-2+deb8u1 Architecture: amd64 Maintainer: Santiago Vila Installed-Size: 145 Depends: libc6 (>= 2.14) Conflicts: hello-traditional Breaks: hello-debhelper (Поле Package содержит имя пакета. Это имя, по которому инструменты управления пакетами будут его опознавать. Обычно (но не обязательно) оно совпадает с первым компонентом имени файла архива Debian.
Поле Version содержит номер версии программы, установленный её разработчиками, и (в последнем компоненте) номер ревизии пакета этой программы в Debian, см. Раздел 7.3, «Почему имена файлов пакетов Debian такие длинные?».
Поле Architecture определяет тип процессора, для которого были скомпилированы двоичные файлы в данном пакете.
Поле Depends содержит список пакетов, которые должны быть установлены для успешной установки данного пакета.
Installed-Size отражает размер дискового пространства, который будет занят пакетом после установки. Этот параметр может использоваться программами установки для проверки достаточности дискового пространства перед установкой пакета.
The Section line gives the "section" where this Debian package is stored at the Debian archive sites.
В поле Maintainer указан адрес электронной почты человека, ответственного за поддержку данного пакета.
В поле Description приводится краткое описание функциональности пакета.
Более подробную информацию о всех возможных полях управляющего файла пакета см. в разделе 5 («Управляющие файлы и их поля») «Руководства по политике Debian» (Debian Policy Manual), см. Раздел 12.1, «Какая ещё документация существует по системе Debian?».
7.5. Зачем нужен файл conffile?
Conffile содержит список файлов настроек (обычно помещаемых в /etc ), которые при обновлении пакета не будут перезаписываться системой управления пакетами. Это гарантирует, что содержимое файлов настроек будет сохранено, и позволяет обновлять пакеты, не прерывая работу системы.
Чтобы точно определить, какие файлы сохраняются при обновлении, запустите:
dpkg --status пакети взгляните на строку «Conffiles:».
7.6. Зачем нужны сценарии preinst, postinst, prerm и postrm?
Это исполняемые сценарии, автоматически запускаемые до или после установки или удаления пакета. Вместе с файлом control эти файлы являются частью «управляющего» раздела архивного файла Debian.
This script is executed before the package it belongs to is unpacked from its Debian archive (".deb") file. Many 'preinst' scripts stop services for packages which are being upgraded until their installation or upgrade is completed (following the successful execution of the 'postinst' script).
This script typically completes any required configuration of the package foo once foo has been unpacked from its Debian archive (".deb") file. Often, 'postinst' scripts ask users for input, and/or warn them that if they accept default values, they should remember to go back and re-configure that package as needed. Many 'postinst' scripts then execute any commands necessary to start or restart a service once a new package has been installed or upgraded.
Этот сценарий обычно служит для остановки всех связанных с пакетом служб. Он выполняется перед удалением файлов данного пакета.
Этот сценарий обычно служит для изменения ссылок или других файлов, связанных с foo , и/или удаления файлов, созданных пакетом. (См. также Раздел 7.8, «Что такое виртуальный пакет?».)
Currently all of the control files can be found in the directory /var/lib/dpkg/info . The files relevant to package foo begin with the name "foo" and have file extensions of "preinst", "postinst", etc., as appropriate. The file foo.list in that directory lists all of the files that were installed with the package foo . (Note that the location of these files is a dpkg internal; you should not rely on it.)
7.7. Что такое Пакет первой необходимости ( Essential ), Необходимый ( Required ), Важный ( Important ), Стандартный ( Standard ), Необязательный ( Optional ) или Дополнительный ( Extra ) пакет?
Для поддержки системы управления пакетами каждому пакету в Debian сопровождающими дистрибутива назначается приоритет . Возможные приоритеты:
- Необходимые (Required) — пакеты, необходимые для правильного функционирования системы. Сюда входят все инструменты, необходимые для устранения неполадок в системе. Вам не следует удалять эти пакеты, иначе ваша система может перестать работать, и не исключено, что вы даже не сможете использовать dpkg для того, чтобы вернуть всё назад. Функциональность системы, в которой установлены только Необходимые пакеты, не слишком высока, но достаточна для того, чтобы позволить системному администратору загрузить её и установить больше программного обеспечения.
- Важные (Important) — пакеты, которые должны быть в любой Unix-системе. Other packages which the system will not run well or be usable without will be here. This does NOT include Emacs or X or TeX or any other large application. These packages only constitute the bare infrastructure.
- Standard packages are standard on any Linux system, including a reasonably small but not too limited character-mode system. Tools are included to be able to send e-mail (with mutt) and download files from archive servers. This is what will be installed by default if users do not select anything else. It does not include many large applications, but it does include the Python interpreter and some server software like OpenSSH (for remote administration) and Exim (for mail delivery, although it can be configured for local delivery only). It also includes some common generic documentation that most users will find helpful.
- Optional packages include all those that you might reasonably want to install if you do not know what they are, or that do not have specialized requirements. Сюда входят X, полный дистрибутив TeX и множество других приложений.
- Дополнительные (Extra) — пакеты, либо конфликтующие с другими пакетами, имеющими более высокий приоритет, полезные, скорее всего, только в том случае, когда вы уже знаете, что это такое, либо имеющие специфические требования, из-за которых им нельзя дать приоритет «Необязательный».
Если вы выполните установку Debian по умолчанию, то будут установлены все пакеты с приоритетом Стандартный или выше. Если вы выберете какие-то определённые задачи, то также будут установлены и пакеты с более низким приоритетом.
Кроме того, некоторые пакеты классифицированы как Пакеты первой необходимости (Essential), так как они абсолютно необходимы для правильной работы системы. Инструменты управления пакетами не допустят их удаления.
7.8. Что такое виртуальный пакет?
A virtual package is a generic name that applies to any one of a group of packages, all of which provide similar basic functionality. For example, both the konqueror and firefox-esr programs are web browsers, and should therefore satisfy any dependency of a program that requires a web browser on a system, in order to work or to be useful. They are therefore both said to provide the "virtual package" called www-browser .
Similarly, exim4 and sendmail both provide the functionality of a mail transport agent. They are therefore said to provide the virtual package "mail-transport-agent". If either one is installed, then any program depending on the installation of a mail-transport-agent will be satisfied by the presence of this virtual package.
Кроме того, в Debian есть механизм, позволяющий системному администратору в том случае, когда в системе установлено несколько пакетов, предоставляющих определённый виртуальный пакет, выбрать предпочтительный. Для этого служит команда update-alternatives , см. Раздел 11.11, «Некоторым пользователям нравится mawk, другим gawk; некоторым vim, другим elvis; некоторым trn, другим tin. Как осуществляется поддержка предпочтений в Debian?».
7.9. Что имеется в виду, когда говорят, что пакет Рекомендует (Recommends), Предлагает (Suggests), Заменяет (Replaces), Ломает (Breaks) или Предоставляет (Provides) другой пакет, Зависит (Depends) от него или Конфликтует (Conflicts) с ним?
В системе пакетов Debian есть несколько типов «зависимостей» пакетов друг от друга, задуманных для определения (в одной переменной) степени независимости одной программы (например, А) от наличия в данной системе другой (Б).
- Пакет A зависит от пакета Б, если Б абсолютно необходим для работы A. В некоторых случаях A не просто зависит от Б, но дополнительно требует определённую версию Б. В этом случае обычно накладывается требование, чтобы версия Б была не ниже заданной.
- Пакет A рекомендует пакет Б, если сопровождающий пакета считает, что большинство пользователей не захотят пользоваться A, не имея функциональности, предоставляемой пакетом Б.
- Пакет A предлагает пакет Б, если Б содержит файлы, имеющие отношение к функциональности пакета A (и обычно её расширяющие).
- Пакет A конфликтует с пакетом Б, когда A не может работать, если установлен пакет Б. Наиболее часто конфликты возникают, когда A содержит усовершенствованные версии файлов, содержащихся в Б. «Конфликтует» часто задаётся вместе с «заменяет».
- Пакет A заменяет пакет Б, когда файлы, установленные из пакета Б, удаляются и (в некоторых случаях) замещаются файлами из A.
- Пакет А ломает пакет Б, когда нельзя одновременно настроить оба пакета в системе. Система управления пакетами предотвратит установку одного, если в системе уже установлен и настроен другой.
- Пакет A предоставляет пакет Б, когда все файлы и функциональность Б имеются в A. Этот механизм позволяет пользователям с ограниченным дисковым пространством получить только ту часть пакета А, которая действительно им нужна.
More detailed information on the use of each of these terms can be found in the Debian Policy manual, section 7.2, "Binary Dependencies", see Раздел 12.1, «Какая ещё документация существует по системе Debian?».
7.10. Что значит Пред-зависит (Pre-Depends)?
"Pre-Depends" is a special dependency. In the case of most packages, dpkg will unpack the archive file of a package (i.e., its .deb file) independently of whether or not the files on which it depends exist on the system. Simplistically, unpacking means that dpkg will extract the files from the archive file that were meant to be installed on your file system, and put them in place. If those packages depend on the existence of some other packages on your system, dpkg will refuse to complete the installation (by executing its "configure" action) until the other packages are installed.
Однако, некоторые пакеты dpkg даже не будет распаковывать, пока не будут разрешены некоторые зависимости. Про такие пакеты говорят, что они имеют «предварительную зависимость» от наличия некоторых других пакетов. Этот механизм предоставляется в Debian для поддержки безопасного перехода систем с формата a.out на ELF , когда критична очерёдность распаковки пакетов. Существуют и другие варианты больших обновлений, где этот приём также полезен, например для пакетов с приоритетом «необходимый», когда они зависят от LibC.
Опять же, более подробную информацию об этом можно найти в руководстве по политике.
7.11. Что означают слова неизвестно ( unknown ), установить ( install ), удалить ( remove ), вычистить ( purge ), зафиксировать ( hold ) в строке состояния пакета?
Эти флаги определяют, что пользователь «хочет» сделать с пакетом (что определяется вызовами dpkg / apt / aptitude ).
- неизвестно (unknown) — пользователь никоим образом не отметил, нужен ли ему этот пакет.
- установить (install) — пользователь хочет установить или обновить пакет;
- remove - the user wants the package removed, but does not want to remove any existing configuration file.
- вычистить (purge) — пользователь хочет удалить пакет полностью, включая его файлы настроек;
- зафиксировать (hold) — пользователь хочет, чтобы над пакетом не совершалось никаких действий, т. е. он хочет сохранить текущую версию пакета, в каком бы состоянии она ни была.
7.12. Как зафиксировать (hold) пакет?
Есть три способа перевода пакета в зафиксированное состояние: с помощью dpkg, apt или aptitude.
При использовании dpkg вам нужно экспортировать список состояний отметки пакетов:
dpkg --get-selections \* > selections.txt
Затем отредактировать полученный файл selections.txt , заменив строку с именем пакета, который нужно зафиксировать, например libc6 , с:
libc6 install
libc6 hold
Сохранить файл и загрузить его в базу данных dpkg:
dpkg --set-selections < selections.txt
С помощью apt пакет можно зафиксировать командой
apt-mark hold имя_пакета
а снять фиксацию с помощью
apt-mark unhold имя_пакета
При использовании aptitude пакет можно зафиксировать командой
aptitude hold имя_пакета
а снять фиксацию с помощью
aptitude unhold имя_пакета
7.13. Как установить пакет исходного кода?
Пакеты исходного кода Debian на самом деле нельзя «установить», они просто распаковываются в любой указанный вами каталог для сборки двоичного пакета.
Source packages are distributed on most of the same mirrors where you can obtain the binary packages. If you set up your APT's sources.list (5) to include the appropriate "deb-src" lines, you'll be able to easily download any source package by running
apt-get source имя_пакета
To help you in actually building the source package, Debian source packages provide the so-called build-dependencies mechanism. This means that the source package maintainer keeps a list of other packages that are required to build their package. To see how this is useful, run
apt-get build-dep имя_пакета
перед сборкой пакета.
7.14. Как собрать двоичный пакет из пакета исходного кода?
Лучше всего это делать с помощью различных утилит-обёрток. Мы покажем как использовать инструментарий devscripts . Установите этот пакет, если это ещё не сделано.
Сначала добудьте пакет с исходным кодом:
apt-get source имя_пакета
и перейдите в дерево исходников:
cd имя_пакета-*
Затем установите необходимые сборочные зависимости (при их наличии):
sudo apt-get build-dep имя_пакета
После этого создайте отдельную версию своей сборки (для того, чтобы позже не удивляться, когда в Debian тоже выйдет новая версия):
dch -l local 'Blah blah blah'
И, наконец, соберите пакет:
debuild -us -uc
Если всё прошло успешно, то вы сможете установить свой пакет, запустив
sudo dpkg -i ../*.deb
Если вы предпочитаете делать всё вручную и не хотите использовать devscripts , то делайте так:
Для компиляции исходного кода вам понадобятся файлы имя_пакета_*.dsc, имя_пакета_*.tar.gz и имя_пакета_*.diff.gz (учтите, что для некоторых родных пакетов Debian файла .diff.gz нет).
Если у вас есть эти файлы (см. Раздел 7.13, «Как установить пакет исходного кода?») и установлен пакет dpkg-dev , то следующая команда:
dpkg-source -x имя_пакета_версия-ревизия.dsc
извлечёт пакет в каталог с именем имя_пакета-версия .
If you just want to compile the package, you may cd into the foo-version directory and issue the command
dpkg-buildpackage -rfakeroot -b
для сборки пакета (обратите внимание, что для этого также понадобится пакет fakeroot ), а затем
dpkg -i ../имя_пакета_версия-ревизия_архитектура.deb
для установки только что собранного пакета.
7.15. Как самому создать пакет Debian?
For a more detailed description on this, read the New Maintainers' Guide, available in the maint-guide package or at https://www.debian.org/doc/devel-manuals#maint-guide, or the Guide for Debian Maintainers, available in the debmake-doc package or at https://www.debian.org/doc/devel-manuals#debmake-doc.
|
![]() |
|
| Глава 6. The Debian archives | ![]() |
Глава 8. Инструменты управления пакетами Debian |
Настройка Linux роутера — NAT + DHCP + Squid
Частым применением Linux серверов является организация общего доступа в интернет. Это обусловлено низкой стоимостью такого решения и невысокими требованиями к железу. Во многих случаях это бывает первый Linux сервер в организации, что способно вызвать у администраторов определенные сложности. В данной статье мы пошагово рассмотрим настройку роутера (NAT + DHCP + Squid) на базе Ubuntu Server
Установка Ubuntu Server и первоначальная настройка
Ubuntu Server отличается от своей настольной версии отсутствием графической оболочки и пользовательских приложений, а также возможностью предустановки заранее выбранных ролей сервера. Несмотря на это, все сказанное будет справедливо для любой версии Ubuntu и, с некоторыми поправками, для любого Linux дистрибутива. Установка Ubuntu Server происходит в текстовом режиме на русском языке и, как правило, не вызывает сложностей. Отдельно стоит только остановится на списке ролей: из предложенного нас, пожалуй, может заинтересовать только OpenSSH, для удаленного доступа, однако воспользовавшись пунктом Manual package selection опытный пользователь может сразу установить необходимые ему пакеты.
Если же это ваш первый сервер, то лучше всего продолжить не выбирая никакого варианта, все необходимые пакеты мы доустановим позже. Это позволит иметь более четкое представлении о назначении того или иного пакета и позволит успешно справляться с возможными неполадками. По окончании установки система перезагрузится и встретит нас черным экраном командной строки. Непривычного к консоли Windows-администратора это может неприятно удивить, однако ситуация на сегодняшний день такова, что все серверные роли Linux настраиваются исключительно через консоль и файлы конфигурации.
Настройка сети
В первую очередь настроим сетевые соединения. Вводим в консоли:
sudo nano /etc/network/interfaces
Эта команда откроет в консольном редакторе nano конфигурационный файл с сетевыми интерфейсами, аналогичный рисунку ниже.
Пока там прописан единственный интерфейс etc0, настроенный на работу по DHCP. К eth0 у нас подключен ADSL модем (или любая сеть провайдера), а eth1 смотрит во внутреннюю сеть. IP адрес на внешнем интерфейсе 192.168.1.2, шлюз (ADSL модем) 192.168.1.1, внутренняя сеть лежит в диапазоне 10.0.0.1 — 254. Тогда настройки будут выглядеть следующим образом:
auto eth0 iface eth0 inet static address 192.168.1.2 netmask 255.255.255.0 gateway 192.168.1.1auto eth1 iface eth1 inet static address 10.0.0.1 netmask 255.255.255.0
Сохраняем изменения Ctrl+O и выходим Ctrl+X. Теперь нужно настроить DNS, для этого выполняем:
sudo nano /etc/resolv.conf
В этом файле необходимо указать адреса DNS серверов, лучше всего указать DNS провайдера или, как в нашем случае, OpenDNS.
#OpenDNS Servers nameserver 208.67.222.222 nameserver 208.67.220.220
Сохраняем. Теперь нужно перезапустить сетевые службы (либо перезагрузиться):
sudo /etc/init.d/networking restart
Собственно сеть настроена, можно переходить к следующему этапу, однако мы рекомендуем установить еще несколько пакетов для удобства администрирования.
Обновление пакетов Ubuntu
Сначала обновим список доступных пакетов:
sudo apt-get update
Также рекомендуем обновить версии пакетов до актуальных:
sudo apt-get upgrade
Установка дополнительных пакетов
Теперь установим Midnight Commander (mc), файловый менеджер по образу и подобию Norton Commander или Far:
sudo apt-get install mc
Для запуска Midnight Commander достаточно набрать в консоли его краткое имя: mc. Сразу рекомендуем включить встроенный редактор, более удобный чем nano:F9 — Настройки — Конфигурация — Встроенный редактор.
Настройка SSH
Для удаленного управления сервером (не бегать же к нему каждый раз) установим OpenSSH, что позволит подключаться к нему из любого места, даже из дома, по защищенному протоколу:
sudo apt-get install ssh
Для подключения с Windows станций можно использовать программу PuTTY (скачать), для корректного отображения символов перед подключением необходимо на закладке Window — Translation выбрать кодировку UTF8.
Ограничение доступа к серверу
Для ограничения доступа к серверу можно дописать в файл /etc/ssh/sshd_configпараметр AllowUsers с указанием пользователя имеющего доступ по SSH, например для пользователя admin:
AllowUsers admin
Также можно разрешить доступ определенной группе пользователей используя параметр AllowGroups, либо запретить доступ определенным пользователям / группам использовав DenyUsers и DenyGroups.
Настрайка NAT
Для организации общего доступа к интернет необходимо настроить трансляцию сетевых адресов (NAT), что позволит сетевым службам внутренней сети получать доступ к внешней сети. Для этого достаточно выполнить всего одну команду, но есть одна тонкость: все будет работать только для перезагрузки. На настоящий момент в Linux нет механизма, который бы сохранял настойки iptables при перезагрузке сервера или сети. Поэтому мы пойдем другим путем и вынесем эти настройки в отдельный скрипт, запускаемый при загрузке системы. Сначала создадим файл скрипта:
sudo touch /etc/nat
Потом откроем его в редакторе Midnight Commander (F4) и внесем следующий текст:
#!/bin/sh # Включаем форвардинг пакетов echo 1 > /proc/sys/net/ipv4/ip_forward # Разрешаем трафик на loopback-интерфейсе iptables -A INPUT -i lo -j ACCEPT # Разрешаем доступ из внутренней сети наружу iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT # Включаем NAT iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE # Разрешаем ответы из внешней сети iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # Запрещаем доступ снаружи во внутреннюю сеть iptables -A FORWARD -i eth0 -o eth1 -j REJECT
Сохраняем (F2), для автоматического запуска скрипта снова открываем/etc/network/interfaces и в самый конец файла дописываем:
post-up /etc/nat
Также не забываем дать нашему скрипту права на исполнение:
sudo chmod +x /etc/nat
sudo /etc/init.d/networking restart
Если нигде не допущено ошибок все должно работать. Для проверки укажем на машинах внутренней сети в качестве шлюза и DNS адрес нашего роутера: 10.0.0.1 и пропингуем любой внешний адрес, например один из OpenDNS серверов: 208.67.222.222. Но интернет пока работать не будет. Почему? Да потому, что мы указали в качестве DNS сервера наш роутер, который пока таковым не является. Можно конечно явно прописать DNS на клиентской машине,однако, это не наш метод, если вдруг DNS сервера изменятся, нам что, бегать перепрописывать?
Одно из решений: поднять на нашем роутере полноценный DNS сервер, но в большинстве случаев это избыточно, поэтому мы ограничимся простым кэширующим DNS (а также и DHCP) сервером Dnsmasq.
sudo apt-get install dnsmasq
После установки открываем /etc/dnsmasq.conf, находим, раскомментируем и изменяем следующим образом строку, чтобы разрешить серверу принимать DNS запросы из внутренней сети.:
listen-address=127.0.0.1, 10.0.0.1
Перезапускаем DNS сервер:
sudo /etc/init.d/dnsmasq restart
После чего на клиентских машинах должен заработать интернет.
Настройка DHCP
Теперь, когда наш сервер работает, нужно настроить клиентские машины. Можно, конечно, прописать все параметры вручную, но как быть если клиентских машин много и расположены они по всему зданию? Здесь нам на выручку приходит протокол DHCP, который позволяет клиентским машинам получать сетевые настройки автоматически. В качестве DHCP сервера выступит уже установленныйDnsmasq. Настроить его не просто, а очень просто, для чего снова открываем/etc/dnsmasq.conf.
Все что нам надо, это задать диапазон выдаваемых адресов (в нашем случае 10.0.0.100-150), сетевую маску и время, на которое выдается IP адрес:
dhcp-range=10.0.0.100,10.0.0.150,255.255.255.0,12h
Адреса DNS сервера и шлюза сервер берет автоматически из системных настроек. Еще раз перезапускаем Dnsmasq:
sudo /etc/init.d/dnsmasq restart
Теперь можно выставить на клиенте автоматическое получение IP адреса и убедиться, что все работает нормально.
Просмотреть выданные адреса можно командой:
cat /var/log/syslog | grep DHCPOFFER
В выдаче будут перечислены выданные IP адреса и MAC адреса которым они выданы.
Кэширующий прокси-сервер Squid
В любой большой сети определенная часть трафика повторяется от пользователя к пользователю и порой его доля доходит до 50%. Логично бы было кэшировать наиболее повторяющиеся запросы и тем самым снизить нагрузку на канал, сэкономить входящий трафик и ускорить выдачу страниц конечному пользователю. Для этих задач мы используем Squid — кэширующий прокси с широчайшими возможностями.
sudo apt-get install squid
Останавливаем прокси-сервер и приступаем к настройке:
sudo /etc/init.d/squid stop
Открываем /etc/squid/squid.conf, находим и корректируем следующие строки, не забыв их раскомменитровать:
http_port 3128 transparent
cache_dir ufs /var/spool/squid 4096 32 256
Указываем внутренние сети, лишние комменитруем:
acl localnet src 10.0.0.0/24 # RFC1918 possible internal network #acl localnet src 172.16.0.0/12 # RFC1918 possible internal network #acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
Разрешаем доступ из внутренних сетей (найти и раскомменитровать):
http_access allow localnet
Устанавливаем лимит использования памяти:
memory_pools on memory_pools_limit 50 MB
Задаем язык вывода ошибок для пользователя
error_directory /usr/share/squid/errors/Russian-koi8-r
Важное замечание! В Ubuntu 9.10 эта строка может выглядеть так, рекомендуем проверить правильность пути:
Сохраняем файл конфигурации. Теперь строим кэш и запускаем:
sudo /usr/sbin/squid -z sudo /etc/init.d/squid start
Для проверки указываем в браузере на клиентской машине использование прокси-сервера с адресом 10.0.0.1 и портом 3128, убеждаемся что все работает. Остается настроить прозрачную работу прокси-сервера, чтобы http трафик заворачивался на Squid автоматически, без прописывания прокси на клиенте. Для этого открываем /etc/nat и дописываем в конец строку:
# Заворачиваем http на прокси iptables -t nat -A PREROUTING -i eth1 ! -d 10.0.0.0/24 -p tcp -m multiport --dport 80,8080 -j DNAT --to 10.0.0.1:3128
sudo /etc/init.d/networking restart
Все. В нашем распоряжении рабочий сервер, позволяющий организовать общий доступ к интернет, кешируюший http трафик и DNS запросы, а также умеющий раздавать клиентским машинам необходимые для работы в сети настройки.
Поднимаем собственный репозиторий пакетов для Ubuntu (Debian)
В жизни любого развивающегося проекта рано или поздно (и лучше рано) наступает момент, когда эксплуатация многозначительно смотрит на разработку и предлагает оформить отношения. Дальнейшее развитие событий, как водится, зависит от обеих сторон. О плохом сегодня не будем, рассмотрим сразу случай, когда разработка готова использовать нехитрый инструментарий сборки пакетов, подготовленный для нее эксплуатацией (шаблоны debian/rules и debian/control, команды fakeroot, debuild, и так далее). Осталась самая малость: поднять для собранных пакетов собственный репозиторий.
Поскольку изучения интернетов внезапно показали, что тема, хоть и освещалась, и даже на Хабре, вряд ли может считаться внятно раскрытой, попробуем восполнить этот пробел.
Для начала нам потребуется ключ, которым будет подписан репозиторий. В данном примере мы создаем RSA-ключ длиной 4096 бита, который не имеет срока давности:
$ sudo apt install gpg $ gpg --gen-key Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 4 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years Key is valid for? (0) 0 Key does not expire at all Is this correct? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Zaphod Beeblebrox (Galactic President) " Real name: SnakeOil Admin Email address: admin@snakeoil.org Comment: You selected this USER-ID: "SnakeOil Admin " Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
Поскольку предполагается подписывать репозиторий при всяком изменении, пароль от ключа лучше оставить пустым, иначе скриптом репозиторий не обновишь, но если хочется полного контроля, можно и задать. Далее ключ нужно экспортировать в файл и в дальнейшем поместить в корень репозитория для дальнейшего импорта на клиентах.
$ export PUBKEY_ID=`gpg --list-keys | awk '( $1 == "pub" ) < print $2 ; exit >' | cut -f 2 -d /` $ gpg --output keyFile --armor --export $PUBKEY_ID
Пора подготовить дерево репозитория. У нас есть только один дистрибутив Ubuntu, только Intel x86_64 и нет пакетов с исходным кодом, поэтому о создании других элементов дерева мы не беспокоимся. Если пакеты собираются под разные дистрибутивы и имеют разные зависимости, дерево получится более развесистым, да и помянутые ниже правила сборки усложнятся.
$ sudo mkdir -p /var/www/repo $ sudo mv keyFile !$ $ cd !$ $ sudo mkdir -p conf contrib/binary-amd64 dists/xenial
Создадим файл конфигурации репозитория:
$ sudo cat > /var/www/repo/conf/distributions > /var/www/repo/conf/distributions
Пора настроить автоматическое обновление репозитория при появлении в нем новых пакетов. Файл InRelease со встроенной подписью запрашивается новыми пакетными менеджерами, а связка из двух файлов Release и Release.gpg нужна старым. Зависимости нужно продублировать для всех дистрибутивов, которые вы планируете поддерживать.
$ sudo cat > /var/www/repo/Makefile dists/xenial/Release apt-ftparchive release . >> dists/xenial/Release contrib/binary-amd64/Packages.gz: contrib/binary-amd64/Packages gzip --keep --force -9 ../../contrib/binary-amd64/Packages contrib/binary-amd64/Packages: contrib/binary-amd64/*.deb dpkg-scanpackages contrib/binary-amd64 > contrib/binary-amd64/Packages.new mv contrib/binary-amd64/Packages.new contrib/binary-amd64/Packages EOF
Репозиторий готов, осталось настроить попадание всех вновь создаваемых пакетов в /var/www/repo/dists/xenial/contrib/binary-amd64 (за рамками данной статьи). Однако много ли проку от репозитория, если он сугубо локальный? Надо обеспечить его доступность по HTTP:
$ sudo apt install nginx $ sudo cat > /etc/nginx/sites-available/repo.conf root /var/www/repo; > EOF $ sudo ln -s /etc/nginx/sites-available/repo.conf /etc/nginx/sites-enabled/ $ sudo service nginx restart
И, наконец, прописываем свой репозиторий на клиентах:
$ wget -O - http://repo/keyFile | sudo apt-key add - $ sudo echo 'deb [arch=amd64] http://repo/ xenial contrib' > /etc/apt/sources.list.d/mylovelyrepo.list $ sudo apt update
Сеанс черной магии с разоблачением окончен, всем спасибо за внимание.
Шпаргалка начинающего Debian/Ubuntu администратора по управлению пакетами
Долгое время меня глодало незнание того, как сделать некоторые элементарные вещи в дебиановских менеджерах пакетов, но, как часто бывает, спросить рядом было не у кого, а до написания куда-либо руки не доходили. И вот наконец вопросы вызрели и я написал свой вопрос в дебиановскую рассылку. Естественно оказалось что пропустил что-то очевидное, но и узнал много неочевидных полезностей, посему решил набросать шпаргалку, авось кому пригодится.
Краткая справка Debian администратора
Основное и общеизвестное
Получение информации о новых/обновлённых пакетах
sudo aptitude update
Обновление
sudo aptitude safe-upgrade
Поиск пакета по именам пакетов
aptitude search key_word
Поиск пакета по точному названию
aptitude search "^name$"
Поиск по описанию
aptitude search "?description("key_word")"
Информация о пакете
aptitude show package_name
sudo aptitude install package_name
sudo aptitude remove package_name
Полное удаление (вместе с конфигами)
sudo aptitude purge package_name
Очистить кэш загруженных пакетов (освободить место)
aptitude autoclean # удалятся только пакеты неактуальных версий aptitude clean # очистится весь кэш
Установка отдельно скачанного/созданного пакета (для создания пакета из сторонних исходников нужно использовать утилиту checkinstall с флагом -D)
sudo dpkg -i /path/to/package.deb
Для получения доп информации
man aptitude sudo aptitude install aptitude-doc-en
и смотрим документацию (/usr/share/doc/aptitude/html/en/index.html), кому быструю справку по поисковым шаблонам, тому сюда — /usr/share/doc/aptitude/html/en/ch02s04.html. Если лень ставить доку, то в сети она есть.
Вводная на Debian Wiki: wiki.debian.org/Aptitude
А теперь то что не очевидно или требует полного прочтения документации
1. Как после update посмотреть какие пакеты будут обновлены?
aptitude search ?upgradable
также можно юзать (если поставить)
sudo daptup
но после его установки точно также будет себя вести и обычный update
2. Как узнать что изменилось в пакетах которые будут обновлены?
Можно пробовать
sudo aptitude changelog package_name
для каждого пакета.
Но лучше поставить apt-listchanges, тогда перед любой установкой обновлений будет показан список изменений, по умолчанию настройки не очень удобные, поэтому лучше перенастроить под себя, например, выбрать формат вывода (пока использую текст, при больших обновлениях наверно pager лучше), не слать писем, спрашивать подтверждения, выводить всю информацию. Для этого нужно запустить
sudo dpkg-reconfigure apt-listchanges
3. Что делать если обновление что-то поломало и нужно откатиться?
Отката нет, можно попробовать найти предыдущую версию пакета
sudo aptitude version package_name
и установить её
sudo aptitude install package_name=version
4. Как найти все пакеты установленные вручную?
есть вариант команды (aptitude search '~i!~M'), но к сожалению он не даёт желаемого результата, так что вопрос остаётся открытым, есть куча способов основанных на анализе логов
/var/log/aptitude (+ ротированные куски) /var/log/installer/initial-status.gz /var/log/dpkg.log (+ ротированные куски)
но простого и готового решения нет, да информация теоретически может быть потеряна при ротациях, нужно конфигурить
5. Как посмотреть список файлов в пакете?
если пакет установлен
dpkg -L package_name
для любых пакетов поставить apt-file и
apt-file list package_name
6. Как посмотреть какому пакету принадлежит файл?
dpkg -S file_name
7. Как удалить все пакеты, где есть key в названии пакета?
sudo aptitude purge ~ikey
8. Как удалить оставшиеся конфиги от удалённых пакетов?
sudo aptitude purge ~c
9. Как найти пакет пакет, в котором содержится файл lib.so:
apt-file search lib.so
10. Как сконвертировать rpm пакет в deb?
alien --to-deb /path/to/file.rpm
11. Как найти список установленных ядер?
dpkg --list linux-* | grep ii
12. Как установить пакет из testing или experimental?
На эту тему нужно писать отдельно (например так), но если кратко, то команды для этого есть
sudo aptitude -t testing package_name
sudo aptitude package_name/testing
13. Как удалить метапакет, но оставить одну из зависимостей?
придётся почитать документацию про ключ unmarkauto или глянуть сюда.
14. Как узнать что попало в файловую систему мимо системы управления пакетами?
Есть утилита cruft, хотя вопрос интерпретации результатов (файла report) пока открыт
sudo cruft -d / -r report --ignore /home --ignore /var --ignore /tmp
15. Какие есть дополнительные репозитории?
Debian — wiki.debian.org/UnofficialRepositories
Ubuntu — множество всяких PPA
16. Что есть ещё?
apt-cdrom
apt-spy
auto-apt. заметка на хабре
apt-key
apt-add-repository
Некоторые вещи умеет только apt-get
Есть альтернативные утилиты для управления пакетами, например wajig, который пытается вобрать в себя функционал всех остальных утилит.
17. Как найти пакеты зависящие от данного
apt-cache rdepends package_name
также может пригодится
aptitude why package_name
Благодарю всех кто помог своими советами в рассылке, жж (JackYF) и хабре ( run4way, sledopit, nazarpc, AgaFonOff, amarao, traaance, adrianopol, Karamax). Замечания и дополнения приветствуются.

