Собственный дистрибутив на базе Debian Linux

10:34

Потребовалось как-то по работе сделать кастомный дистрибутив. Дистрибутив должен умещаться на один диск и содержать в себе все, что требуется для простого десктопа + некоторые мелочи.

Итак, поехали.

 


Для начала нам надо установить эталонную систему. Берем с сайта debian.org дистрибутив. Например NetInstall. Скачиваем и устанавливаем на машину(или на виртуальную машину, кому как удобнее). Например я ставлю базовую систему, а затем все устанавливаю руками.

Итак. Система установлена. Устанавливаем требуемые пакеты.

apt-get install gnome gdm openoffice.org xfonts-base xorg xserver-xorg

После устанавливаем пакет «apt-move»
открываем настройки /etc/apt-move.conf и указываем в пункте LOCALDIR путь до того места, где у нас будет храниться будущий дистрибутив. У меня путь был указан в /home/debian. Сохраняем конфиг и выполняем команду apt-move update

По указанному выше пути(/home/debian/distrib) появился каталог pool. В нем будут лежать пакеты, которые в итоге окажутся на диске.

Монтируем CD(в нем ведь все еще есть диск Debian NETINSTALL) и копируем все, что на нем есть в каталог /home/debian/distrib.
Скачиваем с серверов debian.org файлы override.<дистрибутив>. Я например брал с ftp.fr.debian.org/debian/indices. Версия текущего дистрибутива etch, поэтому и скачиваем файлы, с названиями override.etch.*
Разархивируем gunzip'ом и кладем например в /home/debian/indices
В каталоге /home/debian создаем файл с именем apt.conf и заполняем его текстом по примеру с wiki.debian.org/DebianCustomCD/PoolAptConf. В этом-же каталоге создаем файл с названием дистрибутива (например mycd.conf) и заполнем его по примеру с wiki.debian.org/DebianCustomCD/PoolPackagesGzConf
Запускаем apt-ftparchive -c apt.conf generate mycd.conf
Ну а теперь самое главное. в каталоге /home/debian/distrib/install.i386 создаем файл preseed.conf
В него вписываем инструкции для инсталлятора Debian.

Пример заполнения файла preseed.conf
#заставляем инсталлер автоматически выбирать интерфейс
d-i netcfg/choose_interface select auto

#или выбираем конкретный
#d-i netcfg/choose_interface select eth1

# устанавливаем таймаут для DHCP(в данном случае, если у вас DHCP сервер медленный)
d-i netcfg/dhcp_timeout string 100

#если по DHCP ничего не получили, выводим опцию с возможностью указать настройки сети руками
d-i netcfg/dhcp_failed note
d-i netcfg/dhcp_options select Configure network manually

#название хостнейма данной машины и домена
d-i netcfg/get_hostname string office
d-i netcfg/get_domain string local

# Установка часов
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Moscow

#Устанавливаем базовую систему
tasksel tasksel/first multiselect standard

#возможны разные варианты :)
#tasksel tasksel/first multiselect standard, web-server
#tasksel tasksel/first multiselect standard, kde-desktop

# Ну и индивидуальныем пакеты
d-i pkgsel/include string ssh xorg xserver-xorg gdm gnome openoffice.org xfonts-base xfonts-100dpi xfonts-75dpi xfonts-encodings xfonts-scalable xfonts-utils

# Показываем сообщение о предстоящем ребуте
d-i finish-install/reboot_in_progress note



Сохраняем этот файл и открываем для редактирования isolinux/isolinux.cfg
в нем дописываем
LABEL installseed
kernel /install.386/vmlinuz
append vga=normal file=/cdrom/install.386/preseed.cfg initrd=/install.386/initrd.gz —

выходим в директорию /home/debian/distrib
выполняем команду
find. -type f -print0 | xargs --null md5sum > md5sum.txt
и собственно начинаем процесс создания ISO образа:
genisoimage -r -V «Debian 4.0 r4a i386 custom» -o /home/debian/debiancustom_40.iso -J -cache-inodes -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table /home/debian/distrib

После того, как программа закончит работу, в /home/debian/ можно будет найти .iso файл с нашим кастомным дистрибутивом. Теперь его или пишем на болванку или ставим на виртуальную машину.

p.s. надеюсь, ничего не забыл :)

 

(c)

Далее

Настройка NFS сервера и NFS клиента под FreeBSD и Linux

19:11
NFS сервер (FreeBSD):

/etc/rc.conf:

    portmap_enable="YES"
    nfs_server_enable="YES"
    nfs_reserved_port_only="YES"

/etc/exports (man exports):
    /usr/local/nfs -rw 192.168.1.2
    /usr/local/nfs -ro -mapall=nobody -network 192.168.1 -mask 255.255.255.0
    /cdrom -alldirs,quiet,ro -network 192.168.33.0 -mask 255.255.255.0

Для Linux /etc/exports будет выглядеть примерно так (запуск - service start portmap и nfs):

    /usr/local/nfs  192.168.1.0/255.255.255.0(ro) 192.168.2.1(rw)

NFS клиент:

/etc/rc.conf: 
   portmap_enable="YES", nfs_client_enable="YES"

/etc/fstab:
    192.168.1.1:/usr/local/nfs          /home/nfs   nfs ro  0   0

или вручную:
   /sbin/mount_nfs -r 32768 -w 32768 -i noatime 192.168.1.1:/usr/local/nfs /home/nfs 

Для оптимизации производительности рекомендуется при монтировании в Linux указывать параметры:
   rsize=32768,wsize=32768,intr,noatime

Число запущенных клиентов и серверов под FreeBSD регулируется 
через параметр "-n" в переменных rc.conf: nfs_client_flags и nfs_server_flags

В некоторых Linux дистрибутивах число серверов задается в файле /etc/sysconfig/nfs, 
переменная NFSDCOUNT, значение которой передается как аргумент при запуске rpc.nfsd.

(с)

Overview: Комплект полезных расширений для Gnome Shell.

19:09

gnome-shell-extensions

 

GNOME Shell Extensions - официальный набор расширений для Gnome Shell, добавляющий такие возможности, как классическое меню, кнопку выключения, расширение, позволяющее быстро менять темы оформления и многое другое.

 

Далее

Краткое руководство по GNOME Shell в Ubuntu 11.10

19:07

gnome-shell



В Ubuntu 11.10, наконец-то, появился лёгкий и безопасный способ установить и опробовать GNOME Shell — новый интерфейс рабочего стола от GNOME.

Это означает, что в отличие от предыдущих версий Ubuntu, в нынешней установка GNOME Shell не требует добавления каких-либо дополнительных репозиториев или запуска каких-то скриптов: он может быть установлен непосредственно из центра приложений Ubuntu простым нажатием кнопки.

 

Далее

Мультидоменность в Apache без лишних хлопот на локальном хосте

19:02

Интернет пестрит руководствами по настройке виртуальных хостов в Apache. Но, в большинстве случаев, создание такого поддомена представляется хлопотным делом.
По «стандартной» инструкции предлагается сделать следующее:

  1. Создать папку для сайта
  2. Создать конфигурационный файл с именем будущего домена
  3. Включить сайт специальной опцией
  4. Перезагрузить Apache
  5. Прописать наш домен в файле hosts

 

Некоторые пытаются оптимизировать данный процесс различными скриптами, но проблемы это, по сути, не решает.
Итак, попробуем добиться, чтобы процесс создания поддомена сводился лишь к созданию папки для сайта. Возможно ли это? Проверим...
Как устанавливать LAMP я рассказывать не буду, так как вы, скорее всего, можете сделать это с закрытыми глазами (смайл). Перейдем к самому интересному.

Настройка vhost_alias


Включаем модуль vhost_alias. Он то и будет главным действующим лицом.

sudo a2enmod vhost_alias


Включаем, если нужно, mod_rewrite.

sudo a2enmod rewrite


Открываем файл httpd.conf и приступаем к непосредственной настройке.

#Подставляем имя сервера из заголовка запроса пользователя
UseCanonicalName Off
# Формируем логи так, чтобы в них указывалось имя виртуального хоста
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog /home/%username%/web/access_log vcommon

# Нужно для работы mod_rewrite
<Directory /home/%username%/web>
    Options FollowSymLinks
    AllowOverride All
</Directory>

# Собственно правило, по которому будет искаться нужный нам сайт
VirtualDocumentRoot /home/%username%/web/%-2 


%-2 означает, что по хост будет выбран по предпоследней части доменного имени. Другими словами, создав директорию /home/%username%/web/habrahabr, мы сможем обратиться к ней как habrahabr.ru (или habrahabr.com, или даже habrahabr.xxx).
Можно также задать свои параметры выбора имени хоста:

  • %0 Полное имя
  • %1 Первая часть имени
  • %2 Вторая часть имени
  • %3 Третья часть имени
  • %-1 Последняя часть
  • %-2 Предпоследняя часть
  • %2+ Вторая и все последующие части
  • %-2+ Предпоследняя и все последующие части


Рестартуем Apache.

sudo service apache2 restart


Наш сервер уже работает. Убедиться в этом мы можем, создав папку с нужным именем, например test и поместив туда index.php с каким-нибудь содержимым, например "<?php phpinfo(); ?>".
Ах да, нужно ведь еще прописать наш домен в файлике /etc/hosts.

127.0.0.1    test.loc


Все, теперь можно открывать в браузере страничку.
Стоп, мы так не договаривались! Создание сайта должно сводиться к созданию директории под него. Ну что ж, давайте сделаем…

Настройка DNS-сервера


Для этого мы будем использовать DNS-сервер bind9. Все домены с суффиксом *.loc будут смотреть на нашу локальную машину.
Устанавливаем DNS-сервер

sudo apt-get install bind9


Открываем конфигурационный файл named.conf.options и добавляем

acl "home" {192.168.1.0/24; 127.0.0.1;};
options {
    directory "/var/cache/bind";
    auth-nxdomain no;
    listen-on-v6 { none; };
    listen-on { 127.0.0.1; };
    allow-transfer { none; };
    allow-query {"home";};
    forward first;
    # Указываем DNS-адреса провайдера
    forwarders {
        192.168.1.2;
        8.8.8.8;
    };
}; 


Создаем файлы для доменной зоны.

cd /etc/bind/
sudo touch db.loc


Содержание db.loc

$TTL 86400
$ORIGIN loc.
@ IN SOA skywrtr.loc. admin.skywrtr.loc. (
    2010050100; Serial
    14400; Refresh
    7200; Retry
    3600000; Expire
    86400 ); Minimum

@ IN NS localhost.

* IN A 127.0.0.1 



Наконец, открываем файл named.conf.local и дописываем туда

zone "loc" {
    type master;
    file "/etc/bind/db.loc";
    allow-transfer { 127.0.0.1; };
    notify no;
}; 



Остальсь подключиться к нашему DNS-серверу. Либо через файл /etc/resolv.conf, дописав строчку

nameserver 127.0.0.1


либо через стандартный менеджер сетевых соединений. В свойствах подключения, на вкладке «Параметры IPv4» дописать адрес 127.0.0.1 в поле «Серверы DNS».

e9eb5398

Для удобства создадим локальный хост для phpmyadmin

ln -s /usr/share/phpmyadmin/ /home/alex/web/phpmyadmin


Теперь он доступен по адресу phpmyadmin.loc.

Некоторые замечания


Есть пара замечаний по работе с vhost_alias.

  • Неправильные данные дает переменная $_SERVER['DOCUMENT_ROOT'], поэтому приходится использовать либо dirname(__FILE__), либо realpath(). Смотря что нужно.
  • Если перестал работать mod_rewrite, не паникуем. В файле .htaccess после строчки
    RewriteEngine    on

    Вставляем
    RewriteBase /



Ссылки по теме:
httpd.apache.org/docs/2.0/ru/vhosts/mass.html
www.softtime.ru/info/apache.php?id_article=103

P.S. Спасибо Wott за любезно предоставленные конфиги bind.

 

(c)

Далее

Хочется взять и расстрелять, или ликбез о том, почему не стоит использовать make install

15:58

da577538

 

К написанию сей заметки меня сподвигло то, что я устал делать развёрнутые замечания на эту тему в комментариях к статьям, где в качестве части инструкции по сборке и настройке чего-либо для конкретного дистра предлагают выполнить make install.

 

 

Суть сводится к тому, что эту команду в виде «make install» или «sudo make install» использовать в современных дистрибутивах нельзя.

Но ведь авторы программ в руководствах по установке пишут, что нужно использовать эту команду, возможно, скажете вы. Да, пишут. Но это лишь означает, что они не знают, какой у вас дистрибутив, и дистрибутив ли это вообще, может, вы вступили в секту и обкурилисьчитались LFS и теперь решили под свою хтоническую систему скомпилять их творение. А make install является универсальным, хоть и зачастую неправильным способом это сделать.

Лирическое отступление


Как известно, для нормальной работы большинство софта должно быть не только скомпилировано, но и правильно установлено в системе. Программы ожидают найти нужные им файлы в определённых местах, и места эти в большинстве *nix-систем зашиты в код на этапе компиляции. Помимо этого аспекта основным отличием процесса установки в linux/freebsd/whatever от таковой в Windows и MacOS является то, что программа не просто складывает кучу файлов в отдельную директорию в Program Files или /Applications, а «размазывает» себя по всей файловой системе. Библиотеки идут в lib, исполняемые файлы в bin, конфиги в etc, разного рода данные в var и так далее. Если вам вдруг понадобится её обновить, то всё это надо сначала как-то вычистить, т. к. при использовании новой версии остатки файлов от старой могут привести к совершенно непредсказуемым последствиям, зачастую нехорошим. Вероятность этого события не так велика, но оно вам надо на боевом сервере?

И что с того?


Так вот, если вы делали установку напрямую через make install, то нормально удалить или обновить софтину вы, скорее всего, не сможете. Более того, установка новой версии поверх старой, скорее всего, затрёт ваши изменения в конфигах. make install делает ровно то, что ему сказано — производит установку файлов в нужные места, игнорируя тот факт, что там что-то уже есть. После этого процесса совершенно никакой информации о том, что и куда ставилось, получить в удобоваримом виде невозможно. Иногда, конечно, Makefile поддерживает действие uninstall, но это встречается не так часто, да и не факт, что корректно работает. Помимо этого хранить для деинсталяции распакованное дерево исходников и правил сборки как-то странно.

Как бороться?


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

  1. берётся определённым образом сформированный архив
  2. из него извлекается информация о том, что это вообще такое, какой версии, от чего зависит, с чем конфликтует, надо ли для установки/удаления/настройки запускать какие-то скрипты, etc
  3. Выполняются действия по непосредственной установке
  4. Все данные о том, куда и что было поставлено добавляются в базу данных пакетного менеджера.



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

Если вы по незнанию/лени скопипастили make install из инструкции, то в системе появляются файлы, о которых пакетный менеджер не знает. Со всеми вытекающими, если вам мало того, что было перечислено ранее.

Что делать?


Можно, конечно, сконфигурировать дерево исходников так, чтобы установка всего и вся шла куда-нибудь в /opt/mycoolapp/, а потом при необходимости руками удалить, но тут может вылезти масса неприятных вещей, начиная с того, что программа ожидает, что сможет загрузить свои библиотеки, а загрузчик о директории, где они лежат ничего не знает, заканчивая тем, что автор программы может рассчитывать, что например, если он кладёт файл, скажем в $prefix/share/xsessions/, то его подхватит менеджер дисплея. Не говоря уже о путях для pkgconfig и прочем.

Так что надо собирать пакет.

У меня нет времени, чтобы ***ться с этим, лучше ещё раз сделаю make install, всё просто и понятно!


Спокойно, спокойно. Он у нас за ноги привязан. Всё не так уж страшно и сложно, как кажется на первый взгляд.

checkinstall


Данная чудесная утилита, будучи запущенной вместо make install задаст несколько вопросов, после чего сама соберёт и установит пакет. Всё, при обновлении никаких проблем с вычисткой старого хлама у вас не будет.

Сборка deb-пакета вручную


Если вы не склонны доверять такой автоматике (которая иногда всё же косячит) или же хочется внести пару изменений, но разбираться с нормальным процессом сборки пакетов всё же лениво, то можно собрать пакет ручками. Я привожу способ, как соорудить его для систем на базе Debian, т. к. лучше всего знаком именно с ними. Он не является идеологически правильным, но на выходе получается вполне корректный пакет без задействования дополнительных сущностей. Делается это следующим образом.
Для начала собираем софт с предварительно указанными для configure или autogen.sh параметрами --prefix=/usr и --exec-prefix=/usr.
Далее производим установку во временную директорию. Пишем:

fakeroot
make install DESTDIR=`pwd`/tempinstall


После чего получаем в свежесозданной директории весь тот набор файлов файлов. Кстати, мы сейчас находимся в fakeroot-окружении, т. е. можно невозбранно менять владельца и права доступа файлов, но физически в системе владельцем останетесь вы сами. Софт же внутри fakeroot-сессии будет получать изменённую информацию, что позволит упаковать в архив файлы с корректными правами.
Далее создадим в «корне пакета» директорию DEBIAN и сложим в DEBIAN/conffiles список всех файлов, которые должны попасть в /etc:

cd tempinstall
mkdir DEBIAN
find etc|sed "s/^/\//"|DEBIAN/conffiles


После чего создаём файл DEBIAN/control следующего содержания:

Package: имя_пакета
Version: 1.2.3
Architecture: amd64/i386/armel/all
Maintainer: Можете вписать своё имя, можете дребедень, но если оставить пустым, то dpkg будет ругаться
Depends: Тут можно вписать список пакетов через запятую.
Priority: optional
Description: Тоже надо что-нибудь вписать, чтобы не кидало предупреждения



При необходимости там же можно создать скрипты preinst, postinst, prerm и postrm.

Всё, делаем dpkb -b tempintall и получаем на выходе tempinstall.deb, на который можно натравить dpkg -i и который корректно установится, обновится или удалится.

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

Заключение



Как видите, тут нет абсолютно ничего сложного, но выполнение этих действий избавит вас от огромного числа проблем в будущем.

А авторам статей на хабре просьба: пишите checkinstall вместо make install. Не надо давать вредные советы.

 

(c)

Далее

MySQL dump

08:59

бэкап

mysqldump --opt -u root -p dbname | bzip2 > dbname.sql.bz2

востановление

bzcat dbname.sql.bz2 | mysql -u root -p dbname

Things To Tweak / Fix After Installing Ubuntu 11.04 Natty Narwhal

09:12

ccsm2

A note before reading this post: before giving up on Unity without giving it a try... don't. Try Unity for a few days - yes, it's not a finished product but it's actually quite interesting - and if you don't like it then switch.

If you've just upgraded to Ubuntu 11.04 Natty Narwhal, there are probably a few things you'll miss, so here is how to get them back as well as some other things you may find useful.

Скринсейвер Pong в режиме часов в Ubuntu

22:53

Если вам надоели скучные скринсейверы в убунту, и до релиза Bolgen OS не дотерпеть, эта статья для вас! Раньше в Gnome можно было настроить скринсейвер, но эту возможность убрали из интерфейса ради его упрощения, лишив нас с вами возможности быстро и просто конфигурировать скринсейверы. В этом топике я расскажу вам, как обзавестись олдскульным, красивым и полезным скринсейвером за пять минут.

Картинка кликабельна, по ссылке видео

pong

Далее

Flash Player 10.2 + vdpau + 64-bit

14:41

Как известно, актуальных версий Adobe Flash Player для 64-битных систем Linux пока не существует. Да, есть Square. Но он не обновляется, да и GPU-декодинга видео в нём нет. Приходится использовать 32-битную версию.

Вот только и с ней GPU-декодинг видео из коробки не заработает. Что делать?

Далее