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

воскресенье, 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

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