Создание своего быстрого и лёгкого Linux

23:04

Tux-G3

Итак чтобы создать свой оптимизированный Linux для нетбука делаем вот что:
1) Берём свой любимый Linux дистрибутив (у меня это Debian)
2) Устанавливаем его в минимальной конфигурации.
3) Устанавливаем по частям необходимый софт:


Окружение рабочего стола:

XFCE

alt


или LXDE

alt

Про LXDE более детально написано в этой статье

4) Делаем необходимые настройки:
(вся установка и настройка на примере Debian и MSI WInd,но она подойдёт для большинства нетбуков и других дистрибутивов.)
Меняем bash на dash, что даст нам прирост скорости.
#apt-get install dash
#dpkg-reconfigure dash


Устанавливаем микрокод для процессора
#apt-get install intec-microcode

Устанавливаем утилиту powertop,чтобы узнать,как повысить автономную работу.
#apt-get install powertop

 #powertop

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

echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

echo 2000 > /proc/sys/vm/dirty_writeback_centisecs

echo min_power > /sys/class/scsi_host/host0/link_power_management_policy


Добавте опции noatime к файловым системам в /etc/fstab

Затем откройте /etc/laptop-mode/laptop-mode.conf и измените значение CONTROL_HD_POWERMGMT на 1. (удостоверьтесь,что пакеты acpi-support и acpid установлены иначе никакого энергосбережия не получите)

Настроим запуск демонов.

#apt-get install sysv-rc-conf
#sysv-rc-conf

Debian обычно стартует на 2 уровне,поэтому бдем править его.
У меня обычно нет задач,которые надо запускать по расписанию поэтому  убираю включение планировщиков cron,anacron,atd и локальную почту exim4 поскольку она чаще всего грузится дольше всех. Советую так же советую отключить автозапуск bluetooth и wi-fi они тоже кушают батарейку.

Устанавливаем звук

#apt-get install alsa-base alsa-utils


Настраиваем alsa

#alsaconf

Выбираем hda-intel

Устанавливаем видео

#apt-get install xserver-xorg-video-intel xinit


Устанавливаем и настраиваем ядро:

#apt-get install linux-source

Теперь перейдём в каталог исходных текстов ядра

#cd /usr/src/linux  (если такого каталога нет,то сделайте ссылку с установленной версии исходников ln -s /usr/src/linux-2.6.x.x  /usr/src/linux)

Перед конфигурированием, создать файл .config, с настройками для вашего будущего ядра.

вариант №1

Можно воспользоваться файловой системой proc, где
в файле config.gz находятся компрессированные настройки текущего ядра, с которого запущена
система:

zcat /proc/config.gz >> /usr/src/linux/.config

вариант №2
Воспользоваться утилитой oldconfig

# make oldconfig



Запустите утилиту по конфигурированию

xconfig - утилита конфигурирования ядра, написанная с помощью библиотеки Qt.
gconfig - аналогичная утилита,написанная на gtk.
menuconfig - программа использующая библиотеку ncurses для визуализации консольных приложений.
config - терминальная утилита задающая вопрос, и ожидающая один из вариантов ответа:
да/нет/модуль/?

Я предпочитаю menuconfig

#make menuconfig

Не хочу отбирать славу у человека который всё детально расписал здесь , поэтому про установку wi-fi,apm и дальнейшей установки ядра советую посмотреть по ссылке.
А кому некогда или лень разбираться - вот предлагаю мой конфиг ядра 2.6.26

Attachments:
FileОписаниеFile size
Download this file (config.txt)config.txt Конфиг ядра для MSI WIND U100(переименовать в .config)

54 Kb

(c)

Далее

Формат deb-пакета

22:56

Debian

Краеугольный камень пакетной системы Debian — это deb-пакет (см. deb(5)), представляющий из себя архив формата ar, внутри которого содержится три файла:
1. debian-binary — текстовый файл, содержащий версию формата deb-пакета, в данный момент это 2.0. Программы, работающие с deb-пакетами, должны читать только первую строку этого файла и не падать, если минорная версия вдруг поменяется (например, станет 2.1).
2. control.tar.gz — служебная информация о пакете, скрипты, вспомогательные файлы (см deb-control(5)). Должен содержать только файлы, единственная папка, которая может присутствовать — «.» (текущая директория). В этот архив обязательно должен входить файл control, его минимальное содержимое рассмотрим чуть ниже.
3. data.tar — собственно файлы, устанавливаемые в систему. Чаще всего этот файл сжат каким-нибудь архиватором (поддерживаются расширения .gz, .xz, .bz2, .lzma), чаще всего в архивах встречается data.tar.gz.

Указанный порядок следования файлов в архиве обязателен. Если в этом архиве требуется разместить еще какие-нибудь файлы (не представляю, зачем это может кому-нибудь понадобиться), они должны находиться перед data.tar.gz, т.е. последний файл в архиве всегда data.tar. Но если сообщество когда-нибудь решит добавить в формат deb еще файлы, они будут помещены после data.tar.

Файл control в архиве control.tar.gz описывает назначение, версию и зависимости пакета, его формат более-менее подробно описан в deb-control(5). Пересказывать всю справку сейчас не буду, опишу лишь минимальное содержимое, необходимое для взаимодействия с инфраструктурой dpkg:

Package: имя пакета
Version: строка версии (при выборе политики назначения версий следует придерживаться deb-version(5))
Maintainer: John Doe <johndoe@foo.com> (человек, поддерживающий пакет, а не автор программы)
Description: короткое описание пакета
Длинное описание, на несколько строк. Каждая строка, входящая в
длинное описание, должна начинаться с пробела

Работа с пакетами средствами ar

Теоретически данной информации должно быть достаточно, чтобы собрать простейший пакет «на коленке» и установить его в систему. Пусть наш пакет (назовем его test) просто добавляет в систему файл /usr/share/example-content/test со строчкой «test». Сделаем архив data.tar.gz со структурой папок и единственным файлом, а также файлик debian-binary:

$ mkdir -p usr/share/example-content/
$ echo test > usr/share/example-content/test
$ tar czf data.tar.gz usr
$ echo 2.0 > debian-binary

Создадим файл control со следующим содержанием:

$ cat control
Package: test
Version: 1.0
Maintainer: Dummy Maint <dummy@example.org>
Description: test package
Test package created on my own knees.
$ tar czf control.tar.gz control

Теперь соберем все воедино:

$ ar -qS test-1.0.deb debian-binary control.tar.gz data.tar.gz

В текущем каталоге должен появиться файл test-1.0.deb. Его «физическое» содержимое можно просмотреть с помощью следующей команды:

$ ar t test-1.0.deb
debian-binary
control.tar.gz
data.tar.gz

Посмотреть файл debian-binary:

$ ar p test-1.0.deb debian-binary
2.0

Посмотреть список файлов в пакете:

$ ar p test-1.0.deb data.tar.gz|tar -tzf -
usr/
usr/share/
usr/share/example-content/
usr/share/example-content/test

Посмотреть содержимое файла control:

$ ar p test-1.0.deb control.tar.gz |tar -O -xzf - control
Package: test
Version: 1.0
Maintainer: Dummy Maint <dummy@example.org>
Description: test package
Test package created on my own knees.

Можно установить этот пакет и убедиться, что файл /usr/share/example-content/test успешно создан, но лучше этого не делать, поскольку из-за недостатка информации в control в пакетной системе может появиться мусор:

$ sudo dpkg -i test-1.0.deb
Selecting previously deselected package test.
(Reading database ... 97631 files and directories currently installed.)
Unpacking test (from test-1.0.deb) ...
Setting up test (1.0) ...

Работа с пакетами средствами dpkg-deb

Все вышеописанное позволяет управляться с deb-пакетами на самом низком уровне, не имея под рукой ничего, кроме стандартных средств Unix (доподлинно известно, что программа ar входила в состав первых Unix 1970х годов). Однако, как несложно догадаться, есть и более высокоуровневые способы создания пакетов и изучения их содержимого. В частности, если уж так необходимо поковыряться с пакетом на низком уровне, все вышеописанные действия настоятельно рекомендуется выполнять с помощью утилиты dpkg-deb(1).

Создание пакета средствами dpkg-deb

Минимальный формат вызова команды dpkg-deb для построения пакета следующий:

dpkg-deb -b исходная_папка

Все, что находится в исходной папке, кроме директории DEBIAN, помещается в data.tar.gz. Содержимое DEBIAN будет использовано для создания control.tar.gz, в частности, будет прочитан и проанализирован файл control и в случае каких-либо ошибок (отсутствует одно из необходимых полей или эти поля имеют неправильные значения) пакет просто не будет создан. Процесс создания нашего тестового пакета с нуля теперь выглядит так (в последней команде предполагается, что в текущей папке остался файл control от сборки пакета средствами ar):

Подготовка структуры:

$ mkdir -p test-1.1/usr/share/example-content/ test-1.1/DEBIAN
$ echo test 1.1 > test-1.1/usr/share/example-content/test
$ sed 's/Version: 1.0/Version: 1.1/g' control > test-1.1/DEBIAN/control

Попытаемся собрать пакет:

$ dpkg-deb -b test-1.1
warning, in file 'test-1.1/DEBIAN/control' near line 5 package 'test':
missing architecture
dpkg-deb: building package `test' in `test-1.1.deb'.
dpkg-deb: warning: ignoring 1 warnings about the control file(s)

Несмотря на отсутствие важного, но не необходимого поля Architecture, был создан пакет test-1.1.deb. Добавим поле и пересоздадим пакет:

$ sed -i "1a \
Architecture: all" test-1.1/DEBIAN/control

$ dpkg-deb -b test-1.1
dpkg-deb: building package `test' in `test-1.1.deb'

Еще одна немаловажная деталь. Как правило, в названии файла пакета указывается его архитектура, а команда dpkg-deb -b назвала файл по имени папки, из которой он был создан. Если бы папка называлась ololo, то мы получили бы ololo.deb. Чтобы файл пакета автоматически именовался в формате имя-версия-архитектура, при вызове dpkg -b необходимо указывать папку, куда будет положен итоговый архив, например, текущую. Тогда все компоненты имени файла будут извлечены из control:

$ cp -R test-1.1 ololo
$ dpkg -b ololo
dpkg-deb: building package `test' in `ololo.deb'.
$ dpkg -b ololo .
dpkg-deb: building package `test' in `./test_1.1_all.deb'.

Теперь всё относительно нормально, продолжаем изучение возможностей dpkg-deb на примере нового пакета.

Получение информации о пакете

Узнать версию формата deb, размер пакета и содержимое файла control:

$ dpkg -I test_1.1_all.deb
new debian package, version 2.0.
size 644 bytes: control archive= 259 bytes.
160 bytes, 6 lines control
Package: test
Architecture: all
Version: 1.1
Maintainer: Dummy Maint <dummy@example.org>
Description: test package
Test package created on my own knees.

Список файлов, устанавливаемых в систему (кроме служебных):

$ dpkg -c test_1.1_all.deb
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./usr/
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./usr/share/
drwxr-xr-x bvk/bvk 0 2010-10-22 13:21 ./usr/share/example-content/
-rw-r--r-- bvk/bvk 9 2010-10-22 13:21 ./usr/share/example-content/test

Обратите внимание на владельца устанавливаемых файлов и каталогов: это не root, а некий пользователь. Чтобы исправить эту проблему, можно собирать пакеты из-под root’а, либо воспользоваться специальной утилитой fakeroot из одноименного пакета. Она перехватывает системные вызовы chmod(2) и stat(2) для файлов, и возвращает значения, как если бы файл принадлежал пользователю root. Небольшой пример:

$ id
uid=1000(bvk) gid=1000(bvk) ...
$ touch trololo
$ ls -l trololo
-rw-r--r-- 1 bvk bvk 0 2010-10-22 13:23 trololo
$ fakeroot ls -l trololo
-rw-r--r-- 1 root root 0 2010-10-22 13:23 trololo

Думаю, принцип понятен. Пересоберем пакет еще более правильно:

$ fakeroot dpkg -b test-1.1 .
dpkg-deb: building package `test' in `test_1.1_all.deb'.
$ dpkg -c test_1.1_all.deb
drwxr-xr-x root/root 0 2010-10-22 13:25 ./
drwxr-xr-x root/root 0 2010-10-22 13:25 ./usr/
drwxr-xr-x root/root 0 2010-10-22 13:25 ./usr/share/
drwxr-xr-x root/root 0 2010-10-22 13:25 ./usr/share/example-content/
-rw-r--r-- root/root 9 2010-10-22 13:25 ./usr/share/example-content/test

Теперь наконец ок.

Можно получаить информацию о пакете в заданном формате:

$ dpkg-deb -W --showformat='${Package}-${Version}-${Architecture} (${Maintainer})\n' test_1.1_all.deb
test-1.1-all (Dummy Maint <dummy@example.org>)

Список полей, которые можно указать в –showformat, можно узнать из вывода команды dpkg-deb -I

Подать на STDOUT архив data.tar.gz из пакета (уже «разжатый»), может быть полезно для извлечения только некоторых файлов:

$ dpkg-deb --fsys-tarfile test-1.0.deb |tar -Ox usr/share/example-content/test
test

Перепаковка пакета

Пожалуй, теперь наступил момент применить свежеполученные знания на практике :) Часто возникает следующая проблема: из некоего источника поступил пакет с некорректными зависимостями, например, требуется устаревший пакет, отсутствующий в системе и всех репозиториях, но доподлинно известно, что другой, уже установленный пакет предоставляет нужную функциональность. В скачанном пакете требуется изменить файл control, убрав или исправив зависимость. Правильно было бы скачать и распаковать исходник пакета (apt-get source), произвести необходимые изменения в скриптах сборки, установить все необходимые для пересборки библиотеки и окружение и т.д. и т.п., но для частного использования (т.е. без распространения по репозиториям) достаточно просто распаковать пакет, изменить необходимые файлы и запаковать обратно. Проиллюстрирую последовательность действий на примере невинного пакета hello:

$ aptitude download hello
Get:1 http://yum.fireground.ru/ubuntu/mirror/ maverick/main hello i386 2.5-1 [34.4kB]
Fetched 34.4kB in 0s (824kB/s)
# да-да, я сижу под убунтой и описываю debian
# распаковать содержимое пакета в папку hello (если не существует, будет создана):
$ dpkg-deb -x hello_2.5-1_i386.deb hello
# распаковать содержимое control.tar.gz в hello/DEBIAN
$ dpkg-deb -e hello_2.5-1_i386.deb hello/DEBIAN
# что-нибудь поменять в control, например, версию пакета:
$ sed -i 's/Version: .*$/Version: 2.5-1test/' hello/DEBIAN/control
# собрать новый пакет:
$ fakeroot dpkg -b hello/ .
dpkg-deb: warning: 'hello//DEBIAN/control' contains user-defined field 'Original-Maintainer'
dpkg-deb: building package `hello' in `./hello_2.5-1test_i386.deb'.
dpkg-deb: warning: ignoring 1 warnings about the control file(s)

Пакет собран. Убедиться, в том, что в нем нет ошибок из-за немного нетрадиционного способа сборки, можно с помощью программы lintian:

$ sudo aptitude install lintian
...
$ lintian hello_2.5-1test_i386.deb
$ echo $?
0

Всё в порядке!

Об установке пакетов в систему, механизме зависимостей, структуре репозиториев и еще более правильных способах сборки пакетов читайте в следующих статьях :)

 

(c)

Далее

Best mount options for Windows/FAT32, NFS, CDROM, USB

00:41

mount

This page REALLY is just for me to remember. When mounting a FAT32 partition, I prefer the options as in the following line found in /etc/fstab

/dev/hda1 /disks/C vfat rw,noatime,nosuid,nodev,noexec,nouser,async,iocharset=utf8,umask=0 0 0

This mounts the drive automatically at boot time and pretty much gives all users the ability to read/write to it. If I don't want the drive to be mounted at boot time but I want normal users to be able to mount it later, then I would add "noauto,user" instead of "auto,nouser" (auto is implicit in the above fstab entry). The "iocharset=utf8" option is important if you have filenames with international characters. This will make them show up appropriately (doesn't seem to be an issue with the reiserfs or ext3 as far as I have seen).

When mounting an NFS volume, I prefer

machine:directory localdirectory nfs noauto,noatime,user,rw,nosuid,hard,intr,sync 0 0

This DOESN'T automatically mount the volume a boot time, but it allows users to mount whenever they need to. The "hard,intr,sync" options are the important ones... I have had problems with "soft" and "async" while using NFS (the machine has locked up many times while using that).

For CDROMs, I like to have

/dev/cdrom /media/cdrom0 iso9660 ro,user,noauto 0 0

Floppies seem to work best using

/dev/fd0 /media/floppy0 auto rw,noatime,user,noauto 0 0

See this link for instructions on how to get your USB devices working in Linux

For a ReiserFS the following seems to work well

/dev/hdd1 /disks/hdd1 reiserfs rw,noatime 0 0

(c)

Далее

Псевдографика в консоли Unix/Linux. Немного больше User Friendly чем вы могли себе позволить

21:57

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


Наверняка многие задумывались, запуская make && make install во FreeBSD или apt-get install, например в Debian, как же хорошо было бы использовать подобные диалоги конфигурирования. Они неоправданно забыты и практически вообще не используются в пользовательских скриптах. Очень и очень зря.

Исправить это может замечательная утилита dialog.
Она присутствует во FreeBSD седьмой, восьмой ветки, а в Debian, например, можно сделать apt-get install dialog. Вообще-то, это разные программы.
Во FreeBSD немного попроще версия:

$ dialog

dialog version 0.3, by Savio Lam (lam836@cs.cuhk.hk).
  patched to version 0.4 by Stuart Herbert (S.Herbert@shef.ac.uk)
  Changes Copyright © 1995 by Andrey A. Chernov, Moscow, Russia
  patched by Anatoly A. Orehovsky (tolik@mpeks.tomsk.su)

* Display dialog boxes from shell scripts *

Usage: dialog --clear
       dialog --create-rc <file>
       dialog [--title <title>] [--clear] [--hline <line>] [--hfile <file>]\
              <Box options>

Box options:

  --yesno     <text> <height> <width> [yes|no]
  --msgbox    <text> <height> <width>
  --prgbox    "<command line>" <height> <width>
  --infobox   <text> <height> <width>
  --inputbox  <text> <height> <width> [<init string>]
  --textbox   <file> <height> <width>
  --menu      <text> <height> <width> <menu height> <tag1> <item1>...
  --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --ftree     <file> <FS> <text> <height> <width> <menu height>
  --tree      <FS> <text> <height> <width> <menu height> <item1>...


В Linux-версии возможностей побольше:

$ dialog
cdialog (ComeOn Dialog!) version 1.1-20080316
Copyright 2000-2006,2007 Thomas E. Dickey
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

* Display dialog boxes from shell scripts *

Usage: dialog <options> { --and-widget <options> }
where options are "common" options, followed by "box" options

Special options:
  [--create-rc "file"]
Common options:
  [--ascii-lines] [--aspect <ratio>] [--backtitle <backtitle>]
  [--begin <y> <x>] [--cancel-label <str>] [--clear] [--colors]
  [--cr-wrap] [--default-item <str>] [--defaultno] [--exit-label <str>]
  [--extra-button] [--extra-label <str>] [--help-button]
  [--help-label <str>] [--help-status] [--ignore] [--input-fd <fd>]
  [--insecure] [--item-help] [--keep-tite] [--keep-window]
  [--max-input <n>] [--no-cancel] [--no-collapse] [--no-kill]
  [--no-label <str>] [--no-lines] [--no-ok] [--no-shadow] [--nook]
  [--ok-label <str>] [--output-fd <fd>] [--print-maxsize] [--print-size]
  [--print-version] [--separate-output] [--separate-widget <str>]
  [--shadow] [--single-quoted] [--size-err] [--sleep <secs>] [--stderr]
  [--stdout] [--tab-correct] [--tab-len <n>] [--timeout <secs>]
  [--title <title>] [--trace <file>] [--trim] [--version] [--visit-items]
  [--yes-label <str>]
Box options:
  --calendar     <text> <height> <width> <day> <month> <year>
  --checklist    <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --dselect      <directory> <height> <width>
  --editbox      <file> <height> <width>
  --form         <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
  --fselect      <filepath> <height> <width>
  --gauge        <text> <height> <width> [<percent>]
  --infobox      <text> <height> <width>
  --inputbox     <text> <height> <width> [<init>]
  --inputmenu    <text> <height> <width> <menu height> <tag1> <item1>...
  --menu         <text> <height> <width> <menu height> <tag1> <item1>...
  --mixedform    <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>...
  --mixedgauge   <text> <height> <width> <percent> <tag1> <item1>...
  --msgbox       <text> <height> <width>
  --passwordbox  <text> <height> <width> [<init>]
  --passwordform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...
  --pause        <text> <height> <width> <seconds>
  --progressbox  <height> <width>
  --radiolist    <text> <height> <width> <list height> <tag1> <item1> <status1>...
  --tailbox      <file> <height> <width>
  --tailboxbg    <file> <height> <width>
  --textbox      <file> <height> <width>
  --timebox      <text> <height> <width> <hour> <minute> <second>
  --yesno        <text> <height> <width>



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

cat ./xbackup.sh
#!/bin/sh

SRC="/usr/home/dev/"
    SITE="${SRC}_Web/"
    PROJECT="${SRC}_Project/"

# куда будем складывать бэкапы
DST="/usr/home/share/BACKUP/"

# реквизиты для Mysql
SQLLOGIN="root"
SQLPASS="TopSecretPassword"
SQLHOST="localhost"

/* --------------------------------------------------------------------------------------------------------- */
# именовать файлы дампов и архивов будем по дате
DATE=`date "+%Y.%m.%d_%H-%M-%S"`
DSRC=""
# переменная для сохранения выбранного типа бэкапа (база или сайт)
backupType=0

# вызываемая программа для создания диалога
DIALOG=dialog
# временный файл
tempfile=`mktemp /tmp/bkp.XXXXXX`
trap "rm -f $tempfile" 0 1 2 5 15

# функция для вывода информационного окна
InfoDialog() {
    ${DIALOG} --msgbox "$1" 5 70
}

# упаковка файлов из выбранной директории
BackupFiles() {
    if [ ! -d ${2} ]then
        
mkdir -p ${2}
    fi
    
tar -c --gzip -f "${2}${DATE}.tar.gz" "${1}"
    InfoDialog "OK -> ${2}${DATE}.tar.gz"
}

# сохранения дампа базы в файл
BackupMySQL() {
    case ${1} in
        "All_Database")
            mysqldump -R -E --triggers -u"${SQLLOGIN}" -p"${SQLPASS}" --all-databases > "${tempfile}"
            ;;
        "")
            InfoDialog "Backup has been canceled"
            exit
            ;;
        *)
            mysqldump -R -E --triggers -u"${SQLLOGIN}" -p"${SQLPASS}" ${DBase} > "${tempfile}"
            ;;
    esac
    
cp "${tempfile}" "${DST}${1}-${DATE}.sql"
    # компрессия gzip, отключено за ненадобностью — распаковывать неудобно
    echo tar -c --gzip -f "${2}${DATE}.dump" "${tempfile}"
    InfoDialog "OK -> ${2}${DATE}.dump"
}

# выбор базы данных из списка существующих на сервере
ChooseDatabase() {
    # получаем листинг баз
    DBases=` echo "SHOW DATABASES" | mysql -u"${SQLLOGIN}" -p"${SQLPASS}" `
    # хитро обеспечиваем опцию All_Database
    List="All_${DBases}"
    # выводим диалог выбора базы из списка
    $DIALOG  --title "Please choose a Database " --tree "FS" "List of existing databases" 14 78 7 ${List} 2> ${tempfile}

    case $? in
    0)
        # выбор сделан
        DBase=`cat ${tempfile}`
        BackupMySQL ${DBase}
        ;;
    1|255)
        # диалог прерван (ескейп например)
        InfoDialog "Backup has been canceled"
        exit
        ;;
    esac
}

# выбор папки с сайтом (реализованвыбор нужного  из денвероподобной структуры папок с сайтами)
ChooseDomain() {
    Paths=`ls ${1}`
    List=""
    isEmpty=true
    
for dName in ${Paths}
    do
        # выводим только папки внутри которых есть корен сайта или поддомен www (структура реализована совсем как в денвере)
        if [ -d "${1}${dName}/www" ] || [ -d "${1}${dName}/htdocs" ]then
            
List="${List} ${dName}"
            isEmpty=false
        
fi
    done


    # таким образом проверяем что выбран корень сайта и пора всетаки паковать его, иначе выводим список подпапок
    if ${isEmpty}then
        
Count=`echo ${SRC} | wc -c | tr -d ' '`
        DSRC=`echo ${1} | awk "{ print substr($ 1, ${Count}) }"`
        return 0;
    fi

    # собстно вывод список папок внутри выбранной
    $DIALOG  --title "Please choose a path " --tree "FS" "List of existing domains" 14 78 7 ${List} 2> ${tempfile}

    case $? in
    0)
        DName=`cat ${tempfile}`
        ChooseDomain "${1}${DName}/"
        ;;
    1|255)
        InfoDialog "Backup has been canceled"
        exit
        ;;
    esac

}

ProcessBackup() {
    case $1 in
        Site)
             ChooseDomain ${SITE}
             BackupFiles "${SRC}${DSRC}" "${DST}${DSRC}"
            ;;
        MySQL)
            ChooseDatabase
            ;;
        *)
            ;;
    esac
}

TypeDialog() {
    ${DIALOG} --title "Choose backup type:" --menu "This is backup types" 12 50 4 \
                                            "Site" "backup web-site" \
                                            "MySQL" "Mysql database" 2> ${tempfile}

    case $? in
    0)
        ProcessBackup `cat ${tempfile}`
        TypeDialog
        ;;
    1|255)
        InfoDialog "Backup has been canceled"
        exit
        ;;
    esac

}

TypeDialog

 



Выглядит это вот так:
Основное меню
Выбор сайта для бэкпап
Выбор базы для бэкапа
База успечно сдампилась


Вот и все. Теперь при работе скрипта можно любоваться интерактивными «окошечками». Таким же образом легко реализовать выполнение любых консольных команд, а сочетая это с запуском putty из командной строки с авторизацией по ключу, можно дать красивый консольный интерфейс для, например, рестарта апачи на дев-сервере(конечно через sudo с жесткими ограничениями), всем разработчикам в команде, даже незнакомым с *nix системами.
Уверен, кому-то изложенные знания пригодятся для того чтобы сделать консоль своего сервера «более User Friendly».

P.S. В процессе написания наткнулся на хорошие примеры http://www.oszone.net/2833/, кое-что оттуда сразу внедрил.

(c)

Далее

Open ftp:// links with nautilus

09:31

You can change the associations in gconf-editor. Expand desktop -> gnome -> url-handlers and find the entry for FTP and change the command to your preferences.

(c)

How To настроки репликации в MySQL с помощью шифрования SSL на Debian Lenny

23:39

Это руководство описывает, как настроить репликацию базы данных в MySQL с использованием SSL соединение для шифрования.
MySQL репликация синхронизирует базу данных, что позволяет иметь точную копию БД на другом сервере. Все обновления БД на главном сервере автоматически реплицируются на другой сервер, что позволяет защитить базу от аппаратных сбоев. В этой статье будет показано, как реализовать репликации БД exampledb с сервера server1.example.com(ip адресом 192.168.0.100) на сервер server2.example.com(ip адресом 192.168.0.101) с использованием SSL соединения


Оба сервера работают на Debian Lenny но конфигурация может применяться практически на всех дистрибутивах без изменений. БД exampledb с таблицами и данными уже существующих только на главном. Все команды выполняются с привилегиями пользователя root.
Если на обоих серверах не установлен сервер MySQL то приступим к инсталляции, выполнив на главном и на вторичном сервере команду:

aptitude install mysql-server mysql-client


Вам будет предложено ввести пароль root для MySQL, как на главном так и на вторичном сервере.
Теперь проверим поддержку соединения по протоколу SSL с MySQL. Давайте войдем в MySQL и введем команду в командной строке MySQL:

mysql -u root -p

mysql> show variables like '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_key       |          |
+---------------+----------+
7 rows in set (0.00 sec)

mysql>quit;


Если вывод выглядит следующим образом то это означает что MySQL был скомпилирован с поддежкой SSL, но в у нас как видно из таблици have_openssl DISABLED и have_ssl DISABLED не активен.

Что бы включить поддержку SSL нужно отредактировать файл my.cnf который расположен в /etc/mysql/

vi /etc/mysql/my.cnf


Найдите строки * Security Features и добавьте строку ssl

[...]
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
ssl
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
[...]


Перезапустим MySQL:

/etc/init.d/mysql restart


и проверим активена ли поддержка ssl

mysql -u root -p

show variables like '%ssl%';

mysql> show variables like '%ssl%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES   |
| have_ssl      | YES   |
| ssl_ca        |       |
| ssl_capath    |       |
| ssl_cert      |       |
| ssl_cipher    |       |
| ssl_key       |       |
+---------------+-------+
7 rows in set (0.00 sec)

mysql>quit;


Вывод показывает что ssl включен.
Далее настроить MySQL для прослушивался на всех интерфейсах, закоментировав строчку bind-address = 127.0.0.1 в /etc/mysql/my.cnf:
server1:

vi /etc/mysql/my.cnf

[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
[...]


рестар MySQL:

/etc/init.d/mysql restart


Теперь посмотрим что висит у нас на портах:

netstat -tap | grep mysql

server1:~# netstat -tap | grep mysql
tcp        0      0 *:mysql                 *:*                     LISTEN      3771/mysqld
server1:~#


Видимо что MySQL транслируется на всех интерфейсах.
Теперь нам необходимо создать CA, серверов и клиентских сертификатов, для SSL соединений. Я создаю их обычно в каталоге /etc/mysql/newcerts
Создадим каталог newcerts:

mkdir /etc/mysql/newcerts && cd /etc/mysql/newcerts


Убедимся что OpenSSL унас установлен:

aptitude install openssl


Создаем CA сертификат:

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem


Далее создаем сертификат для сервера…:

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem


и для клиента:

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem


Вывод должен выглядеть следующим образом:

ls -l
server1:/etc/mysql/newcerts# ls -l
total 32
-rw-r--r-- 1 root root 1346 2010-08-18 20:13 ca-cert.pem
-rw-r--r-- 1 root root 1675 2010-08-18 20:13 ca-key.pem
-rw-r--r-- 1 root root 1099 2010-08-18 20:14 client-cert.pem
-rw-r--r-- 1 root root 1675 2010-08-18 20:14 client-key.pem
-rw-r--r-- 1 root root 956 2010-08-18 20:14 client-req.pem
-rw-r--r-- 1 root root 1099 2010-08-18 20:14 server-cert.pem
-rw-r--r-- 1 root root 1679 2010-08-18 20:14 server-key.pem
-rw-r--r-- 1 root root 956 2010-08-18 20:14 server-req.pem
server1:/etc/mysql/newcerts#


Теперь мы должны передать сертификаты ca-cert.pem, client-cert.pem и client-key.pem на второй сервер. Создадим директорию на втором сервере:
server2:

mkdir /etc/mysql/newcerts


Вернемся на server1 и передадим сертификаты следующим образом:
server1:

scp /etc/mysql/newcerts/ca-cert.pem root@192.168.0.101:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-cert.pem root@192.168.0.101:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-key.pem root@192.168.0.101:/etc/mysql/newcerts


Далее откроем на server1 /etc/mysql/my.cnf и внесем изменения в область * Security Features раскоментировав строки ssl-ca, ssl-cert и ssl-key:

vi /etc/mysql/my.cnf

[...]
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/server-cert.pem
ssl-key=/etc/mysql/newcerts/server-key.pem
[...]


Перезапустим MySQL:

/etc/init.d/mysql restart


Теперь мы создадим slave_user пользователя репликации, который будет использоваться на server2, для доступа к базе данных на server1

mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password' REQUIRE SSL;


Сторока REQUIRE SSL не является обязательной, если Вы оставите ее, slave_user будет разрешено подключатся через зашифрованное и не зашифрованное соединение. При использовании SSL разрешено будет только зашифрованное соединение.

(Если пользователь репликации уже создан и нужно указать только SSL соединение то нужно изменить пользователя следующим образом:

GRANT USAGE ON *.* TO 'slave_user'@'%' REQUIRE SSL;


)

FLUSH PRIVILEGES;
quit;


Кроме того мы должны MySQL указать где хранить наши логи для репликации, а также укащать какой сервер является главным а какой репликационным:

vi /etc/mysql/my.cnf

[...]
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
binlog_do_db            = exampledb
[...]


Рестарт MySQL

/etc/init.d/mysql restart


Далее нам нужно провести несколько операций:
1. Заблокировать базу exampledb на server1
2. Узнать master status server1
3. Создать дамп SQL exampledb (для импорта на server2)
4. Разблокировать нашу базу

mysql -u root -p
USE exampledb;
FLUSH TABLES WITH READ LOCK;

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |       98 | exampledb    |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql>


Теперь не выходя из консоли mysql(т.к. блокировка бд будет удалена) мы сделаем бекап и перенесем его на server2
server1:

cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql root@192.168.0.101:/tmp


После проделаной операции можно смело разблокировать нашу БД
server1:

UNLOCK TABLES;
quit;


На этом настройка server1 завершена. Приступим к настройке server2 открыв конфиг мускуля:
server2:

vi /etc/mysql/my.cnf


убедимся что у нас есть следующие настройки строки(если их нет то добавим):

[...]
server-id=2
master-connect-retry=60
replicate-do-db=exampledb
[...]


Значение server-id=2 уникальное и оно должно отличатся от значения которое на server1

Перезапустим MySQL:

/etc/init.d/mysql restart


Прежде чем начать настройку репликации создадим пустую БД:

mysql -u root -p

CREATE DATABASE exampledb;
quit;


Теперь можно импортировать на server2 дамп базы snapshot.sql

/usr/bin/mysqladmin --user=root --password=yourrootsqlpassword stop-slave
cd /tmp
mysql -u root -pyourrootsqlpassword exampledb < snapshot.sql


Заходим в MySQL и выполним команду, что бы server2 был вторичным сервером, а server1 определялся как первычный сервер:

mysql -u root -p CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98, MASTER_SSL=1, MASTER_SSL_CA = '/etc/mysql/newcerts/ca-cert.pem', MASTER_SSL_CERT = '/etc/mysql/newcerts/client-cert.pem', MASTER_SSL_KEY = '/etc/mysql/newcerts/client-key.pem';


* MASTER_HOST — ip адрес или имя хоста в нашем случае это ip
* MASTER_USER — пользователь репликации для первичного сервера
* MASTER_PASSWORD — Пароль пользователя
* MASTER_LOG_FILE — Значение Лог файла на server1 которое мы узнали выполним команду SHOW MASTER STATUS;
* MASTER_LOG_POS — Значение полученное при выполнении команды SHOW MASTER STATUS;
* MASTER_SSL — Создает соединение главного и вторичного сервера с использованием SSL
* MASTER_SSL_CA — Путь к сертификату CA (server2)
* MASTER_SSL_CERT — Путь к сертификату client-cert.pem (server2)
* MASTER_SSL_KEY — Путь к сертификату client-key.pem (server2)

И наконец

START SLAVE;


Теперь проверим статус server2

SHOW SLAVE STATUS \G

mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.0.100
                Master_User: slave_user
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000001
        Read_Master_Log_Pos: 98
             Relay_Log_File: mysqld-relay-bin.000002
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: exampledb
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 98
            Relay_Log_Space: 235
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: Yes
         Master_SSL_CA_File: /etc/mysql/newcerts/ca-cert.pem
         Master_SSL_CA_Path:
            Master_SSL_Cert: /etc/mysql/newcerts/client-cert.pem
          Master_SSL_Cipher:
             Master_SSL_Key: /etc/mysql/newcerts/client-key.pem
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)

mysql>


После этого можно выйти с MySQL:

quit;


Вот и все, настройка серверов закончена. Если Вы сделали все верно то репликация настроена правильно и работоспособна.

Большое спасибо за внимание!
P.S. Если вы нашли очепятку или не правильно сформулированное предложение сообщите пожалуйста в ЛС.

(c)

Далее

Setting the Background on Nautilus Special Places' Headers

10:37

To change the background color of the special headers in Search and CD-Creator put something like the following in your gtkrc:  

style "extra-view-widgets"
{
# Fx. The special header in Nautilus Search and CD Creator
bg[NORMAL] = "#CD6127"
}

widget "*.nautilus-extra-view-widget" style:highest "extra-view-widgets"

(c)

PlayDeb Beta 2

10:23

PlayDeb beta 2

Ubuntu gaming made easy

Ubuntu 10.04. Внешний вид notification-area, как indicators

00:01

 

После установки Ubuntu 10.04 во внешнем оформлении мне не понравилось в первую очередь то, что апплет notofication-area, в просторечье «трей», выглядит совсем не как индикаторы в плане расстояния между иконками. Может, для кого-то это и кажется мелочью, а мне это коробит восприятие. Немного покопавшись в коде я добился внешнего вида, как на приложенном скриншоте.
image

Ниже я расскажу, как это сделать.

Что бы получить такой эффект, надо сделать следующие действия:

1. Подключаем репозитарии исходных кодов. Система->Администрирование->Источники приложений->Исходный код.
2. В консоли переходим в подходящую директорию (cd /usr/src) и набираем команду:

sudo apt-get update && sudo apt-get build-dep gnome-panel && sudo apt-get source gnome-panel && cd gnome-panel-2.30.0


3. Теперь надо поправить исходный код. Набираем:

sudo vim applets/notification_area/na-tray.c 


4. В строке 35 видим

#define ICON_SPACING 1

Замените 1 на нужно число. У меня 10.
5. Собираем и устанавливаем пакет.

sudo dpkg-buildpackage



Теперь можно перезайти в систему, или удалить апплет и заново добавить, что бы получить изменения.

(c)

Далее

Скрипт для бэкапа tar`ом

10:02

#!/bin/bash
cd /backups
sudo tar cvpzf backup_`date +%Y.%m.%d_%H_%M`.tar.gz /
find . -mtime +10 -exec rm {} \;


как-то так Smiley

(c)