2008-01-09

Format test post

This post will be test playground for various formating tests.

$some-command
Console output CSS version 1.0.
Some additional command output.
bla bla


Test line.

2008-01-07

Добавим места малышу Eee PC

Добавим места и скорости малышу Eee PC: сожмём /usr используя aufs и squashfs.

Для начала соберём и поставим aufs и squashfs.

Ставим нужные пакеты: sudo apt-get install aufs-modules aufs-tools squashfs-modules squashfs-tools.

Фиксим багу в сорцах squashfs. Для этого в начале распаковываем их:
$cd /usr/src
$sudo tar xjv squashfs.tar.bz2


Затем качаем патч. Я взял его отсюда.
Накладываем его:
$cd /usr/src/modules/squashfs/linux-2.6
$sudo patch inode.c 03-remove-slab.dpatch


Компиляем squashfs и aufs.
$sudo module-assistant -O build squashfs
$sudo module-assistant build aufs


Опция -O нужна для того что бы module-assistant не распаковывал сорцы squashfs затирая патч.
deb пакеты собираются в /usr/src. Ставим их и проверяем загрузку:
$sudo modprobe aufs
$sudo modprobe squashfs
$lsmod | egrep \(aufs\|squashfs\)


Теперь создадим и смонтируем образ /usr

Создаём сжатый образ /usr:
$sudo mksquashfs /usr /usr.sqfs -noappend -always-use-fragments


Монтируем его:
$sudo mkdir /usr-ro
$sudo mount -t squashfs -o loop /usr.sqfs /usr-ro


Монтируем всё вместе через aufs:
$sudo mkdir /usr-rw
$sudo mount -t aufs -o dirs=/usr-rw:/usr-ro=ro none /usr


В конечном итоге мы получаем наш родной /usr состоящий из двух частей:
1. RO часть лежащая в /usr-ro и являющаяся подмонтированным образом /usr.sqfs
2. RW часть содержащая изменения в RO части и лежащая в /usr-rw


Последнюю часть я пока ещё не сделал. Сжатие данных штука не быстрая. Кроме того, я не знаю как бы так аккуратнее подменить реальный /usr, что бы ничего не упало :).

В дальнейшем можно заново собирать usr.sqfs из /usr. Чистить /usr-rw. И работать со сжатой ФС.

Update


Сделал таки squashfs + aufs. Squashfs файл занимает ~40% (780Мб)от оригинального /usr (1.8Гб) - можно сказать 1 Гиг места. Пока что не удаляю оригинальный /usr, монтирую поверху. Потестирую потом снесу родной /usr.

Пока настраивал сделал косяк. Хотел сделать /usr-rw закрытым для юзерей (хез зачем;) ):
$sudo chmod a-rwx /usr-rw
$sudo chmod u+rwx /usr-rw


Настроил всё что надо в fstab, ребут и получаю окошко с квадратиками вместо GDM. Полез в консоль, глядь а /usr то dwrx------ :). Думаю: ага aufs юзает пермишены rw директории. Давай чепятать sudo chmod +rx /usr-rw. bash: chmod: command not found было мне ответом. Single mode полечил граблю.

Забавно что можно на лету mount/umount /usr без особых последствий.

По скорости видны земедления, по крайней мере при старте программ. Не критично, но есть. Чуть более долгая (3-4 сек) загрузка Гнома после логина. Так же чуть дольше (1-2) секунды стартует OO.

Ну и напоследок немного конфигов и статистики:

$cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system=""> <mount point=""> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
# /dev/sda1
UUID=4020dd57-e983-46bc-8890-b62a44605da8 / reiserfs notail,noatime 0 1
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec 0 0
tmpfs /var/log tmpfs defaults,noatime 0 0
#tmpfs /var/cache/apt/archives tmpfs defaults,noatime 0 0
/usr.sqfs /usr-ro squashfs ro,defaults,loop 0 0
usr-aufs /usr aufs dirs=/usr-rw:/usr-ro=ro 0 0

$cat /etc/mtab
/dev/sda1 / reiserfs rw,noatime,notail 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
/sys /sys sysfs rw,noexec,nosuid,nodev 0 0
varrun /var/run tmpfs rw,noexec,nosuid,nodev,mode=0755 0 0
varlock /var/lock tmpfs rw,noexec,nosuid,nodev,mode=1777 0 0
udev /dev tmpfs rw,mode=0755 0 0
devshm /dev/shm tmpfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
lrm /lib/modules/2.6.22-14-generic/volatile tmpfs rw 0 0
tmpfs /var/log tmpfs rw,noatime 0 0
/usr.sqfs /usr-ro squashfs ro,loop=/dev/loop0 0 0
usr-aufs /usr aufs rw,dirs=/usr-rw:/usr-ro=ro 0 0
securityfs /sys/kernel/security securityfs rw 0 0
binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,noexec,nosuid,nodev 0 0
/dev/sdb1 /media/disk-1 vfat rw,nosuid,nodev,shortname=mixed,uid=1000,utf8,umask=077,usefree 0 0


$df | grep usr-ro; du /usr-ro | tail -n 1
/usr.sqfs 767744 767744 0 100% /usr-ro
1834825 /usr-ro

libnotify - работа из под рута

Заметил одну особенность Ubuntu support скрипты для Eee PC не выводят OSD сообщение на включение/выключение WiFi и Overclock-а. Хотя по описанию должны. Поковырялся внутрях и нашол скрипт на перле который выводил сообщения через libnotify. Но этот скрипт нигде не вызывался. И даже если он как-то вызывается, всё равно он ничего не выведет ибо запуск из под рута выдаёт ошибку связанную с доступом к DBus.

Погуглив, нашол в чём грабли. Первое: надо найти корректный DBus Session ID. И второе: надо запускать send-notify от того польозователя что и ранает иксы.

Вот решение:

#!/bin/bash
# 2008-01-07
# (c) Aleksei Antonovich google mail: aleksei.antonovich.
# Licensed under GPL.

# Ensure that the script is run as root
if [ `id -u` != 0 ]
then
echo "ERROR: this script is intended to be run as root."
exit 1
fi

# Ugly way to find an running X programs for all users
pids=`pgrep gnome-panel`

for pid in $pids; do
#Search for DBus for that process
DBUS=`grep -z DBUS_SESSION_BUS_ADDRESS \
/proc/$pid/environ | sed -e "s/DBUS_SESSION_BUS_ADDRESS=//"`

#Grab user of Gnome process
UNAME=`grep -z USERNAME \
/proc/$pid/environ | sed -e "s/USERNAME=//"`
# echo "user is: "$UNAME
# echo "DBUS is: "$DBUS
DBUS_SESSION_BUS_ADDRESS=$DBUS \
sudo -u $UNAME notify-send "$@"
done


Несколько кривовато определение программ запущенных под иксами, но работает. Если потом руки дойдут - сделаю более универсально.