Разные, на мой взгляд, интересные замечания, связанные с компьютерами в частности и техникой вообще.

вторник, 17 ноября 2009 г.

Запись устанавливаемых зависимостей для пакета в Debian.

Часто приходится ставить софт "на посмотреть". Т.е. поставил, один-два раза запустил и удалил. Вроде бы ничего страшного - apt-get наш спаситель, но нередко бывает, что пакет при установке притягивает за собой толпы библиотек по зависимостям, и при удалении этого пакета все библиотеки остаются в системе. Часть из них, конечно, можно вычистить с помощью apt-get autoremove, но большая часть всё-таки остаётся. Я обычно в таких случаях записывал себе куда-нибудь список пакетов, устанавливаемых с нужным мне софтом и потом сносил его руками. Вот, решил этот процесс немного автоматизировать скриптом. Ничего особенного, просто небольшая экономия времени.

#!/bin/bash
#

INST_BASE=/var/cache/apt/Inst
INST_PROG=/usr/bin/apt-get

# Функция вывода ошибки в случае использования неправильных аргументов
f_argerror() {
    echo "depends_store.sh: Пропущен операнд."
    echo "Попробуйте \"depends_store.sh -h\" для получения более подробного описания."
}

# Функция записи данныхх о зависимостях с проверкой на наличие этих данных.
# Если данные имеются, вызывается функция их вывода.
f_install() {
  if [ -e ${INST_BASE}/${OPTARG} ]
  then
    echo "Данные о зависимостях для данного пакета уже присутсвуют."
    f_show
    exit 0
  fi
  ${INST_PROG} -s install ${OPTARG} | grep Inst | cut -d ' ' -f 2 > ${INST_BASE}/${OPTARG}
  echo `cat ${INST_BASE}/${OPTARG}`
}

# Функция удаления данных о зависимостях.
f_remove() {
  rm ${INST_BASE}/${OPTARG}
}

# Функция вывода данных о зависимостях.
f_show() {
  echo `cat ${INST_BASE}/${OPTARG}`
}

# Функция вывода списка пакетов, для которых есть записи о зависимостях.
f_list() {
  echo `ls ${INST_BASE}`
}

# Функция вывода справки.
f_help() {
echo "Использование: depends_store.sh КЛЮЧ [ПАКЕТ]"
echo "  -i ПАКЕТ      записать данные о зависимостях для пакета"
echo "  -r ПАКЕТ      удалить данные о зависимостях для пакета"
echo "  -s ПАКЕТ      показать данные о зависимостях для пакета"
echo "  -l              вывести список пакетов, для которых записаны данные о зависимостях"
echo "  -h              показать эту справку и выйти"
}

# Проверка на наличие аргументов коммандной строки.
if [ $# -eq "0" ]
then
  f_argerror
fi

# Проверка на наличие директории для хранения данных о пакетах и создание таковой в случае отсутсвия.
if [ ! -e ${INST_BASE} ]
then
  mkdir -p ${INST_BASE}
fi

# Перебор параметров командной строки.
getopts ":i:r:s:lh" Option
case $Option in
  i)
    f_install
  ;;
  r)
    f_remove
  ;;
  s)
    f_show
  ;;
  l)
    f_list
  ;;
  h)
    f_help
  ;;
  *)
    f_argerror
  ;;
esac

exit 0


Скрипт до безобразия простой, так что всё должно быть понятно из комментариев. :) Получился такой себе небольшой костыль над apt-get.
Работать с ним просто.
Нашли нужный пакетик, сказали на него ./depends_store.sh -i и всё запомнилось в базе. Поработали с пакетом, сделали apt-get purge `./depends_store.sh -s имя_пакета` && ./depends_store.sh -r имя_пакета и забыли о нём.

воскресенье, 27 сентября 2009 г.

На заметку. Грабли обновления курьера.

После обновления из портов courier-authdaemon во FreeBSD, всегда сбиваются права на файл
/var/run/authdaemond.
Если postfix настроен на авторизацию через курьеровский authdaemon, после обновления он ругнётся вот так:
postfix: warning: SASL authentication failure: cannot connect to Courier authdaemond: Permission denied
Надо Просто дать исполнение на этот файл.
chmod o+x /var/run/authdaemond
Третий раз уже на эти грабли наступаю.

четверг, 17 сентября 2009 г.

Мой vimrc

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

 1 " Подсветка синтаксиса
 2 syntax on
 3
 4 " Отключить режим совместимости с Vi
 5 set nocompatible
 6
 7 " Включить нормальную работу Backspace
 8 set backspace=indent,eol,start
 9
10 " История команд - 50
11 set history=50
12
13 " Вставка новой строки Enter'ом без перехода в режим вставки.
14
15 map <CR> o<Esc>
16
17 " Автоопределение файлов
18 filetype plugin on
19 filetype indent on
20
21 " Всегда показывать положение курсора
22 set ruler
23
24 " Показывать текущую команду
25 set showcmd
26
27 " Показывать режим работы
28 set showmode
29
30 " Поиск в реалтайме
31 set incsearch
32
33 " Хоткей Ctrl+n включает нумерацию строк, а Ctrl+b отключает.
34 map <C-n> <Esc>:set number<CR>
35 map <C-b> <Esc>:set nonumber<CR>
36
37 " Быстрое сохранение на <F2> во всех режимах
38 imap <F2> <Esc>:w<CR>
39 map <F2> <Esc>:w<CR>
40
41 " Выход без сохранения на <F10> во всех режимах
42 imap <F10> <Esc>:q!<CR>
44 map <F10> <Esc>:q!<CR>
45 " Вставка из буфера мыши
46 map <S-Insert> <Middlemouse>
47
48 " При вводе открывающей фигурной скобки автоматом вводится и закрывающая.
49
50 inoremap { {<CR>}<Esc>O
51
52 " При вводе закрывающей скобки подсвечивает открывающую
53 set showmatch
54
55 " Выключить любые звонки-мигалки
56 set novisualbell
57 set t_vb=
58 " Удаление от текущей позиции до конца строки по Ctrl+e
59 map <C-e> <Esc>d$

воскресенье, 12 июля 2009 г.

Lynksys, dd-wrt, vpn и локальные маршруты.

Есть некая локальная сеть. Довольно крупная, поэтому адреса локальных ресурсов занимают довольно большое количество подсетей. А выход в интернет осуществляется через vpn-подключение. И понадобился способ выпустить локальную сеть(офиса, или несколько домашних компов - неважно) в инет, при этом, чтобы локальные ресурсы были доступны напрямую, а не по vpn-каналу.
Конечно, это проще простого решается с помощью роутера с Linux, но каждому желающему такой роутер не поставишь. Вот и вспомнилась мне железка, с которой в своё время уже приходилось работать - Linksys WRT54-GL и свободная прошивка dd-wrt.

Что нам понадобится.
1. Сам Linksys WRT54-GL.
2. Список локальных сетей(в моём случае, его можно взять с сайтов местных провайдеров).
3. Прошивки dd-wrt последней версии(на момент написания этой заметки - 24) mini и standart. Всегда можно взять с официального сайта dd-wrt.
4. Немного времени.

Настройка:
1. Прошивка устройства.
В этот раз почему-то lynksys не захотел прошиваться сразу. Упорно был сбой при попытки запихнуть в него standart-версию. Решается просто. Сперва вшивается mini, а потом standart.
2. Настройка сети.
На вкладке Basic Setup для wan-интерфейса выставляем режим Static IP. Там прописывается ip-адрес, выдаваемый Вам провайдером и маску подсети. Шлюз не ставить!
Для Router IP, выставляем адрес и маску сети, по которому Linksys будет доступен в домашней локалке. И снова шлюз не ставить. Тут же надо указать dns-сервер, выданный провом.
Далее, по желанию. Я лично настроил раздачу адресов по локалке с помощью dhcp. Здесь всё.
Теперь решаем проблему, на которой затыкается большинство, судя по гуглу. Шлюз провайдера и vpn-сервер находятся в разных подсетях. Если указать default gateway, то vpn потом не будет работать. Если же его не указывать, то он и не подключиться. Но что мешает прописать отдельный маршрут к vpn-серверу через шлюз? Итак, идём на вкладку Setup -> Advanced Routing и добавляем нужный маршрут.
3. Настройка vpn.
Вкладка Services -> PPTP.
Ставим enable для PPTP Client, где и прописываем адрес vpn-сервера, логин и пароль. Если нужно, то опции шифрования.
4. Добавление маршрутов.
Последний штрих. Добавляем маршруты локальной сети.
Вкладка Administration -> Commands.
Все маршруты вписываем в поле commands в виде:
ip route add xx.xx.xx.xx/xx via yy.yy.yy.yy
Думаю, ясно, что это. Одно уточнение. Маска должна быть указана именно в виде битов, а не привычным для многих квартетным форматом - Linksys его не понимает.

Всё готово. Единственный ньюанс - внесение изменений в случае смены маршрутов в локалке. На роутере с linux у меня это решено простым скриптом, который по крону скачивает файл с маршрутами с сайта провайдера, и в соответсвии с ним вносит изменения в таблицу маршрутов. Вот, следующим шагом, думаю запихать этот скрипт в linksys(придётся немного переделать, потому как dd-wrt это всё-таки не полноценный linux).

понедельник, 1 июня 2009 г.

ssh-доступ в chroot для FreeBSD.

Есть у меня тут один web-сервер. Крутится на FreeBSD. И понадобилось организовать ssh-достп для программистов, чтобы они могли работать с разрабатываемыми сайтами напрямую. Но при этом было жёсткое условие - кроме своей рабочей директории программисты не должны видеть ничего, находящегося в системе.
Гугл штука хорошая, много рассказал, но там были всякие решения типа установки патченных версий sshd на другом порту или ограниченного доступа по sftp. Ограниченного доступа слишком мало, а патчить и плодить на сервере нестандартные вещи я не люблю.
В конце концов было выработано такое решение.
1. Создаём дерево chroot.
# mkdir /usr/chroot/
# mkdir /usr/chroot/bin
# mkdir /usr/chroot/dev
# mkdir /usr/chroot/etc
# mkdir /usr/chroot/home
# mkdir /usr/chroot/lib
# mkdir /usr/chroot/libexec
# mkdir /usr/chroot/sbin
# mkdir /usr/chroot/tmp
# mkdir /usr/chroot/usr
# mkdir /usr/chroot/var
# mkdir /usr/chroot/var/run
2. Копируем нужные команды и библиотеки.
У меня для /usr/chroot/bin - это: bash cat cp id ls mc mkdir mv rm scp sh svn
И для /usr/chroot/sbin - ldconfig
Список команд полностью зависит от ваших потребностей.
Теперь надо положить туда все библиотеки, необходимые для работы этих команд. Сразу же небольшое уточнение. Так как список команд и библиотек относительно небольшой, я не стал заморачиваться с фряшной системой расположения их по дереву(/usr/local/bin), а сложил всё в корне.
Для того, чтобы определить, какие библиотеки нам нужны, воспользуемся утилитой ldd. Для удобства, я это делал так:
# ldd /usr/local/bin/bash | grep -v \/usr\/local\/bin\/bash | cut -f 2 -d \> | cut -f 1 -d \(
/lib/libncurses.so.7
/usr/local/lib/libintl.so.8
/usr/local/lib/libiconv.so.3
/lib/libc.so.7
Это список необходимого для bash. Для остального по аналогии. Все эти библиотеки копируем в /usr/chroot/lib
Кроме этого, надо добавить симлинки типа libintl.so -> libintl.so.8
# ln -s libintl.so.8 linintl.so
И скопировать дополнительные *.a и *.la файлы. Подробнее надо смотреть для каждой отдельной библиотеки. В итоге мы должны получить что-то такое:
# ls /usr/chroot/lib/ | grep intl
libintl.a
libintl.la
libintl.so
libintl.so.8
Разумеется, так надо сделать для каждой необходимой библиотеки.
Ну и разумеется нужно скопировать основную фряшную утилиту, отвечающую за подгрузку библиотек:
# cp /libexec/ld-elf.so.1 /usr/chroot/libexec/ld-elf.so.1
3. Дополнительный компоненты для работы утилит.
Одних библиотек мало. У примеру, тому же mc надо ещё кучу всего. Тут, к сожалению, невозможно как-то заранее предсказать, что именно понадобится. В каждом отдельном случае надо читать документацию на программу и гуглить, если выдаёт ошибки. Для mc надо дополнительно скопировать полностью директории /usr/share/misc/ и /usr/local/share/mc/ в соответствующие места в chroot'е.
Так же для него понадобятся файлы termcap и shells в /usr/chroot/etc
В /usr/chroot/tmp надо будет создать директорию mc-root
4. Теперь подгатавливаем пользователя.
# adduser
Создаём обычного пользователя, только в качестве shell'a указываем ему путь к вот такому скрипту:
#!/usr/local/bin/bash
#
/usr/local/bin/sudo /usr/sbin/chroot /usr/chroot /bin/bash
Скрипту даём права на исполнение. Если не установлен пакет sudo, ставим и в /usr/local/etc/sudoers(можно воспользоваться командой visudo, если vim не страшен) добавляем строку имя_нашего_пользователя ALL=(ALL) NOPASSWD: /usr/sbin/chroot. Если править этот файл руками, надо не забыть после правки убрать права на запись, потому как sudo будет ругаться.
Командой passwd задаём для него пароль.
5. Монтируем устройства.
# mount -t devfs devfs /usr/chroot/dev
Готово.
Теперь логнинясь по ssh этим пользователем, человек попадает в chroot, из которого выхода нет.
Но этот голый chroot мне не нужен. Мне нужен доступ к определённым проектам. Я сделал так:
Отмонтировал devfs. Далее:
# cd /usr/chroot
# tar -cjvf /usr/backups/chroot.tar.bz2 ./
# cd /path/to/www_project
# tar -xjvf /usr/backups/chroot.tar.bz2
# mount -t devfs devfs /path/to/www_project/dev
И последнимс штрихом создание нового файла chroot.sh для конкретного пользователя с новым путём вместо /usr/chroot.
Теперь программер имеет доступ по ssh к сайту и не больше.
Решение пока сырое. Работаю над автоматизацией создания всего этого, плюс над созданием общего для всех chroot.sh, берущего конечную директорию из конфига(собственно, сделать это просто, но руки не доходят - много работы).

четверг, 14 мая 2009 г.

Замена содержимого в файлах по шаблону

Замена во всех файлах в поддиректориях одного слова на другое.
find ./ -type f | xargs perl -pi -e 's/oneword/anotherword/g'

среда, 29 апреля 2009 г.

Debian GNU/Linux 5.0 Lenny и Eee PC 701 4G

Как можно понять из заглавия, не хватило у меня терпения на Xandros. Очень уж много там надо убирать лишнего и ставить своего. Конечно, не поспоришь, разработчики постарались на славу: для обычного неподготовленного пользователя Eee PC с Linux в стандартной настройке - это очень и очень удобно. Всё просто и понятно - ничего лишнего. Напоминает даже не ноутбук(путь и маленький), а какой-то большой КПК с его менюшками, стандартными кнопочками и т.д. Но если начать копать глубже, менять что-то, то нарываешься на множество раздражающих вещей. То сделать нельзя, это не получится, сюда смотреть не желательно, туда вообще не надо и т.д. Кеды, которые я туда поставил, быстро надоели. Да и подглючивали немного. Снести половину софта пакетный менеджер не дал, ругнувшись на зависимости(или предлагал снести слишком много). Последнее, что меня добило - это в режиме "Полноценного рабочего стола"(читай KDE) при загрузке нетбук не спрашивает логина с паролем. Нужно переключаться в стандартный режим. И, да. Добавлять других пользователей помимо стандартного бесполезно. Залогиниться не получится. Автоматом идёт загрузка в стандартного пользователя. В принципе, я нашёл, кто отвечает за такую загрузку, где идёт управление пользователями, но исправлять это и приводить систему в нормальный вид мне было уже неохота. Зачем, если можно поставить нормальную систему, которая 100% хорошо работает.
Отсюда берём образ инсталятора. Заливаем его на флешку:
dd if=debian-eeepc.img of=/dev/sda

И грузимся с флешки(при старте нетбука надо нажимать Esc, чтобы выбрать загрузочное устройство).
Далее идёт обычная всем знакомая установка Debian из сети. К слову, wi-fi-карточка определилась сразу и даже замечательно подхватила ключ шифрования. А так же без проблем прописались настройки прокси-сервера с авторизацией. В этот раз я впервые в жизни выбрал reiserfs и пункт "Окружение рабочего стола"(а так же выбрал пункт "Для ноутбуков"). Всё прошло замечательно.
Теперь на моём нетбуке Debian. Скинув туда бекапы моих отточенных временем конфигов, я получил привычную рабочую систему. При этом не пришлось настраивать ничего. С питанием работает нормально, заряд батареи показывает адекватно. Жаловаться нечего.
Единственное, что я ещё не проверял - web-камеру. По-моему не определилась. Но точно не знаю.
Вот man по установке(дублировать здесь не вижу смысла).

Updated: web-камера работает. Надо было просто включить её в /sys.
echo 1 > /sys/devices/platform/eeepc/camera

вторник, 28 апреля 2009 г.

Рекурсивное удаление файлов

рекурсивное удаление всех файлов в директории и её поддиректориях:
find ./ -type f -delete

Скрипт работы с cd/dvd-дисками в консоли.

Вот, роясь на просторах винта, откопал старый скрипт для записи/очистки и т.д. дисков в консоли. Писал во времена, когда не признавал почти никаких GUI-приложений.


#!/bin/bash
#
TMPFILE=/home/cppmm/wtmp/cdrom.iso

# Определение действия.

case $1 in
wr)
FUNC="f_write"
;;
cp)
FUNC="f_copy"
;;
cl)
FUNC="f_clear"
;;
ch)
FUNC="f_check"
;;
wi)
FUNC="f_write_iso"
;;
help)
FUNC="f_help"
;;
*)
FUNC="f_help"
;;
esac
shift

# Определение параметров.
until [ -z $1 ]
do
if [ "$1" = "-d" ]
then
DIR="$2"
shift
fi
if [ "$1" = "-s" ]
then
SPEED="$2"
shift
fi
if [ "$1" = "-o" ]
then
ODISK="$2"
shift
fi
if [ "$1" = "-i" ]
then
IDISK="$2"
shift
fi
if [ "$1" = "-f" ]
then
ISO="$2"
shift
fi
shift
done

# Функйия проверки наличия переменных и оповещения.
f_var_check() {
case "$1" in
v_help)
echo "Для справки: cd.sh help"
exit 0
;;
v_dir)
if [ -z "$DIR" ]
then
echo "Нужно указать директорию, подготовленную для записи."
f_var_check v_help
fi
;;
v_odisk)
if [ -z "$ODISK" ]
then
echo "Нужно указать устройство, производящее запись."
f_var_check v_help
fi
;;
v_idisk)
if [ -z "$IDISK" ]
then
echo "Нужно указать устройство, с которого производится копирование."
f_var_check v_help
fi
;;
v_speed)
if [ -z "$SPEED" ]
then
SPEED="4"
echo "Скорость записи не установленна. По-умолчанию 4"
echo "Продолжить? [Y/n]: "
read ANSWER
case $ANSWER in
[nN])
f_var_check v_help
;;
*)
;;
esac
fi
;;
v_eject)
eject -r /dev/${ODISK}
echo "Вставьте записываемый диск и нажмите Enter."
read ready
eject -t /dev/${ODISK}
;;
v_iso)
if [ -z "$ISO" ]
then
echo "Укажите файл образа."
f_var_check v_help
fi
;;
esac
}

# Функция записи дирректории на диск.
f_write() {
f_var_check v_odisk
f_var_check v_dir
f_var_check v_speed
mkisofs -V "Disk" -l -J -R -v -o ${TMPFILE} ${DIR}
f_var_check v_eject
cdrecord -v -dev=/dev/${ODISK} -speed=${SPEED} ${TMPFILE}
rm -f ${TMPFILE}
}

# Функция копирования диска.
f_copy() {
f_var_check v_odisk
f_var_check v_idisk
f_var_check v_speed
dd if=/dev/${IDISK} of=${TMPFILE} bs=2048
f_var_check v_eject
cdrecord -v -dev=/dev/${ODISK} -speed=${SPEED} ${TMPFILE}
rm -f ${TMPFILE}
}

# Функция очистки диска.
f_clear() {
f_var_check v_odisk
cdrecord dev=/dev/${ODISK} -blank=all
}

# Функция проверки размера будующего образа.
f_check() {
f_var_check v_dir
echo "Размерв байтах:"
expr `mkisofs -print-size -quiet $DIR` \* 2084

}

# Функция записи iso-образа.
f_write_iso() {
f_var_check v_odisk
f_var_check v_iso
f_var_check v_speed
cdrecord -v -dev=/dev/${ODISK} -speed=${SPEED} ${ISO}
}

# Функция помощи.
f_help() {
echo " Использование: cd.sh ДЕЙСТВИЕ ОПЦИИ"
echo " Действия:"
echo " wr запись директории на диск."
echo " cp копирование с диска на диск."
echo " cl очистка диска."
echo " ch проверка размера будущего образа диска из директории."
echo " wi запись на диск образа."
echo " Опции:"
echo " -d Директория, подготовленная для записи."
echo " -f Файл ISO."
echo " -i Исходный диск."
echo " -o Диск, подготовленный для записи."
echo " -s Скорость записи."
}

$FUNC

пятница, 24 апреля 2009 г.

Asus Eee Pc 701 4G

Ещё давно, прочитав на каком-то техническом сайте о том, что прогнозируется появления такой железки, мне почему-то сразу захотелось с ней поиграться. Тем более было анонсировано, что на борту устанавливается Linux. И вот, через несколько лет с того момента, я, наконец, приобрёл себе этот нетбук. Специально остановился на младшей модели из линейки, потому как характеристики железа тут всё-равно круче, чем у моего первого компа, а как плюс идёт более длительное время работы.

Итак, знакомство.

Первый взгляд снаружи.

В Томске найти поначалу не удавалось. Различные версии Eee PC встречал, но все они были старших моделей и все они были с виндой. Дошло то дого, что я, отчаявшись найти нетбук тут, начал искать его в online-магазинах. Затея с треском провалилась: во всех магазинах стояла пометка, нет на складе, а на письма с просьбой уточнить, можно ли заказать, либо вообще не было ответа, либо фраза "Нет и не будет". В конце концов я уже договорился с одним замечательным человеком из Москвы, знакомым по linux-форуму, что он там его купит и вышлет мне и буквально на следующий день увидел в одном из местных компьютерных магазинов желаемую машинку. Был даже выбор из разных моделей, но я всё-таки взял младшую. Единственный минус - цвет: первоначально хотел чёрный, но пришлось взять белый с розовой крышкой. :) Ну это, в принципе, не важно.

Первый взгляд изнутри.

Стандартный интерфейс напоминает больше какой-то КПК, а не полноценный ноутбук. Я перепробовал много разных оконных менеджеров, но тут сперва даже немного растерялся. Какие-то вкладки, какие-то кнопочки... Всё предельно просто и понятно, но неинтересно. Первый вопрос, который у меня возник - где же терминал? :) Гугл сказал, что он вызывается по Alt+Ctrl+T. Уже лучше. Так же играясь с настройками и бегая по менюшкам наткнулся на неработающую web-камеру. Оказалось, надо было в BIOS опцию "OS Installation" переключить в значение Finished. Так же удивил набор программ. В качестве проигрывателя аудиофайлов используется amarok(ага, т.е. там KDE), а мессенджера Pidgin(или всё-таки Gnome?). Остальной софт такой же раношёрстный, но, в принципе, приемлемый - полный комплект OpenOffice.org, Firefox в качестве браузера, набор каких-то простеньких игрушек и т.д. В общем, стандартная комплектация. И тут я нахоже первый момент, которыймне совершенно не понравился в стандартном интерфейсе - невозможность устанавливать свои программы. Так же нет привычного списка открытых окон(читай панели задач). Ну и вообще, как-то не привык я пользоваться чужими настройками. Хочу своё.


Копаем глубже.

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


Итак, на борту:

ОС: Xandros Linux специально допиленный для Eee PC.

WM: IceWM, с какой-то Asus'овской утилитой управления рабочим столом.

Первое, что удаётся найти - это возможность включить панель задач с кнопкой меню.

Копируем системный файл с настройками IceWM в домашнюю директорию и выставляем опцию TaskBarShowStartMenu в значение 1:

$ cat /etc/X11/icewm/preferences > /home/user/.icewm/preferences

Ребутаемся(или рестартим иксы, кому как удобнее) и радуемся работающей панельке.

Стало немного удобнее, но хотелось бы большего. В конце концов, поискав ещё немного в гугле, выясняется, что можно подключить нормальные человеческие репозитарии и поставить любой, нужный для работы софт. Так как Xandros основан на Debian, правим /etc/apt/sources.list(надо быть осторожным, потому что из всех, найденных мной в инете адресов репозитариев, половина не работала). Да, править надо с правами root'а. Это либо через sudo, либо, сделава sudo passwd и потом su.

Дальше, как обычно.

# apt-get update

# apt-get dist-upgrade

Вот тут и натыкаемся на первые грабли. Причём, судя по интернету не я первый. Видимо, из-за того, что пакетов много и все разные, получаем конфликт - keyboardmap-data не может установиться из-за мешающего ему пакета keyboardmap-data-ru-ru. Решилось удалением последнего спомощью apt-get remove и повторным запуском apt-get dist-upgrade.

В большинстве обзоров и статей предлагается в качестве стандартного DE использовать кеды. Я решил не выделяться пока и пошёл по проторенной дорожке:

# apt-get install advanced-desktop

Это мета-пакет с KDE и всем, что ему надо.

После установки, на вкладке настроек рабочего стола, выбираем пункт "Быстрое выключение" и там жмём на "Полноценный рабочий стол". После ребута мы видим KDE. :)

Ну а потом всё пошло совсем просто. Первым делом я удалил всё, что мне не нужно - игры, pidgin, amarok, половину OO.o, оставив только Writer и Calc и там ещё что-то по мелочи, полюбовался проделанной работой и установил набор, любимого мной софта: psi, xchat, audacious и т.д. Как практически в любом дистрибутиве понадобилось поставить кодеки. Через некоторое время у меня была полностью рабочая система, настроенная так, как мне нужно.

Итоги знакомства и первые впечатления.

Понравилось. После первого взгляда на xandros возникла идея сразу же его снести и поставить родной Debian. Пока что повременю. Да и к тому же надо разобраться с организацией файловой системы. Из-за некоторых особеннойстей работы с SSD-флешками(которая тут вместо винта) файловая система устроена несколько необычно - подробнее распишу, когда сам разберусь.

Батарейка, как и обещали, держит неплохо. Полноценного теста ещё не проводил, но, к примеру, 5-минутный клип на полном экране с максимальной яркостью и громкостью, работающим в фоне apt-get'ом, Firefox-ом, Psi и ещё парой терминалов, включённым wi-fi не отобрал у батареи ни одного процента заряда.

К слову о скорости работы и многозадачности - никаких тормозов. Ни у каждого так хорошо полноценные десктопы работают.

Остался только один минус, с которым пока не успел разобраться. При подключении флешек и SD-карт постоянно выскакивает противное окошко с предложением открыть флешку в файловом менеджере или ещё в чём-нибудь. Отвечает за это некий usbstorageapplet, который даже если убить его по kill -9 всё равно каким-то процессом воскрешается. Почему нельзя было сделать автомонтирование как у всех нормальных людей с помощью udev без привлечения лишних приблуд - не понимаю. Но скоро с этим разберусь. :)


Отдельно хочется отметить сайты:

eeeusers.org и eee-pc.ru

тут можно найти достаточно много грамотной документации.

пятница, 10 апреля 2009 г.

Монтирование образов жёстких дисков.

При работе с виртуальной машиной(qemu или VirtualBox) создаётся отдельный образ жёсткого диска со своей таблицей раздела и своими файловыми системами. Иногда нужно что-то быстро оттуда скопировать. Наладка сети между виртуальной машиной и хост-компом не всегда удобно, потому как если копировать надо много, занимает очень много времени. Расшаренные общие директории тоже не выход, так как для этого нужно устанавливать дополнительное ПО в хост-системе. Но выход есть.
Сперва надо переконвертировать образ диска в формат raw(как это сделать, надо смотреть в документации к используемой вирт-машине).
Далее подключаем образ к loop-устройству:
# losetup /dev/loop0 disk_image.raw

Разбиваем его на разделы:
# kpartx -av /dev/loop0

Проверяем, как всё прошло:
# ls -alF /dev/mapper
brw-rw—- 1 root disk 253, 4 2007-11-24 14:56 loop0p1
brw-rw—- 1 root disk 253, 5 2007-11-24 14:56 loop0p5

И, собственно, монтируем:
# mount /dev/mapper/loop0p1 /mnt/


Решение взято отсюда.

понедельник, 16 марта 2009 г.

Compiz в xfce4. Debian GNU/Linux 5.0 Lenny

После обновления с Etch сменилось ядро. Соответственно, отпали дрова на видеокарту(если они были установлены не из стандартного репозитария). И как следствие отпал compiz.
Лечение.
1. Ставим драйвера:
apt-get install nvidia-glx nvidia-kernel-2.6.26-1-686
Учитывайте, что ядро у вас может быть другое.
2. Обновляем компиз(на всякий случай ;):
apt-get --reinstall install compiz compiz-core
3. Прописываем автостарт:

$ cat ~/.config/autostart/compiz.desktop
[Desktop Entry]
Name=No Name
Encoding=UTF-8
Version=1.0
Exec=/usr/bin/compiz --replace --fast-filter
X-GNOME-Autostart-enabled=true
$ cat ~/.config/autostart/compiz_start.desktop
[Desktop Entry]
Encoding=UTF-8
Version=0.9.4
Type=Application
Name=compiz_start
Comment=Запуск декораций окон
Exec=/usr/bin/gtk-window-decorator --replace
StartupNotify=false
Terminal=false

Заметьте, что без второго файла работать толком не получится.
Вот, собственно и всё. Старая схема, работавшая в Etch теперь не поможет. Многие описания в гугле говорят, что всё делается проще с использованием файла /etc/xdg/xfce4-session/xfce4-session.rc, но у меня почему-то ни один wm стартовать оттуда не захотел.

четверг, 12 марта 2009 г.

Смена локали. Debian.

До недавнего времени использовал везде исключительно koi8-r. Но, всё течёт, всё изменяется. Решил перейти на utf-8.
Сама смена локали порблем не вызывает - dpkg-reconfigure locales и всё. С этим просто. Но дело в том, что имена всех файлов остаются в koi8-r. Тут пришлось немного поковыряться.
Первое, за что взялся - за колекцию музыки. Есть такая замечательная утилита EasyTag. Давно пользуюсь ей(все теги у меня уже давно в UTF). Она же умеет менять имена файлов в соответствии с тегами.
А вот для всех остальных файлов пришлось наваять маленький скриптик.
Для начала, копирую все файлы, которые надо переименовать в отдельную директорию. Далее, создаю временный файл с листингом этой директории:
ls -1 tmpdir/ > tmpfile
Этот файл надо слегка обработать. ls добавляет туда неотображаемые символы, которые в скрипте обрабатывать мне показалось сложновато. Я их просто убрал с помощью vim. В командном режиме:
%s/\e\[0m//g
Теперь собственно скрипт:

#!/bin/bash
#
STRN=$2

for((i=1;i<=$STRN;i++)) do
# Получаем каждое определённое имя файла в UTF по очереди.
UTFNAME=`cat tmpfile | iconv -f koi8-r -t utf-8 | tail -n ${i} | head -n 1`
# Получаем каждое отдельное текущее имя файла
KOI8NAME=`ls -1 ${1} | tail -n ${i} | head -n 1`
rename ${1}"${KOI8NAME}" new/"$UTFNAME"
done

Число STRN - количество файлов из листинга. Это число можно получить с помощью cat -n tmpfile. Директорию new создал руками. Всё. После отработки скрипта(в качестве первого аргумента даём ему tmpdir, а второго -количество файлов), в new будут лежать все наши файлики с именами в utf-8.

P.S. Перемещать файлы, предназначенные для переименования во временную директорию надо только с помощью cp! Никаких mc.

Update: В обсуждении этого способа на welinux.ru подсказали, что есть утилита convmv. Вердикт - гуглите, перед тем, как браться за что-то! :)

Update2: Оказывается всё ещё проще. В Debian есть пакет, специально предназначенный для смены локали на utf-8: utf8-migration-tool

вторник, 10 февраля 2009 г.

Мобильный интернет в Debian GNU/Linux.

Так уж получилось, что последнее время к "нормальному" интернету доступа нет. Поэтому приходится пользоваться мобильными технологиями(как-никак на дворе 21-ый век).
Итак, путь первый - выход через мобильный телефон.
У меня Sony Ericsson k320i. usb-шнурок шёл в комплекте. При подключении к компьютеру телефон спрашивает, в каком режиме ему работать: передача файлов или режим телефона. В данном случае выбираем второе. Перед подключением я запустил tail -f /var/log/messages и получил такие строки:
Feb 10 10:06:51 damned kernel: usb 2-3: new full speed USB device using ohci_hcd and address 3
Feb 10 10:06:51 damned kernel: usb 2-3: configuration #1 chosen from 1 choice
Feb 10 10:06:52 damned kernel: cdc_acm 2-3:1.1: ttyACM0: USB ACM device
Feb 10 10:06:52 damned kernel: cdc_acm 2-3:1.3: ttyACM1: USB ACM device
Feb 10 10:06:52 damned kernel: usbcore: registered new driver cdc_acm
Feb 10 10:06:52 damned kernel: drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters
Отсюда видно, что у меня появилось два новых устройства: /dev/ttyACM0 и /dev/ttyACM1. Дальше всё просто:
Создаём файлы настройки pppd(обязательно должен быть установлен пакет ppp).

# cat /etc/ppp/chap-secrets
mts * mts
# cat /etc/ppp/pap-secrets
mts * mts
# cat /etc/ppp/options | grep -v "#"
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
noipx
# cat /etc/ppp/peers/mts | grep -v "#"
user "mts"
connect "/usr/sbin/chat -v -f /etc/chatscripts/mts"
/dev/ttyACM0
noipdefault
usepeerdns
defaultroute
persist
noauth
# cat /etc/ppp/chat/mts
ABORT BUSY
ABORT 'NO CARRIER'
""
ATZ OK
AT+CGDCONT=1,"IP","internet.mts.ru" OK
ATDT*99***1#
CONNECT ""

Как видно, я использую mts. Основные параметры, типа номера дозвона, точки доступа, логина, пароля и т.д., можно узнать у мобильного оператора, так что с этим проблем быть не должно. Что касается того, что у меня продублированы логин с паролем и в chap, и в pap - это потому, что я так и не узнал, какой именно тип авторизации надо использовать, и для верности прописал оба. Хуже не будет. Ну и самое главное - это устройство модема, которое я узнал из messages.
В принципе, всё.
Подключение идёт командой pppd call mts. Я для удобства сделал скриптик:

#!/bin/bash
sudo /usr/sbin/pppd call mts

и добавил пользователя в /etc/sudoers, чтобы не логиниться под рутом каждый раз для выхода в инет.
Скорость, конечно, оставляет желать лучшего, но жить можно.
Но постоянно включать/выключать телефон со временем надоедат. Да и ко всему прочему денег много уходит, если пользоваться таким интернетом постоянно, а подключенный мной тариф "Ночной безлимитный" неудобен тем, что работать приходится только ночью. Поэтому было решено купить GPRS-модем.

Путь второй. ZTE MF626 USB Modem.

Тут всё чуть сложнее. Дело в том, что эта замечательная железка, сразу не определилась. В голове промелькнули мысли о пересборке ядра, но как всегда, гугл спас. Довольно быстро нашлась ссылка: http://ru.gentoo-wiki.com/wiki/MF626.
Беглый просмотр не обрадовал. Однако, после прочтения треда, из которого появилась эта статья, стало немного проще.
Сперва, запускаю, как обычно tail -f /var/log/messages и подключаю модем. Как и предсказано в статье, он определяется, как ZeroCD:
Feb 10 09:17:40 damned kernel: usb 1-1: new high speed USB device using ehci_hcd and address 5
Feb 10 09:17:40 damned kernel: usb 1-1: configuration #1 chosen from 1 choice
Feb 10 09:17:40 damned kernel: scsi6 : SCSI emulation for USB Mass Storage devices
Feb 10 09:17:45 damned kernel: Vendor: ZTE Model: USB SCSI CD-ROM Rev: 2.31
Feb 10 09:17:45 damned kernel: Type: CD-ROM ANSI SCSI revision: 00
Feb 10 09:17:45 damned kernel: sr1: scsi3-mmc drive: 0x/52x cd/rw xa/form2 cdda tray
Feb 10 09:17:45 damned kernel: sr 6:0:0:0: Attached scsi generic sg2 type 5

Если тут же заглянуть в dmesg, видно, что в устройствах он называется /dev/sr1 (на других машинах может быть иначе). Пробую eject /dev/sr1.
В messages вижу следующее:
Feb 10 09:19:57 damned kernel: usb 1-1: USB disconnect, address 5
Feb 10 09:20:02 damned kernel: usb 1-1: new high speed USB device using ehci_hcd and address 6
Feb 10 09:20:02 damned kernel: usb 1-1: configuration #1 chosen from 1 choice
Feb 10 09:20:02 damned kernel: scsi7 : SCSI emulation for USB Mass Storage devices
Feb 10 09:20:07 damned kernel: Vendor: ZTE Model: MMC Storage Rev: 2.31
Feb 10 09:20:07 damned kernel: Type: Direct-Access ANSI SCSI revision: 02
Feb 10 09:20:07 damned kernel: sd 7:0:0:0: Attached scsi removable disk sdb
Feb 10 09:20:07 damned kernel: sd 7:0:0:0: Attached scsi generic sg2 type 0

Т.е. выходит, что всё определилось без пересборки ядра или изменений внутренних настроек модема, предложенных в статье. В очередной раз говорю про себя "спасибо" разработчикам debian(а меня только недавно на gentoo сманивали).
Смотрим, как именно определилось с помощью cat /proc/bus/usb/devices

T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 6 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=19d2 ProdID=0031 Rev= 0.00
S: Manufacturer=ZTE, Incorporated
S: Product=ZTE CDMA Technologies MSM
S: SerialNumber=1234567890ABCDEF
C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=none
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=none
E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
I: If#= 2 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I: If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=none
E: Ad=84(I) Atr=03(Int.) MxPS= 64 Ivl=2ms
E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms

Устройство мы видим, но драйвер ещё не подгружен.
Подгружаю: modprobe usbserial vendor=0x19d2 product=0x031
Параметры vendor и product указаны в выводе предыдущей команды. В принципе, для данного модема они есть и в статье с гентушной вики.
В messages видно, что устройства создались:
Feb 10 09:43:00 damned kernel: usbcore: registered new driver usbserial
Feb 10 09:43:00 damned kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
Feb 10 09:43:00 damned kernel: usbserial_generic 1-1:1.0: generic converter detected
Feb 10 09:43:00 damned kernel: usb 1-1: generic converter now attached to ttyUSB0
Feb 10 09:43:00 damned kernel: usbserial_generic 1-1:1.1: generic converter detected
Feb 10 09:43:00 damned kernel: usb 1-1: generic converter now attached to ttyUSB1
Feb 10 09:43:00 damned kernel: usbserial_generic 1-1:1.3: generic converter detected
Feb 10 09:43:00 damned kernel: usb 1-1: generic converter now attached to ttyUSB2
Feb 10 09:43:00 damned kernel: usbcore: registered new driver usbserial_generic
Feb 10 09:43:00 damned kernel: drivers/usb/serial/usb-serial.c: USB Serial Driver core

Отлично. В статье(и особенно в исходном треде) много говорилось про сложности работы с этими устройствами, однако для меня оказалось важным только одно: для основной работы используется именно третий интерйес, т.е. /dev/ttyUSB2.
Поэтому в настройках pppd создаю такой файл:
# cat /etc/ppp/peers/mts_modem | grep -v "#"
user "mts"
connect "/usr/sbin/chat -v -f /etc/chatscripts/mts"
/dev/ttyUSB2
noipdefault
usepeerdns
defaultroute
persist
noauth

Все остальные настройки совершенно такие же, как и при подключении через телефон.
Всё. Готово. Теперь, скомандовав pppd call mts_modem, я оказываюсь в интернете. Никаких проблем с разрывами соединения, описанных в статье, у меня не было. Поэтому и окончательное доведение до ума вышло проще. Достаточно ограничиться созданием правил в udev(обращаю внимание, что правила немного отличаются от приведённых в статье):
# cat /etc/udev/rules.d/z80_usb_modem.rules

SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2000", RUN+="/usr/bin/eject /dev/sr1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", RUN+="/sbin/modprobe usbserial vendor=0x19d2 product=0x031"

И изменении в скрипте для запуска инета mts на mts_modem.
Система: Debian GNU/Linux Etch 4.0r6
# uname -a
Linux damned 2.6.18-6-k7 #1 SMP Fri Dec 12 17:19:09 UTC 2008 i686 GNU/Linux

Дополнение.
Так как модем остаётся подключённым к системе постоянно, нет надобности стартовать соединение вручную, поэтому я решил написать небольшой скрипт:
# cat /etc/init.d/gprs_inet.sh
#! /bin/sh

PATH=/sbin:/bin

start () {
echo "Starting GPRS Internet Connection..."
/usr/bin/eject /dev/sr1 2>/dev/null
# Задержка нужна, потому как между отключением ZeroCD и стартом
# собственно модема, проходит время.
/bin/sleep 10
/usr/sbin/pppd call mts_modem
echo "GPRS Connection Established."
}

stop () {
echo "Stoping GPRS Connection..."
/usr/bin/killall pppd 2>/dev/null
echo "GPRS Connection is stopped."
}

case "$1" in
start)
start
;;
restart)
stop
start
;;
stop)
stop
;;
*)
echo "Usage: gprs_inet.sh [start|restart|stop]" >&2
exit 0
;;
esac


Этот скрипт сохраняется в /etc/init.d/ и добавляется в загрузку/останов с помощью команды update-rc.d gprs_inet.sh defaults

вторник, 20 января 2009 г.

Книги на телефоне.

Являюсь счастливым обладателем телефона Sony Ericsson k320i.
Отличная модель, к слову. Устраивает во всём.
Так как практически вся библиотека хранится в цифре, а читать хочется не только за компом, решил обзавестись читалкой на телефоне.
Ставить какие-нибудь java-книги и т.д. очень не хотелось. К тому же почти сразу появилась идея читать с помощью встроенного броузера. Но сразу же столкнулся с проблемой оперативной памяти. Броузер на телефоне не мог открывать большие файлы. Надо их как-то резать. Сперва ещё планировал каждый из маленьких текстовых файлов форматировать в html, однако оказалось, что встроенный броузер понимает txt(правда только в кодировке utf-8). В итоге решилось всё простым скриптом:

% cat textrebuild.sh
#!/bin/bash
#
# Разбиваем исходный файл на куски по 20000 байт.
split -b 20000 -d $1;
# Удаляем исходный файл
rm -f $1;
# Все кусочки переименовываем в файлы
# вида x<порядковый номер>.txt
# и перекодируем в utf-8, удаляя исходные.
FLIST=`ls ./ | grep -v textrebuild.sh`
a=0
for i in $FLIST
do
a=`echo "${a} + 1" | bc`;
cat $i | iconv -f koi8-r -t utf-8 > x${a}.txt;
rm -f $i
done

Вот и всё. Работает всё просто. Натравливаем скрипт на обычный текстовый файл с книгой и получаем на выходе кучу маленьких текстовых файлов в юникоде. Всё это потом скидывается на телефон через usb и читается по порядку в соответствии с порядковым номером.