Установка Gentoo Linux на ноутбук Sony VGN-SZ5XRN

Как обычно, вначале я должен вставить свое обычное предупреждение: все нижеописанное делалось мной и на моем ноутбуке. Все работает так как я описал. Пошагово повторить это может любой, но результата скорее всего добьется уже имеющий опыт работы с Linux. Если у вас что-то сломалось, то это целиком ваша вина. Почему Linux, почему Gentoo и почему вообще именно так это темы для других статей. Большинство идей и скриптов найдено в интернете, но авторство не было найдено.

1. Введение.

Sony делает хорошие ноутбуки. Легкие, производительные, долго работают от батарей. Дороговатые немного, но пережить можно. Есть у них один недостаток: программное обеспечение. Нет, Vista Business по-своему хороша, но тот объем софта, который в нее забивают по умолчанию японцы, убьет и слона, не то что маленький и хилый ноутбук. Ладно бы просто объемы, так он еще и без половины лицензий идет или настроен непонятно. К примеру, у меня при "можно ли прожить под Vista?" при каждой загрузке открывалось пустое окно "My Vaio Club". Просто пустое, без заголовков, без меню. Зато на флеше! При регулировке яркости или громкости при помощи функциональных кнопок мне сообщали об этом на итальянском или испанском, а не на русском. Я бы согласился и на английский, но не нашел где сменить. Сканер отпечатков пальцев при каждом появлении в его поле зрения полей для ввода предлагал их сохранить, не взирая на то, что он уже эти поля не только сохранил, но и уже заполнил. Нет, больших проблем не было и можно было просто игнорировать все это, но как-то я себя поймал на простой и банальной мысли "Почему я должен терпеть это?". Ведь ноутбук это мой рабочий инструмент и я должен думать о работе (или о не работе), но не бороться с ним. Сказал "копать" - должен копать пока не скажу "не копай", даже если копать надо бетон. Малодушное желание вернуться на макбук было подавлено (Он поросту тяжелый для постоянной носки с собой. Вот попробую новый air, потом решим) и был взят курс на linux, благо вся моя инфраструктура уже на нем.

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

Итак, что получилось. За некоторым исключением все, что есть в ноутбуке, работает. Не работает только сканер отпечатков пальцев (Информация из интернета: он бы заработал, но в него надо предварительно послать какой-то хитрый код. Сделано это по требованию Sony) и модем. Модем я попросту не проверял из-за полного отсутствия необходимости в нем. Так что он в реальности может и работает. Частично работают видиеоподсистема и функциональные кнопки. В режиме "stamina" после выхода из сна не регулируется яркость, а в режиме "speed" она вообще не регулируется никогда. Ну и кнопки S1 и S2 работают как одна. В остальном работает все и без нареканий.

Для установки выбран дистрибутив Gentoo. Архитектура: x86_64. Принцип, используемый при установке, простой: делаем всё сами и на "низком уровне". Если что-то умеют делать другие (к примеру, KDE умеет рисовать OSD при изменении громкости), то отключть это не сложно.

2. Инсталляция.

Итак, загружаемся с minimal диска и удаляем оба раздела windows. После удаления создаем один раздел размером в 16Гб для системы. Пользовательские данные будут жить в другом месте. Делать /boot или использовать LVM я не стал: все-таки это ноутбук, а не сервер.

fdisk /dev/sda
d
1
d
n
p
1
1
+16384M
w

Создаем там файловую систему и начинаем пошагово идти по handbook.

mkfs.ext3 -j /dev/sda1
mount /dev/sda1 /mnt/gentoo
cd /mnt/gentoo
wget http://trumpetti.atm.tut.fi/gentoo/releases/amd64/2007.0/stages/stage3-amd64-2007.0.tar.bz2

Тут маленький трюк: Ставим дату любую, находящуюся гарантированно в прошлом. Дело в том, что по умолчанию gentoo использует временную зону UTC, а я хочу GMT+3 или Europe/Moscow. В итоге после перезагрузки с другой зоной "съезжают часы" и многие программы начинают обижаться.

date 121619282007
tar xvjpf stage3-*.tar.bz2
cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
mount -t proc none /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev
chroot /mnt/gentoo /bin/bash
env-update
source /etc/profile
emerge --sync
ln -snf /usr/portage/profiles/default-linux/amd64/2007.0/desktop/ /etc/make.profile

Первая правка конфигурационных файлов.

nano /etc/make.conf
USE="symlink logrotate -ipv6 -kerberos samba"

Здесь необходимо сделать отступление. Обычно перед любой установкой чего-то я сначала с помощью ключа -pvt смотрю на необходимые USE флаги и правлю make.conf. Но в тексте я эти ключи использовать не буду.

emerge world

emerge gentoo-sources

cd /usr/src/linux

make menuconfig

Для желающих мой текущий конфиг ядра

make
emerge grub
make modules_install
make install

nano /boot/grub/grub.conf

timeout 1
default 0
        title Gentoo
        root (hd0,0)
        kernel /boot/vmlinuz root=/dev/sda1


grep -v rootfs /proc/mounts > /etc/mtab
grub-install /dev/sda
nano /etc/fstab

/dev/sda1               /               ext3            noatime         0 1
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0

rc-update add sshd default

Здесь очередной трюк. Использовать в качестве каталога для компиляции ram-диск. Очень ускоряет процесс.

mount -t tmpfs tmpfs /var/tmp/portage
emerge dhcp hotplug syslog-ng
rc-update add hotplug default
rc-update add syslog-ng default

Правим настройки часов и временной зоны.

nano /etc/conf.d/clock

CLOCK="local"
TIMEZONE="Europe/Moscow"

passwd
umount /var/tmp/portage
exit
cd
umount /mnt/gentoo/proc
umount /mnt/gentoo/dev
umount /mnt/gentoo/
reboot

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

3. Тюнинг - это наше все.

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

cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Включаем ram-диск.

mount -t tmpfs tmpfs /var/tmp/portage

Вот теперь можно поставить в системе точное время. Спасибо Zenon за любезно предоставляемый сервер точного времени.

emerge ntp
ntpdate ntp0.zenon.net

Идем дальше по handbook

emerge vixie-cron screen
rc-update add vixie-cron default

Очередное отступление. Если вы не ставили дату "далеко" назад и все вокруг ругаются что clock skew detected, то самое простое это поставить для всех файлов текущую дату. Делается это в нужном каталоге следующей командой:

find . -type f|xargs touch

Так же на некоторых пакетах вы можете обнаружить что они не собираются. Промотайте сообщения об ошибках вверх и если вы увидите нечто подобное:

libsandbox: Can't resolve fopen: (null)

То попросту отключите "песочницу". У меня это потребовалось на следующих пакетах:

FEATURES="-sandbox" emerge -1 glibc
FEATURES="-sandbox" emerge ipw3945

Ну, раз поставили драйверя для wifi, то надо поставить в загрузку демона, который ими управляет.

rc-update add ipw3945d default

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

screen
emerge -e world
etc-update

Если вы боитесь, что не хватит памяти (своп пока мы не создавали), то можете добавить своп "из файла". Данными командами вы создадите в текущем каталоге файлик размером 256Мб и сделаете из него своп.

dd if=/dev/zero of=swap count=512000
mkswap swap
swapon swap

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

emerge cpufrequtils
/etc/init.d/cpufrequtils start
rc-update add cpufrequtils boot

ACPI - та самя фигня, через которую система получает уведомления о аккумуляторах, функциональных кнопках и так далее. Желающие узнать подробней могут осведомиться у любимой поисковой системы. Что бы ядро узнало обо всем нужном, нужно нужное поставить.

emerge acpid
rc-update add acpid default
/etc/init.d/acpid start

Правим системную локаль (по умолчанию "С") и имя машины.

cat > /etc/env.d/02locale
LANG="en_US.UTF-8"

env-update

nano /etc/conf.d/hostname 
HOSTNAME="multik"

Добавляем звук и проверяем его. Вызывать alsamixer необходимо по простой причине: если настройки не найдены, то все "ручки громкости" будут выкручены на минимум. ls - это самый простой из известных мне способов что-нибудь "хрюкнуть".

emerge alsa-utils
rc-update add alsasound boot

/etc/init.d/alsasound start
alsamixer
/etc/init.d/alsasound save
ls -l / > /dev/dsp

Мне нужна поддержка WPA, поиска файлов и прелинковка.

emerge wireless-tools wpa_supplicant
emerge slocate prelink
nano /etc/conf.d/prelink
PRELINKING="yes"

Теперь очередной трюк. Так как в ноутбуке две видеокарты, то самый простой способ управиться с ними это запускать перед стартом графики скрипт, который будет выполнять необходмые для данной конфигурации действия. Принцип его работы простой: смотрим на наличие nVidia в списке устройств в машине и если есть, то переключаем OpenGL на работу с ней и копируем конфигурацию xorg для "скоростной" работы. Иначе переключатель в положении "stamina" и видеокарта теперь intel 945GM. Мои xorg.con.speed и xorg.conf.stamina. В конфиге уже прописан переключатель раскладок клавиатуры по Ctrl-Shift (индикатор ScrollLock), так что здесь тоже ставим галочку. Кстати, конфиги немного отличаются в деле управления дисплеем, но это сделано специально. Когда ноутбук в режиме "stamina", мне не нужны все эти внезапные погасания экрана.

nano /etc/init.d/xorg_conf


#!/sbin/runscript

depend() {
        before xdm
}

start() {
VIDEO=`/usr/sbin/lspci |grep -c nVidia`
NVIDIA=`/usr/bin/eselect opengl show |grep -c nvidia`

if [ "$VIDEO" = 1 ]; then
cp -f /etc/X11/xorg.conf.speed /etc/X11/xorg.conf
  if [ "$NVIDIA" = 0 ]; then
    eselect opengl set nvidia
  fi
else
cp -f /etc/X11/xorg.conf.stamina /etc/X11/xorg.conf
  if [ "$NVIDIA" = 1 ]; then
    eselect opengl set xorg-x11
  fi
fi
}


chmod +x /etc/init.d/xorg_conf 
rc-update add xorg_conf default

Добавляем сервисы, которые помогут в дальнейшем десктопным менеджерам разбираться с зоопарком устройств в ноутбуке. hald занимается "обнаружением" нового и старого в ноутбуке. dbus осуществляет интерфейс между системными программами и пользовательской частью. ivman попросту тупо пытается все замонтировать в /media. xdm - это та самая штуковина, что рисует в графике "введите ваш логин".

emerge hal ivman xdm

rc-update add hald default
rc-update add xdm default
rc-update add dbus default
rc-update add ivman default

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

4. "Мы едем, но надо лететь"

Система вроде работает, но нам охота полезных красивостей.

Первой красивостью пока не забыли надо отключить у xorg желание принимать к себе всех по сети.

nano /etc/X11/xdm/Xservers

Добавляем -nolisten tcp в самую последнюю строчку следующим образом:

:0 local /usr/bin/X :0 -nolisten tcp vt7

Следующей красивостью пойдет настройка сети. Ноутбук имеет два самых часто используемых сетевых интерфейса: ethernet и wifi. Но из-за особенностей ноутбучной жизни я не могу полагаться на то, что при загрузке какой-либо из этих интерфейсов может понадобиться. И я не хочу ждать при загрузке пока dhcp обнаружит, что ethernet никуда не включен.

Для таких как я давно все написано. Задача ifplugd смотреть за интерфейсами и если туда что-нибудь включат, поднимать все необходимое.

emerge ifplugd

Говорим системе, что для того, что бы считать "сеть есть", достаточно только одного loopback интерфейса. Остальные без надобности.

nano /etc/conf.d/rc
RC_NET_STRICT_CHECKING="lo"

Теперь рассмотрим мои настройки.

cat /etc/conf.d/net

# Указываем сетевым устройствам
# имена по mac-адресу
rename_0013A9FD8A35=eth0
rename_001B7773D622=eth1

# eth0 - ethernet.
# по умолчанию не менять ip-адрес на интерфейсе, если он уже есть.
# иначе использовать dhcp и если адрес не получен, то поставить из
# диапазона APIPA 169.254.x.x
config_eth0=( "noop" "dhcp")
fallback_eth0=( "apipa" )
fplugd_eth0=""
# при возможности возвращать ip-адрес dhcp
# и не менять настройки DNS, NTP и NIS
dhcp_eth0="release nodns nontp nonis"

# eth1 - wifi.
# обычные настроки не подойдут, поэтому используем wpa_supplicant
modules_eth1=( "wpa_supplicant")
wpa_supplicant_eth1="-Dwext -B"
# остальное аналогично eth0
config_eth1=("noop" "dhcp")
fallback_eth1=("apipa")
dhcp_eth1="release nodns nontp nonis"

Для работы всего этого хозяйства добавлем следующее

emerge net-misc/iputils net-analyzer/arping

Говорим скриптам загрузки, что у нас есть еще и eth1

cd /etc/init.d
ln -s net.lo net.eth1

Внимание, добавлять net.eth1 как советуют во многих руководствах

rc-update add net.eth1 default

НЕ НАДО. Система сама поймет (hint: не зря же мы ставили hald и dbus) когда надо поднимать интерфейс.

И теперь осталось прописать все нужные вам WiFi сети. Это делается в wpa_supplicant.conf. Приведенный ниже пример рассчитан на сеть WiFI с шифрованием WPA-PSK (или Personal у некоторых) и ключем password. На кажущуюся простоту не смотрите - wpa_supplicant позволяет вытворить с Wi-Fi абсолютно всё необходимое для доступа в любую сеть. В man wpa_supplicant.conf все расписано достаточно подробно и с примерами.

# cat /etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

network={
        ssid="WiFI"
        key_mgmt=WPA-PSK
        psk="password"
}

5. "Ой, баюсь, баюсь ..."

Итак, позволю себе еще раз напомнить вам, что мы ставим систему на ноутбук. А ноутбук - субстанция весьма легко перемещаемая в пространстве и поэтому его легко можно забыть или потерять где-нибудь. А еще его могут украсть для благовидных (препродать) или неблаговидных (узнать, что на ноутбуке) целей. От всего этого есть только одна защита: шифрование всего, до чего дотянется рука и не оставление врагу ни единого шанса.

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

Я руководствовался следующим текстом, но он уже немного устарел, поэтому туда необходмо смотреть максимум для ознакомления.

Для начала посмотрим, что ядро знает про шифрование.

cat /proc/crypto

Если у вас не включен wifi, то там должно быть только записи про sha256. Если wifi включен, то записей должно быть больше. Каждая запись описывает один из алгоритмов шифрования, известных ядру. Пробуем загрузить модуль AES, который обеспечиват одноименное шифрование.

modprobe aes-x86-64

теперь в конце должно появиться следующее:

name         : aes
driver       : aes-x86_64
module       : aes_x86_64
priority     : 200
refcnt       : 6
type         : cipher
blocksize    : 16
min keysize  : 16
max keysize  : 32

Удаляем все ненужное и ставим все необходимое

emerge unmerge cryptsetup
emerge cryptsetup-luks
nano /etc/portage/package.keywords
sys-auth/pam_mount ~amd64
sys-libs/libhx ~amd64
emerge pam_mount

Для проверки попробуем сделать шифрованный swap раздел. Если что-то не получится, то система просто ругнется и не загрузится. Здесь мы просто говорим шифровать раздел и готовить его под swap. Ключ будет генериться каждый раз новый, поэтому что-то внятное в свопе будет только при текущем сеансе работы.

nano /etc/conf.d/cryptfs
swap=crypt-swap
source='/dev/sda2'

Добавляем swap в fstab

nano /etc/fstab
/dev/mapper/crypt-swap    none           swap    sw             0 0

Добавляем нужный модуль в автозагрузку. Обратите внимание на имя. Если ничего этого не делать, то загрузится просто aes, а он немного медленней своей 64х разрядной версии.

nano /etc/modules.autoload.d/kernel-2.6
aes-x86-64
update-modules --force

Теперь создаем раздел для swap (sda2) и для пользовательского каталога (sda3). На swap я отвел у себя 2 гигабайта, а для пользователя (себя любимого) все остальное. Таким образом, на "непроизводительные" расходы я потерял 18 гигабайт диска.

После перезагрузки или запуска crypto-loop мы не должны увидеть каких-либо сообщений об ошибках. Однако swap должен появиться. Проверим, насколько упала скорость на чтение.

# hdparm -tT /dev/sda

/dev/sda:
 Timing cached reads:   6364 MB in  1.99 seconds = 3190.25 MB/sec
 Timing buffered disk reads:  122 MB in  3.02 seconds =  40.36 MB/sec
multik ~ # hdparm -tT /dev/mapper/crypt-swap

/dev/mapper/crypt-swap:
 Timing cached reads:   5926 MB in  2.00 seconds = 2969.67 MB/sec
 Timing buffered disk reads:  116 MB in  3.01 seconds =  38.49 MB/sec

Теперь я вынужден добавить ложку дегтя: так как мы зашифровали swap раздел, то от hibernate или suspend-to-disk придеться отказаться целиком и полностью. Ибо во всех других случаях до данных в памяти можно будет добраться.

Теперь пришла пора шифровать пользовательский раздел. Отвечаем везде YES и тщательно вводим пароль.

cryptsetup --verbose --verify-passphrase luksFormat /dev/sda3

Пробуем "открыть" свежесозданный раздел

cryptsetup luksOpen /dev/sda3 sda3
Enter LUKS passphrase: 
key slot 0 unlocked.
Command successful.

Проверям

ls -l /dev/mapper
total 0
lrwxrwxrwx 1 root root     16 2007-12-18 21:58 control -> ../device-mapper
brw-rw---- 1 root disk 254, 0 2007-12-18 21:58 crypt-swap
brw-rw---- 1 root disk 254, 1 2007-12-18 19:00 sda3

Теперь добавляем все необходимое для форматирования раздела в reiserfs и форматируем его. Почему reiser, а не ext3? Ну, во-первых, reiser гораздо быстрее работает с мелкими файлами. Во-вторых, он быстрее работает с большими файлами (засеките, сколько будет удаляться на ext3 файлик гигов на 20). B третьих, он как-то выглядит понадежнее к внезапным перезагрузкам и прочим нехорошестям, которые ожидают файловую систему на этом разделе. Почему не xfs и прочие? Вот тут не знаю. Привык наверное.

emerge sys-fs/reiserfsprogs
mkfs.reiserfs /dev/mapper/sda3

Теперь укажем pam_mount что и куда необходимо монтировать. В /etc/fstab ничего не надо добавлять.

nano  /etc/security/pam_mount.conf.xml

<volume user="multik" fstype="crypt" path="/dev/sda3" mountpoint="/home/multik"
    options="cipher=aes" />

Добавим пользователя

useradd multik
passwd multik
chown multik:multik /home/multik

"Закроем" контейнер

cryptsetup luksClose /dev/sda3

И поправим следующим образом конфигурацию PAM. Суть простая: пусть пароль спрашивает pam_mount, делает все необходимое, а все остальные модули пусть получают уже готовое.

nano /etc/pam.d/system-auth

auth       required     pam_env.so
auth       optional     pam_mount.so
auth       sufficient   pam_unix.so likeauth nullok use_first_pass
auth       required     pam_deny.so use_first_pass

account    required     pam_unix.so

password   required     pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password   sufficient   pam_unix.so nullok md5 shadow use_authtok
password   required     pam_deny.so

session    required     pam_limits.so
session    required     pam_unix.so
session    optional     pam_mount.so

Теперь можно и проверить. При попытке войти теперь должна встречать надпись не password: , а pam_mount password: и при правильных настройках логин пользователя должен пройти успешно и раздел должен примонтироваться в каталог.

/dev/mapper/_dev_sda3 on /home/multik type reiserfs (rw)

Если вам не нравится надпись pam_mount password:, её легко сменить, найдя слеующую строчку:

<msg-authpw>pam_mount password:</msg-authpw>

Осталось последнее место, где злоумышленник может прочитать пользовательские данные. Это каталог /tmp, где программы хранят всякие временные файлы. Избавляемся от угрозы самым радикальным способом

cat /etc/fstab
/dev/sda1               /               ext3            noatime         0 1
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0
none                    /var/tmp/portage        tmpfs   defaults 0 0
tmpfs   /tmp   tmpfs   defaults,nosuid,mode=1777   0 0
/dev/mapper/crypt-swap  none    swap    defaults

Говоря другим языком, мы поместили /tmp на ram-диск. Стоит машину выключить, как все содержимое пропадет безвозвратно. Вот теперь мы окончательно защищены от кражи.

6. "Порядок должен быть в доме. Ребенки, оне в грязи растить не могут .."

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

emerge wdm windowmaker pidgin mozilla-firefox mozilla-thunderbird openoffice

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

Сеть работает. Когда надо цепляется, когда не надо отцепляется.

Справа у ноутбука модуль PCMCIA

emerge -p pcmcia 
/etc/init.d/pcmcia start

Смотрим, что там.

# cardctl info
PRODID_1="Ubiquam"
PRODID_2="UM-300"
PRODID_3=""
PRODID_4=""
MANFID=015d,4c45
FUNCID=254

Совершенно бесполезный в условиях linux модем для cdma связи. Почему бесполезный? Судя по всему, китайцы (или кто там) делают его только для российского skylink, а тому на linux пофиг. Выкидываем и вставляем мышку от HP.

PRODID_1="HP Bluetooth PC Card Mouse"
PRODID_2=" "
PRODID_3=""
PRODID_4=""
MANFID=0000,0000
FUNCID=255

Работает. Значит пусть работает.

rc-update add pcmcia default

Находим pci-express (или как он там зовется, короче то, что идет на смену pcmcia) слева и вставляем туда адаптер SD с карточкой. Ситема в логах немедленно отзывается

Dec 20 12:44:08 multik ivman: Device /dev/sdb1 appears to be mountable
Dec 20 12:44:08 multik ivman: Checking for video DVD in device '/dev/sdb1' mounted at '/media/sdb1'

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

Теперь перейдем к более приятным вещам. Например, заведем свой собственный кеширующий DNS-сервер, что поможет чуть-чуть сократить трафик, когда сидим по медленной линии.

emerge bind
rc-update add named default
/etc/init.d/named start

nano /etc/resolv.conf
nameserver 127.0.0.1

Следующим этапом немного ускорим nvidia

nano /etc/modules.d/nvidia
options nvidia NVreg_EnableAGPSBA=1 NVreg_EnableAGPFW=1

update-modules

Добавим себя во все возможные группы.

gpasswd -a multik video
audio
plugdev
users
usb
cdrw
cdrom

Давайте делать красиво!

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

# cd /etc/fonts/
# cat > local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
 <match target="font" >
  <edit mode="assign" name="rgba" >     <const>rgb</const> </edit>
  <edit mode="assign" name="hinting" >  <bool>true</bool>  </edit>
  <edit mode="assign" name="antialias"> <bool>true</bool> </edit>
  <edit mode="assign" name="autohint" > <bool>false</bool> </edit>
  <edit mode="assign" name="hintstyle"> <const>hintfull</const> </edit>
 </match>
</fontconfig>

Тут я просто включил все типы сглаживания для всех шрифтов. При желании можно что-то включать или наоборот, что-то отключать для любого размера или любого шрифта в отдельности. Пример смотрите в fonts.conf в том же каталоге или как обычно, в интернете.

Второй кусочек проблемы сложнее: по умолчанию в xorg нет приличных шрифтов. Добавляем:

emerge corefonts unifont liberation-fonts-ttf dejavu

На этом этапе большинство останавливается. Вроде выглядит неплохо и ладно. Но сейчас у большинства пользователей мониторы LCD и первое же сравнение с другими системами (Windows или OS X) выдает некую корявость. А открытие любого сложного документа с шрифтами раскрывает проблему во всю ширь: некоторые части букв почему-то утолщаются, а некоторые наоборот исчезают. От этого можно избавиться, поменяв шрифт или его размер, но проблема тут же всплывает на другой странице или в другом месте. Почему так?

Суть проста: физическая плотность размещения точек (dpi - dot per inch - точек на дюйм) на мониторе не совпадает с используемой системой. Проблема усугубляется тем, что большинству на эту проблему наплевать с высокой колокольни. Но на то и linux, что бы сделать так, как нам нужно, а не так, как хочется кому-то еще.

Я не помню про Gnome, но авторы KDE в контрольной панели сделали так, что для шрифтов можно вручную указывать два значение dpi (по-моему 96 и 120), но это чистой воды подпорка. Можно указать в xorg.conf размеры дисплея и сервер сам пересчитает значение dpi, но на практике драйвера не обращают на это внимание и ставят свое. И тут очередная проблема: некоторые драйвера не умеют ставить указанное пользователем значение и берут свое. В результате у меня получилось следующее: Х правильно высчитывает значение dpi, но драйвер имеет более высокий приоритет в этом деле (считается, что он может добраться до железа и узнать реальный размер матрицы) и ставит свое. К примеру intel ставит мне dpi 102x180. Чего получается на экране можете вообразить сами.

Итак, высчитываем и ставим вручную нужное значение dpi. Берем линейку и измеряем экран, вернее видимую его область от левого пикселя до правого. Делим полученный размер на 25.4 и получаем размер в дюймах. Теперь делим горизонтальное разрешение экрана на полученное чисто. Получаем искомые DPI. Математически это записыватеся так:

dpi=resolution / (size/25.4)

Аналогично делаем по вертикали. Должны получиться примерно одинаковые числа. У меня получилось 112,54. На дробную часть не обращаем внимания: линейка и глаз это не те инструменты, которым надо доверять на все 100% и точность они имеют соответствующую.

Идем в конфиг xdm(или wdm/kdm/gdm) и добавляем в строку запуска X сервера -dpi 112

Для KDE /usr/kde/3.5/share/config/kdm/kdmrc

ServerArgsLocal=-nolisten tcp -dpi 112

Для обычного xdm это в /etc/X11/xdm/Xservers

Перезагружаем xorg (/etc/init.d/xdm restart или нажатием Ctrl-Alt-Backspace) и смотрим:

$ xdpyinfo|grep dot
  resolution:    112x112 dots per inch

Теперь сравниваем поведение всяких браузеров и прочих шрифтозависимых программ. При желании меняем значение dpi в большую или меньшую сторону и смотрим на разницу. Если не доверяете своей памяти, делайте скриншоты. У меня получилось все отлично. Конечно, уровень шрифтов не тот, но в остальном больше никаких нареканий.

7. "Ишь ты, масленница ..."

Одним из фактов, вызвавшим мое удивление, был тот, что на ноутбуках серии TX при отключании из розетки меня постоянно спрашивали: "CD привод отключить?", а на SZ серии не спрашивают. Решил я исправить эту ситуацию. Порывшись в инете, нашел, что при загруженном sony_laptop в /proc и /sys появляются каталоги, где можно рулить многими частями ноутбука.

К примеру, "отсоеденим" привод DVD.

echo 1 > /sys/class/scsi_device/0\:0\:0\:0/device/delete

В логах следующее:

Dec 20 16:26:41 multik ata1.00: disabled
Dec 20 16:26:41 multik ivman: Device removed: /org/freedesktop/Hal/devices/pci_8086_27df_scsi_
host_scsi_device_lun0_scsi_generic
Dec 20 16:26:41 multik ivman: Device removed: /org/freedesktop/Hal/devices/pci_8086_27df_scsi_
host_scsi_device_lun0
Dec 20 16:26:41 multik ivman: Device removed: /org/freedesktop/Hal/devices/pci_8086_27df_scsi_
host
Dec 20 16:26:41 multik ivman: Device removed: /org/freedesktop/Hal/devices/storage_model_DVD_
RAM_UJ_852S

А теперь выключим питание:

echo 1 > /sys/devices/platform/sony-laptop/cdpower

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

Обратно всё включаем так же, только шину просканируем по другому:

echo 0 0 0 > /sys/class/scsi_host/host0/scan

Система в логах сообщит о появлении привода.

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

Регулируем яркость экрана.

В этом действии нет ничего сложного. У сони яркость регулируется пошагово от 0 до 7.

echo 5 > /sys/class/backlight/sony/brightness

Для NVidia я не нашел способа, позволяющего регулировать яркость. Вернее, нашел какой-то древний хакнутый sony_acpi, но он регулирует только яркость, аккуратно игнорируя всё остальное. Но насколько я понял из описаний, данный способ объявлен оффициальным, так что просто ждем поддржки.

Согласитесь, следует неземедлительно воспользоваться открывшимися возможностями.

Скриптуем всё!

Пишем сразу несколько скриптов. Первые два скрипта выключают и включают bluetooth адаптер, не трогая wifi. Для системы все происходит как будто выдернули usb-модуль.

cat bluet_off
#!/bin/bash
echo 0 >  /sys/devices/platform/sony-laptop/bluetoothpower
cat bluet_on
#!/bin/bash
echo 1 >  /sys/devices/platform/sony-laptop/bluetoothpower

Следующие два скрипта выключают и включат привод.

cat dvd_off
#!/bin/bash
echo 1 > /sys/class/scsi_device/0\:0\:0\:0/device/delete
echo 0 > /sys/devices/platform/sony-laptop/cdpower
cat dvd_on
#!/bin/bash
echo 1 >  /sys/devices/platform/sony-laptop/cdpower
echo 0 0 0 > /sys/class/scsi_host/host0/scan

Ну а wifi можно и переключателем выключить, но при желании вы можете написать свой аналогичный скрипт (ниже я приведу свой).

Функциональные кнопки

Теперь настала пора обратить взгляд на них. Fn-F5 к примеру должна яркость экрана уменьшать. А Fn-F6 - увеличивать. Только как их поймать? Этим делом занимается демон acpid. Он контролирует все acpi события (а сюда входит не только нажатие кнопок, но и открывание-закрывание экрана или смена батарей. Поймав это событие, он согласно конфигу вызывает скрипт, который и разбирается дальше со всем.

Конфиг лежит в /etc/acpi/events/, а скрипт лежит каталогом ниже. По умолчанию вся эта связка умеет только выключать машину по нажатию на кнопку power, а на остальное ругаться, что собитие не известно и поэтому не обработано.

Нам поведение по умолчанию не подходит, поэтому удаляем предустановленное и пишем свое

rm /etc/acpi/events/default

# cat /etc/acpi/events/sony
event=.*
action=/etc/acpi/sony.sh %e

Согласно этому конфигу, все события будут передаваться в скрипт sony.sh, который я и написал на основе стандартного, основываясь на записях в логах

#!/bin/sh
# /etc/acpi/sony.sh
# Default acpi script that takes an entry for all actions

set $*

group=${1%%/*}
action=${1#*/}
device=$2
id=$3
value=$4

log_unhandled() {
        logger "ACPI event unhandled: $*"
}

case "$group" in
        sony)
                case "$action" in
                        hotkey)
                                case "$4" in
                                    0000000c) #Fn-F1
                                    ;;
                                    00000010) #Fn-F5 bri down
                                    /root/scripts/bri_down
                                    ;;
                                    00000011) #Fn-F6 bri up
                                    /root/scripts/bri_up
                                    ;;
                                    00000012) #Fn-F7 switch lcd-ext
                                    ;;
                                    00000013) #Fn-F8
                                    ;;
                                    00000014) #Fn-F9
                                    ;;
                                    00000015) #Fn-F10 zoom
                                    ;;
                                    00000016) #Fn-F11
                                    ;;
                                    00000017) #Fn-F12 hibernate
                                    ;;
                                    00000020) #S1-S2 button
                                    ;;
                                    0000003d) #wireless switch to off
                                    /root/scripts/bluet_off
                                    /root/scripts/wifi_off
                                    ;;
                                    0000003c) #wireless switch to on
                                    /root/scripts/bluet_on
                                    /root/scripts/wifi_on
                                    ;;
                                    0000003b) #this is default
                                    ;;
                                    00000039) # battery inserted
                                    ;;
                                    0000003a) # battery removed
                                    ;;
                                esac
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        button)
                case "$action" in
                        lid)
                                /root/scripts/screen_lock
                                ;;
                        power)
                                /root/scripts/screen_lock
                                echo "mem" > /sys/power/state
                                /root/scripts/bluet_off
                                /root/scripts/wifi_off
                                sleep 2
                                /root/scripts/bluet_on
                                /root/scripts/wifi_on
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        battery)
                case "$4" in
                        00000000) # battery removed
                                ;;
                        00000001) # battery inserted
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;

        ac_adapter)
                case "$4" in
                        00000000) # AC adapter is off
                                ;;
                        00000001) # AC adapter is on
                                ;;

                        *)      log_unhandled $* ;;
                esac
                ;;


        *)      log_unhandled $* ;;
esac

Как видите, на многие события я не нашел чего повесить. Но запротоколировать я их запротоколировал. Более того, linux позволяет добавить реакцию на те кнопки, которые родной драйвер игнорирует. К примеру Fn-F8.

Это скрипты, которые управляют яркостью и включением/выключением wifi

cat bri_down
#!/bin/bash
BRIGHTNESS="$(cat /sys/class/backlight/sony/brightness)"
if (( BRIGHTNESS > 0))
then
BRIGHTNESS=$((BRIGHTNESS-1))
echo $BRIGHTNESS > /sys/class/backlight/sony/brightness
echo $BRIGHTNESS > /sys/devices/platform/sony-laptop/brightness_default
fi
PERC="$(( (BRIGHTNESS*100)/7 ))"
XAUTHORITY=/home/multik/.Xauthority DISPLAY=:0.0 osd_cat -p bottom \ 
-o 50 -A center -b percentage --percentage=$PERC -c green \
--text=Brightness -d 1 -f  -*-verdana-bold-r-*-*-*-*-*-*-*-*-*-* &


cat bri_up
#!/bin/bash
BRIGHTNESS="$(cat /sys/class/backlight/sony/brightness)"
if (( BRIGHTNESS < 7))
then
BRIGHTNESS=$((BRIGHTNESS+1))
echo $BRIGHTNESS > /sys/class/backlight/sony/brightness
echo $BRIGHTNESS > /sys/devices/platform/sony-laptop/brightness_default
fi
PERC="$(( (BRIGHTNESS*100)/7 ))"
XAUTHORITY=/home/multik/.Xauthority DISPLAY=:0.0 osd_cat -p bottom \
-o 50 -A center -b percentage --percentage=$PERC -c green \
--text=Brightness -d 1 -f  -*-verdana-bold-r-*-*-*-*-*-*-*-*-*-* &

cat screen_lock
#!/bin/bash
XAUTHORITY=/home/multik/.Xauthority DISPLAY=:0.0 /usr/bin/xscreensaver-command -lock

cat wifi_off
#!/bin/bash
/etc/init.d/net.ent1 stop
/etc/init.d/ipw3945d stop
/sbin/rmmod ipw3945

cat wifi_on
modprobe ipw3945
/etc/init.d/net.eth1 start

Немного о том, как все устроено. На соответствующие кнопки повешены вызовы соответсвующих скриптов. При нажатии на кнопку "power" ноутбук теперь блокирует экран и уходит в сон. После выхода из сна он перезапускает беcпроводную часть. При закрытии экрана он попросту блокирует консоль. Реакциями на остальные кнопки я не заморачивался.

Теперь немного про последние части скриптов. Как я писал выше, KDE само выводит окошки с уровнем яркости. Но вот windowmaker не умеет. И может кто-нибудь еще не умеет. А охота.

Рисуем палочки

Добавляем пакет osd, который умеет рисовать всякие полоски "поверх" экрана

emerge xosd

Что бы программы из под root смогли добраться до Х, включаем доступ

xhost local:root

И теперь достаточно указать в root'овой программе следующее

export XAUTHORITY=/home/multik/.Xauthority

Пробуем из под root:

DISPLAY=:0.0 osd_cat -p bottom -o 50 -A center -b percentage -P 45 -d 1 -c green -f -*-verdana-bold-r-*-*-*-*-*-*-*-*-*-*

На экране должна появиться зелененькая шкала (как на телевизорах, когда громкость крутишь), заполненная наполовину. Думаю, принцип понятен, а детали реализации можно взять из скриптов.

Клавиатура тоже модернизируется!

Если вы заметили, то в этом скрипте нет упоминаний про "муть", "тише" и "громче". Все дело в том, что sony_laptop преобразует их в обычные клавиатурные нажатия. Если мы запустим xev и понажимаем кнопки, то обнаружим, что генерируются коды 160, 174 и 176. В принципе это стандартные коды для мультимедийных клавиш, но xorg про это не знает. Поможем

emerge xmodmap

$ cat > .Xmodmap
keycode 160 = XF86AudioMute
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume

Теперь если мы скажем xmodmap .Xmodmap (или за нас это скажут *dm), то будут генерироваться уже стандартные для всех программ события и всякие KDE будут радостно менять громкость и сообщать большими окошками про это. Но как быть с другими?

Здесь на помощь придет не менее мощный пакет, который позволяет на любую комбинацию клавиш повесить любые события

emerge xbindkeys

Что бы не мучаться, попросим сгенерировать стандартный файл

xbindkeys --defaults > /home/multik/.xbindkeysrc

В нем все отключено и повешена для примера комбинация Ctrl-F - вызов xterm. Что бы опять же не мучаться, вызовем

xbindkeys -mk

И понажимаем нужные кнопки. В результате нам на экран выведут кусок конфига, который нужно вставить. Вот какой конфиг у меня получился:

"xterm"
  c:41 + m:0x4

"/home/multik/scripts/vol_mute"
    m:0x0 + c:160
    XF86AudioMute
"/home/multik/scripts/vol_down"
    m:0x0 + c:174
    XF86AudioLowerVolume
"/home/multik/scripts/vol_up"
    m:0x0 + c:176
    XF86AudioRaiseVolume

И приведу соответствующие скрипты. Они устроены аналогично скриптам, которые меняют яркость.

cat vol_down
#!/bin/bash
VOLUME=`/usr/bin/amixer sget Master | grep Left: | sed -e "s/[^[]*\[\([^%]*\).*/\1/"`
VOL=`/usr/bin/amixer sget Master | grep Left: | cut -f8 -d\ `
if [ "$VOL" == "[off]" ]; then
COL="red"
else
COL="green"
fi

(( VOLUME = VOLUME - 10 ))

if [ $VOLUME -lt 0 ]; then
VOLUME=0
fi
/usr/bin/amixer -q sset Master ${VOLUME}%
osd_cat -p bottom -o 50 -A center -b percentage --percentage=$VOLUME -c $COL \
 --text=Volume -d 1 -f  -*-verdana-bold-r-*-*-*-*-*-*-*-*-*-* &

cat vol_mute
#!/bin/bash
VOLUME=`/usr/bin/amixer sget Master | grep Left: | sed -e "s/[^[]*\[\([^%]*\).*/\1/"`
VOL=`/usr/bin/amixer sget Master | grep Left: | cut -f8 -d\ `
if [ "$VOL" == "[off]" ]; then
/usr/bin/amixer -q sset Master on
osd_cat -p bottom -o 50 -A center -b percentage --percentage=$VOLUME -c green \
 --text=Volume -d 1 -f  -*-verdana-bold-r-*-*-*-*-*-*-*-*-*-* &
else
/usr/bin/amixer -q sset Master off
osd_cat -p bottom -o 50 -A center -b percentage --percentage=$VOLUME -c red \
 --text=Volume -d 1 -f  -*-verdana-bold-r-*-*-*-*-*-*-*-*-*-* &
fi


cat vol_up
#!/bin/bash
VOLUME=`/usr/bin/amixer sget Master | grep Left: | sed -e "s/[^[]*\[\([^%]*\).*/\1/"`
VOL=`/usr/bin/amixer sget Master | grep Left: | cut -f8 -d\ `
if [ "$VOL" == "[off]" ]; then
COL="red"
else
COL="green"
fi

(( VOLUME = VOLUME + 10 ))

if [ $VOLUME -gt 100 ]; then
VOLUME=100
fi
/usr/bin/amixer -q sset Master ${VOLUME}%
osd_cat -p bottom -o 50 -A center -b percentage --percentage=$VOLUME -c $COL \
 --text=Volume -d 1 -f  -*-verdana-bold-r-*-*-*-*-*-*-*-*-*-* &

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

Что бы не мучаться, я написал маленький файлик и грязным хаком (просто залез в конфиг wdm и добавил вызов) прицепил к windowmaker. В KDE его надо просто положить в папочку Autostart.

$ cat .Xautoexec
#!/bin/bash
xhost local:root
xmodmap .Xmodmap
xbindkeys
xscreensaver &

Из нерассказанного тут только одна строчка: screensaver&. Она служит для запуска хранителя экрана. По умолчанию он загрузится в фоне и будет ждать соответсвующего события. Настроить его можно вызвав xscreensaver-demo.

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

DMCA и RIAA - в студию!

Ну и как же без копирайтов. Этот текст распространяется под лицензией Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License

Creative Commons License This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.

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

© 2008 Вячеслав Калошин multik@multik.org