пятница, 17 октября 2008 г.

Скачивание образов дисков Debian с использованием jigdo-lite

Кратко о сути jigdo. jigdo состоит из двух взаимно дополняющих друг друга утилит - jigdo-file и jigdo-lite.

Первая утилита, jigdo-file сканирует образ диска и находит там файлы. Для каждого файла утилита рассчитывает хэш md5 - контрольную сумму. В результате сканирования образа утилита создаёт два файла - шаблон диска (*.template), содержащий всю информацию из образа за исключением файлов, и сжатый список файлов с контрольными суммами (*.jigdo).

Вторая утилита, jigdo-lite на основании файлов *.jigdo и *.template может воссоздать образ диска. Недостающие файлы она может найти в произвольном указанном ей каталоге на локальном диске или скачать с указанного ей Интернет-зеркала Debian.

Таким образом jigdo - это умный вариант rsync или torrent, предназначенный для скачивания iso-образов, который умеет собирать часть образа диска из имеющихся уже скачанных файлов.

Установим пакет jigdo:
# aptitude install jigdo-file
Создаём текстовый файл jigdo-list.txt, содержащий в каждой строке по одной ссылке на файлы *.jigdo и *.template для скачивания, ссылки берём на странице http://cdimage.debian.org/debian-cd/4.0_r4a/i386/jigdo-dvd/:
http://cdimage.debian.org/debian-cd/4.0_r4a/i386/jigdo-dvd/debian-40r4a-i386-DVD-1.jigdo
http://cdimage.debian.org/debian-cd/4.0_r4a/i386/jigdo-dvd/debian-40r4a-i386-DVD-1.template
http://cdimage.debian.org/debian-cd/4.0_r4a/i386/jigdo-dvd/debian-40r4a-i386-DVD-2.jigdo
http://cdimage.debian.org/debian-cd/4.0_r4a/i386/jigdo-dvd/debian-40r4a-i386-DVD-2.template
http://cdimage.debian.org/debian-cd/4.0_r4a/i386/jigdo-dvd/debian-40r4a-i386-DVD-3.jigdo
http://cdimage.debian.org/debian-cd/4.0_r4a/i386/jigdo-dvd/debian-40r4a-i386-DVD-3.template
http://cdimage.debian.org/debian-cd/4.0_r4a/i386/jigdo-dvd/debian-update-4.0r4a-i386-DVD-1.jigdo
http://cdimage.debian.org/debian-cd/4.0_r4a/i386/jigdo-dvd/debian-update-4.0r4a-i386-DVD-1.template
Запускаем скачивание файлов из списка:
$ wget -i jigdo-list.txt
В файле /etc/fstab прописываем монтирование имеющихся образов:
/home/iso/debian-40r4-i386-DVD-1.iso /mnt/debian1 udf,iso9660 user,loop=/dev/loop0 0 0
/home/iso/debian-40r4-i386-DVD-2.iso /mnt/debian2 udf,iso9660 user,loop=/dev/loop1 0 0
/home/iso/debian-40r3-i386-DVD-3.iso /mnt/debian3 udf,iso9660 user,loop=/dev/loop2 0 0
/home/iso/debian-update-40r3-i386-DVD-1.iso /mnt/debian4 udf,iso9660 user,loop=/dev/loop3 0 0
Смонтируем все ISO-образы:
# mount -a
Запустим jidgo-lite для первого образа, в диалоге укажем путь до первого смонтрованного диска:
$ jigdo-lite jigdo/debian-40r4a-i386-DVD-1.jigdo
Программа выдаст запрос, где можно поискать уже скачанные файлы, укажем ей смонтированный диск:
Files to scan: /mnt/debian1/
После сканирования файлов в каталоге, подсчёта и сопоставления контрольных сумм, программа определит количество найденных файлов:
Found 4627 of the 4627 files required by the template
После чего создаст образ диска и выдаст соответствующее сообщение:
Successfully created `debian-40r4a-i386-DVD-1.iso'
Затем программа проверит контрольную сумму полученного образа, чтобы убедиться что полученный диск абсолютно идентичен находящемуся на официальном сайте debian:
OK: Checksums match, image is good!
Отлично, первый диск готов!

Переходим ко второму:
$ jigdo-lite jigdo/debian-40r4a-i386-DVD-2.jigdo
И этот диск тоже не пришлось качать, я в восторге!
Следующие два образа у меня более старые, поэтому кое-что всё-таки пришлось качать.
$ jigdo-lite jigdo/debian-40r4a-i386-DVD-3.jigdo
Программа запоминает использованные источники файлов и предлагает указать один из них их цифрой, можно ввести новый источник файлов.
1: /mnt/debian2/
2: /mnt/debian1/
Files to scan: /mnt/debian3/
На этот раз программа нашла лишь часть файлов:
Found 5121 of the 8309 files required by the template

Copied input files to temporary file `debian-40r4a-i386-DVD-3.iso.tmp' - repeat command and supply more files to continue
Пока программа не нашла все подходящие файлы, она будет выводить предложение указать дополнительные источники снова и снова, если у Вас больше нет источников, можно нажать Enter:
Files to scan:
После этого программа предложит указать зеркало в сети, с которого можно скачать недостающие пакеты. У меня установлен apt-cacher, который указан в файле /etc/apt/sources.list. Программа сама предлагает мне использовать его, я соглашаюсь нажатием Enter:
Debian mirror [http://127.0.0.1:3142/debian/]:
После чего программа начнёт скачивание недостающих пакетов из сети. Для скачивания используется программа wget. Если Вы хотите скачивать недостающие файлы через прокси-сервер, можно настроить переменные окружения или конфигурацию wget, в которой указать адрес, порт имя и пароль используемого прокси-сервера.

Я таким образом закачал себе все три основных диска и диск с обновлениями. Насколько я понял, диск с обновлениями содержит только те пакеты, которые изменились с прошлого выпуска, потому что этот диск мне не пришлось скачивать - достаточно было указать три основных уже скачанных смонтированных диска. Имея этот диск можно обновить систему с предыдущего выпуска до текущего.

Итак, краткое описание использования программы.
1. Нужно установить в системе пакет jigdo-file.
2. Скачать файлы *.jigdo и *.template с официального сайта Debian.
3. Приготовить файлы с дисков Debian предыдущих версий, каталоги с deb-пакетами. Они могут пригодиться для того, чтобы не пришлось скачивать все диски целиком.
4. Запускать команду jigdo-lite для каждого jigdo-файла.
4а. На запрос программы "Files to scan:" можно ответить вводом пути до источника файлов, можно ввести цифру из меню для уже указанного однажды каталога, можно нажать Enter, если источников больше нет.
4б. На запрос "Debian mirror [http://127.0.0.1:3142/debian/]:" ввести URL зеркала или просто нажать Enter, чтобы использовать предложенное зеркало.
5. После завершения всех пунктов наслаждаться готовыми свежими образами системы.
Для скачивания через прокси можно соответствующим образом настроить wget, чтобы для скачивания не нужно было держать постоянно открытым отдельный терминал, можно воспользоваться программой screen.

понедельник, 13 октября 2008 г.

Игры в Linux

Недели две или три назад обновился до lenny, т.к. ждать официального выпуска не хватает терпения :) Linux-ядро осталось прежним - 2.26.18, но отлетел проприетарный модуль nvidia. Налаживать было совершенно лень, хоть и не требовало никаких усилий - просто обновить ядро и поставить к нему модуль. Я прописал в конфиге X-сервера использование свободного драйвера.

Из любопытства поставил пару игрушек - lxdoom и openarena.

Джон Кармак регулярно открывает движки всех своих игр под лицензией GPL, эти две игры основаны соответственно на движке Doom и движке Quake III. Однако, чтобы не остаться без штанов, контора не освобождает собственно сами игровые ресурсы - они по прежнему продаются за деньги. lxdoom и openarena используют доработанные движки оригинальных игр, но содержат разработанные с нуля игровые ресуры. В целом качество художественной работы, на мой взгляд, у обеих игр заметно ниже. Однако, не смотря на это, атмосфера и динамика игр абсолютно те же.

Первая игра нормально работает и без проприетарного модуля, а вот второй очень нужно 3D-ускорение. Рассмотрение openarena я отложил до того момента, когда я наконец обновлю ядро и поставлю проприетарный модуль nvidia.

Сегодня обновил ядро до версии 2.6.26-1-amd64 и поставил пакет с проприетарным модулем. Поиграл немного в openarena и понял, что прежнюю свою форму я потерял :) Играть на среднем уровне было тяжеловато, не смотря на то, что раньше я сравнительно легко играл даже на предпоследнем! Прошёл пару карт и почему-то интерес к игре немного стих.

Мне захотелось посмотреть - а что же ещё интересного из игр есть в Linux? Несколько раз встречал в интернете упоминания игр alien-arena, freeciv, какого-то аналога ufo x-com. За актуальной информацией я немедленно отправился на англоязычный ресурс www.linuxgames.com. После непродолжительного чтения нашёл ссылку на интересный проект: www.playdeb.net, где есть список доступных Linux-игр для Ubuntu. Пока что проект практически полностью дублирует страницу www.getdeb.net со списком игровых deb-пакетов для Ubuntu.

Что я там нарыл из интересного.

Шутеры от первого лица:
1. warsow,
2. urbanterror,
3. worldofpadman,
4. assaultcube.
Пошаговые стратегии:
5. freeciv - клон "Цивилизации",
6. freecol - клон "Колонизации",
7. ufoai - нечто среднее между RPG и пошаговой стратегией, клон "UFO".
RPG:
8. freedroidrpg - RPG про роботов.
Гонки:
9. tileracer.
2D:
10. slimevolley - 2D-воллейбол,
11. hedgewars - аналог "Червяков", но вместо червяков воюют ежи,
12. pipewalker - аналог KDE-шного Netwalk, отечественных "Ветка" для DOS и "IT" для Windows.

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

В общем работы теперь - непочатый край :) Можно качать, ставить, смотреть.

UPD 02-12-2008: Никита Рукавов на своём блоге выложил краткую статью со скриншотами заинтересовавших меня игр: Игры в Linux

суббота, 4 октября 2008 г.

Замена pure-ftpd-wrapper на pure-config в Debian

Продолжаю переносить статьи со старого блога. К статье могу добавить комментарий, что в принципе установка pure-ftpd из deb-src была сделана с одной лишь целью - ознакомиться с технологией. pure-ftpd можно просто поставить двоичным пакетом, а из тарболла с исходниками просто взять нужный нам wrapper и настроить скрипт в /etc/init.d на использование этого wrapper'а.

Перепробовал я под FreeBSD много разных FTP-серверов:
  1. родной bsdftpd, просто и со вкусом, ненужно заморачиваться с установкой, уже присутствует в самой системе;
  2. он-же, но споддержкой SSL и TSL - bsdftpd-ssl, после предыдущего практически не нужно ничего перенастраивать, но сразу добавляются шифрованные варианты протокола;
  3. proftpd с конфигурационным файлом, подобным оному в Apache, гибко, но тяжело. К тому же в своё время без сторонних патчей прикрутить русскую локаль было невозможно (только не кидайте камнями, типа это не по стандарту: оно бывает нужно, а добавить эту возможность в виде опции разработчики поленились);
  4. vsftpd, легко и безопасно, но почему-то тоже не прижился.
В поисках совершенства начал использовать Debian.

Человек я ленивый, а во FreeBSD тупо обновить систему с накатом обновлений безопасности сложновато:
  1. сама система - cvsup, make buildworld, make buildkernel, make installkernel, перезагрузка, смотрим как работает свежее ядро, затем make installworld;
  2. можно и проще freebsd_update, но если ядро собрано своё - опять-таки ядро придётся пересобирать;
  3. дерево портов cvsup или portsnap;
  4. проверка уязвимых установленных пакетов portaudit;
  5. установка свежих пакетов или установка из портов: portupgrade;
  6. исправление возможных глюков из-за обновлённых версий программ (конфиги поправить, запускные скрипты).
Некоторые пакеты не работают правильно, пока их не пересобирёшь из портов (бывало такое, бывало)! На это опять-таки нужно тратить время, ресурсы системы (а машинки бывают очень слабенькие - компиляция среднего размера пакетов может идти часами), или извращаться с монтированием удалённых каталогов, компилировать на более мощной системе.

В Debian тупо:
# apt-get update
# apt-get upgrade
И все обновления безопасности стоят в системе, конфигов править не нужно! Можно легко сопровождать таким способом десятки серверов, полезно лишь поставить на одну из машинок apt-cacher, чтобы не грузить почём зря официальные зеркала.

А учитывая, что в Debian есть достойная замена портам - deb-src, то жить становится значительно легче. И собственноручно собранные пакеты можно зафиксировать в системе, чтобы они не обновлялись вместе с остальными:
# dpkg --get-selections \* > selections.txt
Изменяем в selections.txt в строчке с названием пакета слово "install" на слово "hold".
# dpkg --set-selections < selections.txt
Захотелось мне поставить в качестве FTP-сервера pure-ftpd под Debian. Из достоинств: поддержка авторизации PAM (можно на свой вкус настроить на использование любых модулей), дедовский Unix (по файлам /etc/passwd, /etc/shadow, /etc/group), по собственной базе данных puredb, по базам данных в mysql и postgres, настройка дисковых квот, смена корня, ограничение пропускной способности и количества одновременных клиентов, поддержка различных кодовых страниц для конвертирования имён файлов и многое другое. Поставил, да вот незадача, у разработчиков Debian весьма нетрадиционное представление об удобстве его настройки. Поскольку pure-ftpd настраивается запуском с нужными опциями, а опций очень много, то хорошие люди придумали т.н. "wrapper", программу которая читает конфигурационный файл и запускает демон с нужными опциями. Так вот, в Debian кому-то очень понравилось хранить значения ключей настройки в отдельных файлах с соответствующими именами в каталоге /etc/pure-ftpd/conf/. Меня эта идея не вдохновила и я решил сменить перловый скрипт pure-ftpd-wrapper на стандартный pure-config.pl, идущий в комплекте с исходниками pure-ftpd. Устанавливаем пакеты, необходимые для установки из исходников (возможно я пропустил ещё какие-то нужные пакеты):
# apt-get install dpkg-dev
# apt-get install fakeroot
Скачиваем и распаковываем исходники pure-ftpd:
# apt-get source pure-ftpd
Переходим в каталог с исходниками:
# cd pure-ftpd-1.0.21
Устанавливаем пакеты, необходимые для построения пакета pure-ftpd из исходников:
# apt-get build-dep pure-ftpd
Строим пакет:
# dpkg-buildpackage -rfakeroot -us -uc
Как вариант, можно воспользоваться скриптами в каталоге с распакованным pure-ftpd:
# debian/rules build
# debian/rules binary
Выходим из каталога с исходниками:
# cd ..
И попадаем в каталог, где лежат свежепостроенные пакеты. Устанавливаем пакет pure-ftpd_1.0.21-8_i386.deb:
# dpkg -i pure-ftpd_1.0.21-8_i386.deb
Эта же технология применяется для установки любого пакета, если Вы хотите его настроить особым образом на этапе компиляции: наложить дополнительные патчи, изменить константы в исходных текстах, скомпилировать с дополнительными опциями или без ненужных. Далее, копируем новый скрипт в систему:
# cp pure-ftpd-1.0.21/configuration-file/pure-config.pl /usr/sbin/pure-ftpd-config
И устанавливаем права на выполнение:
# chmod a+x /usr/sbin/pure-ftpd-config
Теперь удаляем всё из каталога /etc/pure-ftpd/:
# rm -R /etc/pure-ftpd/*
И копируем сюда пример конфигурационного файла:
# cp pure-ftpd-1.0.21/configuration-file/pure-ftpd.conf /etc/pure-ftpd/
Исправляем скрипт запуска /etc/init.d/pure-ftpd, заменяем строчку:
WRAPPER=/usr/sbin/pure-ftpd-wrapper
На нашу:
WRAPPER=/usr/sbin/pure-ftpd-config
Добавляем после этого строчку:
CONFIG=/etc/pure-ftpd/pure-ftpd.conf
Заменяем в секциях case start и restart|force-reload:
--exec $WRAPPER -- $SUFFIX
на
--exec $WRAPPER $CONFIG -- $SUFFIX
Я собираюсь запускать pure-ftpd как самостоятельный сервер, поэтому меняю настройки запуска по-умолчанию в файле /etc/default/pure-ftpd-common: Заменяю
STANDALONE_OR_INETD=inetd
на
STANDALONE_OR_INETD=standalone
На этом пока что всё. К сожалению по этому серверу на русском языке очень мало информации, есть несколько how-to, но это не документация.

Настраиваем VPN-соединение с Уфанетом в Debian

Дома у меня есть интернет от уфимского провайдера "Уфанет", пользуюсь системой Debian GNU/Linux. Для того, чтобы получить доступ в интернет, нужно установить VPN-соединение, а точнее - PPTP.

Первый этап предполагает настройку Ethernet-соединения, а точнее настройку интерфейса на получение настроек по DHCP.

Делается это элементарно. В файле /etc/network/interfaces нужно добавить пару строчек:
auto eth0
iface eth0 inet dhcp
eth0 - это имя сетевого интерфейса, подключенного к сети Уфанет. Узнать список доступных интерфейсов можно с помощью команды:
$ ifconfig -a
Далее установим pptp-клиент и пакет resolvconf:
# aptitude install pptp-linux resolvconf
Пакет resolvconf добавляет к клиентам dhcp и pptp специальные сценарии, которые перехватывают информацию о DNS-серверах, полученную от dhcp- и pptp-серверов соответственно. Основываясь на перехваченной информации сценарии выполняют корректное обновление списка DNS-серверов в файле /etc/resolv.conf

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

Краткие пояснения по файлам конфигурации:

login - логин на соединение (именно логин, а не номер договора)
password - пароль на соединения (пароль на соединение, а не на просмотр баланса)
vpn.ufanet.ru - доменное имя VPN-сервера Уфанет

Теперь сами файлы:
/etc/ppp/peers/ufanet
pty "pptp vpn.ufanet.ru --nolaunchpppd"
name login
remotename vpn.ufanet.ru
file /etc/ppp/options.pptp
ipparam ufanet   # Этот параметр передаётся в скрипты настройки
                 # маршрутизации, о которых ниже
/etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client    server           secret      IP addresses
login       vpn.ufanet.ru    password    *
/etc/ppp/options
asyncmap 0
auth
crtscts
lock
hide-password
modem
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
noipx
/etc/ppp/options.pptp
lock
noauth
nobsdcomp
nodeflate
persist    # Восстанавливать соединение при обрыве
Теперь собственно скрипты для прописывания маршрутов при поднятии линка и для удаления маршрутов при падении линка. Скрипты были почерпнуты в одной из Интернет-конференций и доработаны под наш случай (в исходном виде скрипты, увы не работали).

/etc/ppp/ip-up.d/route
#!/bin/sh

case "$PPP_IPPARAM" in
  ufanet)
    SERVER=vpn.ufanet.ru
    GW=`route -n | grep ^0\.0\.0\.0 | awk '{print $2}'`
    route del $PPP_REMOTE dev $PPP_IFACE
    route add -host $SERVER gw $GW
    route add default dev $PPP_IFACE
    ;;
  *)
    echo "No PPP_IPPARAM defined"
    ;;
esac
/etc/ppp/ip-down.d/route
#!/bin/sh

case "$PPP_IPPARAM" in
  ufanet)
    SERVER=vpn.ufanet.ru
    route del -host $SERVER
    route del default dev $PPP_IFACE
    ;;
  *)
    echo "No PPP_IPPARAM defined"
    ;;
esac
Для того, чтобы сценарии заработали, нужно добавить им бит исполняемости:
# chmod +x /etc/ppp/ip-up.d/route /etc/ppp/ip-down.d/route
Подключение осуществляется с помощью команды:
# pon ufanet
Отключение осуществляется с помощью команды:
# poff ufanet
Команды pon и poff нужно выполнять от пользователя root.

Чтобы соединение устанавливалось при старте системы, можно прописать в файл /etc/network/interfaces следующие строки:
auto ufanet
iface ufanet inet ppp
  provider ufanet

Настройка принтера HP LaserJet 1018 в Debian

Решил перенести пару статей со старого блога, это одна из них.

Мне захотелось настроить в Linux систему печати, чтобы распечатать статью из браузера.

Сначала я установил пакет подсистемы печати cupsys:
# aptitude install cupsys
Пакет установился и автоматически запустил демона печати и даже нашёл подключенный к USB-порту принтер. Однако тест принтера не дал результатов:
# touch test.txt
# echo "Hello World" > test.txt
# cat test.txt > /dev/usb/lp0
Принтер упорно делал вид, что его вообще тут нет.

Я немного погуглил в инете на тему настройки принтеров HP LaserJet 1018 и нашёл несколько интересных текстов, о том как же его всё-таки заставить работать.

Всё дело оказалось в том, что перед тем, как начать печатать, на принтер нужно отправить так называемую прошивку.

Я критически рассмотрел все три источника и в итоге скомпилировал "своё авторитетное видение" процесса правильной настройки принтера HP LaserJet 1018 в системе Debian GNU/Linux.

Устанавливаем пакет foo2zjs:
# aptitude install foo2zjs
Скачиваем исходник его свежей версии с официального сайта разработчика:
# wget -O foo2zjs.tar.gz http://foo2zjs.rkkda.com/foo2zjs.tar.gz
Распакуем его:
# tar -xzvf foo2zjs.tar.gz
Перейдём в каталог с исходниками:
# cd foo2zjs
Скачаем образ прошивки для нашего принтера:
# ./getweb 1018
Тут особое внимание нужно обратить на символы "./" указывающие на то, что команда запускается из текущего каталога, а не из установленного в системе пакета. При этом будет скачана самая свежая версия прошивки.

Преобразуем прошивку в формат, пригодный для загрузки на принтер, сразу же поместив её в каталог прошивок:
# arm2hpdl aihp1018.img > /usr/share/foo2zjs/firmware/sihp1018.dl
Сменим владельца прошивки:
# chown root:root /usr/share/foo2zjs/firmware/sihp1018.dl
После чего выключим и включим принтер. Вуаля, новая прошивка должна быть загружена в принтер!

Теперь осталось лишь переконфигурировать принтер:
# printconf
К сожалению запускать эту команду необходимо каждый раз после подключения принтера.

В комплекте с подсистемой печати идёт веб-приложение для управления подсистемой печати. Оно доступно локально по адресу http://localhost:631/

В чём преимущества моего метода? В том, что в системе установлен пакет foo2zjs, идущий в комплекте с дистрибутивом. А это значит, что у нас не будет головной боли с обновлением этого пакета.

Список использованных материалов:
  1. Руководство по настройке системы печати
  2. Установка принтера HP1020 в Debian Еtch
  3. Установка принтера HP LaserJet 1018
  4. [GNU/Debian][HP 1018]Помогите