Przejdź to tekstu

Zaszyfrowany debian from scratch przy wykorzystaniu debootstrap

Kategoria: Artykuły, etykiety: lvm, szyfrowanie, debootstrap, instalacja, konfiguracja, extlinux, openbox

Dodany przez: morfik, 2013-06-25 18:47 (zmodyfikowany: 2014-10-11 00:21)

Wyświetleń: 22716

1. Wstęp

Instalowanie debiana z wykorzystaniem debootstrap trochę się różni od instalacji przy użyciu instalatora. Wszystko trzeba robić ręcznie i nic nie zrobi się automatycznie. Całą konfigurację trzeba samemu dostosować. Plus tego rozwiązania jest oczywisty -- mamy całkowitą władzę nad tym co się w systemie znajdzie oraz jak będzie on skonfigurowany. By mieć możliwość przeprowadzenia tego typu instalacji potrzebny jest działający system. Może to być płytka live z ubuntu, debianem albo z innym systemem, na którym można zainstalować debootstrap, np. może się też do tego celu nadać płytka archlinuxa, choć używanie płytek innych dystrybucji może się okazać wielce nieporęczne.

Można też wykorzystać już zainstalowany system operacyjny -- niekoniecznie musi to być płytka live. Jedyne czego potrzeba nam to dostęp do mirrora, z którego pobierzemy potrzebne pakiety składające się na podstawowy system operacyjny. No i oczywiście w przeciwieństwie do instalatora debiana, mamy dostęp do graficznego środowiska, a w nim do przeglądarki i w przypadku utknięcia gdzieś po drodze podczas instalacji, możemy sobie wygooglać napotkane problemy nie przerywając przy tym prac instalacyjnych.

Ja w swojej instalacji skorzystałem z płytki ubuntu live 13.04. W przypadku korzystania z innej płytki z linii debiana, polecenia nie powinny się różnić. Prawdopodobnie część kroków przeprowadzanych w tym tutorialu będzie trzeba odpowiednio dostosować do konfiguracji pc. Dlatego też napiszę jaki mam sprzęt: procek pentium D (64bit), 1GiB RAM, grafika Geforce 7600GT. Grafikę zawszę miałem od nvidii, także nie mam pojęcia jakie pakiety są potrzebne w przypadku instalacji sterowników do innych kart graficznych.

System będzie znajdował się na 2 partycjach fizycznych. Jedna z nich będzie zaszyfrowana oraz wewnątrz zaszyfrowanego kontenera zostaną umieszczone 4 voluminy przy wykorzystaniu LVM (/ , /home , /tmp , SWAP). Druga partycja będzie przeznaczona na pliki bootloadera -- /boot. Będzie to klasyczna konfiguracja BIOS-MBR. Nigdy nie korzystałem z EFI ani GPT, także nic na ten temat za bardzo nie napiszę.

2. Live-cd

2.1. Instalacja potrzebnych narzędzi

Jeżeli posiadamy już wspomnianą płytkę, możemy przejść do tworzenia środowiska pod nasz nowiutki system operacyjny. Wsadzamy CD do napędu, startujemy PC i czekamy na załadowanie się systemu live, po czym logujemy się na roota w terminalu i instalujemy potrzebne nam pakiety:

$ sudo su
# apt-get install debootstrap lvm2 cryptsetup
# modprobe dm_mod

Prawdopodobnie nie będzie potrzeby ręcznego ładowania modułów (modprobe dm_mod), w każdym razie jeśli są problemy z jakimiś poleceniami, trzeba będzie ten moduł załadować ręcznie.

2.2. Przygotowywanie dysku

Przejdźmy zatem do partycjonowania dysku. Ja w tym celu wykorzystałem cfdisk. Można również wykorzystać dobrodziejstwo trybu graficznego i posłużyć się gparted. Sprawdzenie aktualnego układu partycji na dysku możemy dokonać przez wpisanie w terminalu polecenia lsblk . Tak wygląda konfiguracja mojego dysku:

# lsblk
NAME                        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                           8:0    0  74,5G  0 disk
├─sda1                        8:1    0    28G  0 part
├─sda2                        8:2    0   957M  0 part
├─sda3                        8:3    0     1K  0 part
├─sda5                        8:5    0  18,6G  0 part
├─sda6                        8:6    0  18,6G  0 part
└─sda7                        8:7    0   8,4G  0 part
sr0                          11:0    1   4,4G  0 rom   /cdrom
loop0                         7:0    0 757,3M  1 loop  /rofs

Jak widać powyżej, mój dysk posiada dwie partycje podstawowe (sda1, sda2) oraz 3 partycje rozszerzone (sda5, sda6, sda7). Na tym dysku aktualnie są zainstalowane 3 systemy operacyjne i prawdopodobnie wasz układ partycji będzie inny, mniej skomplikowany. Będę operował na strukturze partycji wypisanej wyżej. Jeśli macie inną konfigurację dysku, musicie pozmieniać odpowiednio numerki partycji.

Co się kryje na moim dysku?

  • sda1 -- winxp
  • sda2 -- /boot/
  • sda5 -- zaszyfrowany archlinux
  • sda6 -- tutaj będzie instalowany debian
  • sda7 -- partycja z lokalnym mirrorem -- będą tu przechowywane paczki, które zostaną pobrane przy instalacji.

2.3. Tworzenie szyfrowanego kontenera pod LVM

Pierwszym krokiem jaki musimy poczynić po ustawieniu partycji jest utworzenie zaszyfrowanego kontenera, w którym następnie umieścimy logiczne voluminy pod instalowany system. Wpisujemy taką linijkę do terminala:

# cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 5000 --use-random --verify-passphrase --verbose luksFormat /dev/sda6

Jeśli ktoś jest ciekaw co oznaczają użyte opcje, może poczytać o nich tutaj.

Po wciśnięciu entera powinniśmy zobaczyć poniższy komunikat:

WARNING!
========
This will overwrite data on /dev/sda6 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.

Kontener został utworzony. Jego nagłówek możemy podejrzeć za pomocą:

# cryptsetup luksDump /dev/sda6
LUKS header information for /dev/sda6

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha512
Payload offset: 4096
MK bits:        512
MK digest:      8d 8b 6e d0 9c c0 99 e1 58 3b 25 f6 60 b8 12 e9 7d af cd 71
MK salt:        3b cc 60 03 cf 92 80 58 1d b5 cf 83 51 4d 9c 14
                e6 8f 90 91 ca 7f 76 69 7c c9 dc 86 9d 53 36 59
MK iterations:  18750
UUID:           d8138ecf-04e0-45bf-88a2-edf10d574c0f

Key Slot 0: ENABLED
    Iterations:             77446
    Salt:                   86 2c a7 f3 d0 62 b4 93 8e 8b e5 60 29 4a 30 24
                            80 cc b7 8c 5e 39 62 5c b6 a0 5f 90 cf e5 96 53
    Key material offset:    8
    AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Oczywiście można dowolnie tym nagłówkiem zarządzać ale nie będę opisywał tego w tym artykule. To jest zagadnienie na inny tekst, który być może powstanie w niedługim czasie. W każdym razie, musimy jeszcze do tego kontenera uzyskać dostęp by mieć możliwość zapisywania w nim informacji. Otwieramy kontener za pomocą:

# cryptsetup luksOpen /dev/sda6 sda6_crypt
Enter passphrase for /dev/sda6:

Przy czym ostatni parametr (sda6_crypt) ustawiamy w zależności od tego, na której partycji jest zaszyfrowany kontener. Jeśli to by było /dev/sda2 , wpisałbym tam sda2_crypt .

Po otwarciu, kontener powinien być widoczny przez system:

# ls -al /dev/mapper/
total 0
drwxr-xr-x  2 root root      80 cze 11 09:12 .
drwxr-xr-x 15 root root    4320 cze 11 09:12 ..
crw-------  1 root root 10, 236 cze 11 09:01 control
lrwxrwxrwx  1 root root       7 cze 11 09:13 sda6_crypt -> ../dm-0

2.4. Tworzenie voluminów

Za pomocą pvcreate wskażemy systemowi by używał danego dysku jako przestrzeń pod LVM. Przy czym, nie podajemy zaszyfrowanego /dev/sda6 tylko odszyfrowany /dev/mapper/sda6_crypt .

# pvcreate /dev/mapper/sda6_crypt
  Writing physical volume data to disk "/dev/mapper/sda6_crypt"
  Physical volume "/dev/mapper/sda6_crypt" successfully created

Jeśli wszystko przebiegło pomyślnie, możemy sprawdzić jak wygląda powierzchnia przeznaczona pod LVM:

# pvscan
  PV /dev/mapper/sda6_crypt   VG deb_crypt   lvm2 [18,62 GiB / 18,62 GiB free]
  Total: 1 [18,62 GiB] / in use: 1 [18,62 GiB] / in no VG: 0 [0   ]
# pvdisplay
  --- Physical volume ---
  PV Name               /dev/mapper/sda6_crypt
  VG Name               deb_crypt
  PV Size               18,63 GiB / not usable 3,16 MiB
  Allocatable           yes
  PE Size               4,00 MiB
  Total PE              4768
  Free PE               4768
  Allocated PE          0
  PV UUID               1EqB9E-mb60-sUcL-KCmg-6Vaj-Oih2-iB3lJz

Tworzymy grupę voluminów, w której zostaną utworzone virtualne partycje:

# vgcreate deb_crypt /dev/mapper/sda6_crypt
  Volume group "deb_crypt" successfully created
# lvcreate -L 12G -C y -n root deb_crypt
  Logical volume "root" created
# lvcreate -L 3,5G -C y -n home deb_crypt
  Logical volume "home" created
# lvcreate -L 2G -C y -n tmp deb_crypt
  Logical volume "tmp" created
# lvcreate -l +100%FREE -C y -n swap deb_crypt
  Logical volume "swap" created
# pvscan
  PV /dev/mapper/sda6_crypt   VG deb_crypt   lvm2 [18,62 GiB / 0    free]
  Total: 1 [18,62 GiB] / in use: 1 [18,62 GiB] / in no VG: 0 [0   ]

Wyjaśnienie opcji:

  • -L -- rozmiar voluminu
  • -C -- czy przestrzeń ma być ciągła, domyślnie nie jest co ułatwia znacząco zmienianie rozmiarów dysków
  • -n -- etykieta, pod taką nazwą będzie widziany dysk w systemie
  • deb_crypt -- nazwa grupy voluminów, w której virtualny dysk zostanie utworzony
  • -l (małe L) -- ustawia rozmiar dysku w oparciu o % a nie o GiB. W przypadku wybrania +100%FREE , zostanie użyta dostępna wolna przestrzeń.

W przypadku gdybyśmy utworzyli volumin, który nie spełnia naszych oczekiwań możemy go bez problemu usunąć:

# lvremove /dev/deb_crypt/home
Do you really want to remove active logical volume home? [y/n]: y
  Logical volume "home" successfully removed

Sprawdźmy zatem czy utworzyliśmy wszystko tak jak chcieliśmy.

# lvscan
  ACTIVE            '/dev/deb_crypt/root' [12,00 GiB] contiguous
  ACTIVE            '/dev/deb_crypt/home' [3,50 GiB] contiguous
  ACTIVE            '/dev/deb_crypt/tmp' [2,00 GiB] contiguous
  ACTIVE            '/dev/deb_crypt/swap' [1,12 GiB] contiguous

# lsblk
NAME                        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                           8:0    0  74,5G  0 disk
├─sda1                        8:1    0    28G  0 part
├─sda2                        8:2    0   957M  0 part
├─sda3                        8:3    0     1K  0 part
├─sda5                        8:5    0  18,6G  0 part
├─sda6                        8:6    0  18,6G  0 part
│ └─sda6_crypt (dm-0)       252:0    0  18,6G  0 crypt
│   ├─deb_crypt-root (dm-1) 252:1    0    12G  0 lvm
│   ├─deb_crypt-home (dm-2) 252:2    0   3,5G  0 lvm
│   ├─deb_crypt-tmp (dm-3)  252:3    0     2G  0 lvm
│   └─deb_crypt-swap (dm-4) 252:4    0   1,1G  0 lvm
└─sda7                        8:7    0   8,4G  0 part
sr0                          11:0    1   4,4G  0 rom   /cdrom
loop0                         7:0    0 757,3M  1 loop  /rofs

Wygląda dobrze. Do zaszyfrowanych voluminów można się odwoływać na różne sposoby:

Przez /dev/mapper/ :

# ls -al /dev/mapper/
total 0
drwxr-xr-x  2 root root     160 cze 11 09:24 .
drwxr-xr-x 16 root root    4420 cze 11 09:24 ..
crw-------  1 root root 10, 236 cze 11 09:01 control
lrwxrwxrwx  1 root root       7 cze 11 09:23 deb_crypt-home -> ../dm-2
lrwxrwxrwx  1 root root       7 cze 11 09:18 deb_crypt-root -> ../dm-1
lrwxrwxrwx  1 root root       7 cze 11 09:24 deb_crypt-swap -> ../dm-4
lrwxrwxrwx  1 root root       7 cze 11 09:24 deb_crypt-tmp -> ../dm-3
lrwxrwxrwx  1 root root       7 cze 11 09:24 sda6_crypt -> ../dm-0

Przez /dev/nazwa_grupy_voluminów/ :

# ls -al /dev/deb_crypt/
total 0
drwxr-xr-x  2 root root  120 cze 11 09:24 .
drwxr-xr-x 16 root root 4420 cze 11 09:24 ..
lrwxrwxrwx  1 root root    7 cze 11 09:23 home -> ../dm-2
lrwxrwxrwx  1 root root    7 cze 11 09:18 root -> ../dm-1
lrwxrwxrwx  1 root root    7 cze 11 09:24 swap -> ../dm-4
lrwxrwxrwx  1 root root    7 cze 11 09:24 tmp -> ../dm-3

Można również przez urządzenia /dev/dm-*

# ls -al /dev | grep -i dm-
brw-rw----   1 root   disk    252,   0 cze 11 09:24 dm-0
brw-rw----   1 root   disk    252,   1 cze 11 09:18 dm-1
brw-rw----   1 root   disk    252,   2 cze 11 09:23 dm-2
brw-rw----   1 root   disk    252,   3 cze 11 09:24 dm-3
brw-rw----   1 root   disk    252,   4 cze 11 09:24 dm-4

Co prawda ten ostatni sposób jest troszeczkę nieporęczny, gdyż nic nam nie mówi nazwa dm-0, dm-1, etc. Za to w poprzednich widzimy, do których urządzeń jest podlinkowana określona i w pełni dla nas zrozumiała nazwa.

Polecenia od zarządzania LVM są bardzo proste w zapamiętaniu:

tworzy   --   wyświetla info    --    usuwa
lvcreate -- lvscan -- lvdisplay -- lvremove  # logiczne voluminy
pvcreate -- pvscan -- pvdisplay -- pvremove  # przestrzeń pod LVM
vgcreate -- vgscan -- vgdisplay -- vgremove  # grupa voluminów

Inne polecenia używane przy operacji na LVM można przejrzeć przez wpisanie vg, pv, lv + tab.

2.5. Tworzenie systemu plików

Mamy utworzone 4 voluminy wewnątrz zaszyfrowanego kontenera. Nie możemy ich jeszcze podmontować gdyż potrzebują one systemu plików. Będziemy tworzyć system plików dla / , /home , /tmp oraz /boot . Do jego utworzenia posłuży nam narzędzie mkfs . Jest niezły wybór:

mkfs.bfs       mkfs.exfat     mkfs.ext4      mkfs.hfsplus   mkfs.msdos     mkfs.reiser4   mkfs.vfat
mkfs.btrfs     mkfs.ext2      mkfs.ext4dev   mkfs.jfs       mkfs.nilfs2    mkfs.reiserfs  mkfs.xfs
mkfs.cramfs    mkfs.ext3      mkfs.hfs       mkfs.minix     mkfs.ntfs      mkfs.ufs

Tworzymy system plików ext4, czyli wykorzystamy mkfs.ext4 :

# mkfs.ext4 -m 0 -L root /dev/mapper/deb_crypt-root
# mkfs.ext4 -m 0 -L home /dev/mapper/deb_crypt-home
# mkfs.ext4 -m 0 -L tmp /dev/mapper/deb_crypt-tmp
# mkfs.ext4 -m 0 -L boot /dev/sda2

Użyte opcje odpowiadają za:

  • -m 0 -- brak zarezerwowanej przestrzeni
  • -L -- etykieta voluminu

Dodatkowo trzeba utworzyć przestrzeń wymiany:

# mkswap /dev/mapper/deb_crypt-swap
mkswap: /dev/mapper/deb_crypt-swap: warning: don't erase bootbits sectors
        on whole disk. Use -f to force.
Setting up swapspace version 1, size = 1179644 KiB
no label, UUID=6c811650-60a7-4109-8f70-dd1c24e2b6c0

2.6. Montowanie systemów plików

Teraz już tylko trzeba podmontować wszystko w odpowiednie miejsce. Kolejność montowania jest ważna oraz w przypadku zaszyfrowanych partycji odwołujemy się do linków w /dev/mapper/ zamiast do urządzeń typu /dev/sda6 :

# mount /dev/mapper/deb_crypt-root /mnt
# mkdir /mnt/{boot,home,tmp,media}
# mount /dev/sda2 /mnt/boot/
# mount /dev/mapper/deb_crypt-home /mnt/home/
# mount /dev/mapper/deb_crypt-tmp /mnt/tmp/
# mkdir /mnt/media/backup
# mount /dev/sda7 /mnt/media/backup

Aktywujemy przestrzeń wymiany:

# swapon /dev/mapper/deb_crypt-swap

W tej chwili nasz dysk powinien się prezentować jak poniżej:

# lsblk
NAME                        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                           8:0    0  74,5G  0 disk
├─sda1                        8:1    0    28G  0 part
├─sda2                        8:2    0   957M  0 part  /mnt/boot
├─sda3                        8:3    0     1K  0 part
├─sda5                        8:5    0  18,6G  0 part
├─sda6                        8:6    0  18,6G  0 part
│ └─sda6_crypt (dm-0)       252:0    0  18,6G  0 crypt
│   ├─deb_crypt-root (dm-1) 252:1    0    12G  0 lvm   /mnt
│   ├─deb_crypt-home (dm-2) 252:2    0   3,5G  0 lvm   /mnt/home
│   ├─deb_crypt-tmp (dm-3)  252:3    0     2G  0 lvm   /mnt/tmp
│   └─deb_crypt-swap (dm-4) 252:4    0   1,1G  0 lvm   [SWAP]
└─sda7                        8:7    0   8,4G  0 part  /mnt/media/backup
sr0                          11:0    1   4,4G  0 rom   /cdrom
loop0                         7:0    0 757,3M  1 loop  /rofs

Przygotowaliśmy sobie właśnie dysk pod instalację świeżego systemu. W przypadku gdybyśmy w przyszłości musieli wgrać system na nowo, możemy użyć tego setupu i zacząć od tego miejsca.

2.7. Wykorzystanie debootstrap

W przypadku wystąpienia błędów, najlepszym rozwiązaniem jest dociągnięcie najnowszej wersji debootstrap. Można pobrać ją stąd. Do zainstalowania debiana wykorzystałem debootstrap_1.0.52_all.deb . W katalogu /usr/share/debootstrap/scripts/ można podejrzeć jakie systemy mogą zostać zainstalowane przy użyciu debootstrap. Jako, że niedawno była aktualizacja wydania debiana, starsze wersje debootstrap mogą wrzucać błąd przy instalacji jessie. W każdym razie, zawsze można wybrać testing. Przejdźmy zatem do instalacji bardzo podstawowego systemu:

# debootstrap --verbose --arch amd64 testing /mnt http://ftp.pl.debian.org/debian
I: Retrieving Release
W: Cannot check Release signature; keyring file not available /usr/share/keyrings/debian-archive-keyring.gpg
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
I: Found additional required dependencies: insserv libbz2-1.0 libcap2 libdb5.1 libsemanage-common libsemanage1 libslang2 libustr-1.0-1
I: Found additional base dependencies: libee0 libept1.4.12 libestr0 libgcrypt11 libgnutls-openssl27 libgnutls26 libgpg-error0 libidn11 libjson0 liblognorm0 libmnl0 libnetfilter-acct1 libnfnetlink0 libp11-kit0 libsqlite3-0 libtasn1-3 libxapian22
I: Checking component main on http://ftp.pl.debian.org/debian...
I: Retrieving libacl1 2.2.52-1
I: Validating lib..acl1 2.2.52-1
...
I: Base system installed successfully.

Możemy też przeprowadzić symulację instalacji dodając parametr --print-debs i zobaczyć jakie paczki zostaną zainstalowane:

I: Found additional base dependencies: libee0 libept1.4.12 libestr0 
libgcrypt11 libgnutls-openssl27 libgnutls26 libgpg-error0 libidn11 libjson-c2 
liblognorm0 libmnl0 libnetfilter-acct1 libnfnetlink0 libp11-kit0 libsqlite3-0 
libtasn1-3 libxapian22
base-files base-passwd bash bsdutils coreutils dash debconf debconf-i18n debianutils
diffutils dpkg e2fslibs e2fsprogs findutils gcc-4.7-base gcc-4.8-base grep gzip
hostname initscripts insserv libacl1 libattr1 libblkid1 libbz2-1.0 libc-bin libc6
libcap2 libcomerr2 libdb5.1 libgcc1 liblocale-gettext-perl liblzma5 libmount1
libncurses5 libpam-modules libpam-modules-bin libpam-runtime libpam0g libpcre3
libselinux1 libsemanage-common libsemanage1 libsepol1 libslang2 libss2
libtext-charwidth-perl libtext-iconv-perl libtext-wrapi18n-perl libtinfo5
libustr-1.0-1 libuuid1 login lsb-base mawk mount multiarch-support ncurses-base
ncurses-bin passwd perl-base sed sensible-utils sysv-rc sysvinit sysvinit-utils
tar tzdata util-linux zlib1g adduser apt apt-utils aptitude aptitude-common
bsdmainutils cpio cron debian-archive-keyring dmidecode gnupg gpgv groff-base
ifupdown info install-info iproute iproute2 iptables iputils-ping isc-dhcp-client
isc-dhcp-common kmod libapt-inst1.5 libapt-pkg4.12 libboost-iostreams1.49.0
libboost-iostreams1.53.0 libcwidget3 libee0 libept1.4.12 libestr0 libgcrypt11 
libgdbm3 libgnutls-openssl27 libgnutls26 libgpg-error0 libidn11 libjson-c2 
libkmod2 liblognorm0 libmnl0 libncursesw5 libnetfilter-acct1 libnewt0.52 
libnfnetlink0 libp11-kit0 libpipeline1 libpopt0 libprocps0 libprocps1 libreadline6
libsigc++-2.0-0c2a libsqlite3-0 libssl1.0.0 libstdc++6 libtasn1-3 libudev0 
libusb-0.1-4 libxapian22 libxtables10 logrotate man-db manpages nano net-tools 
netbase netcat-traditional nfacct procps readline-common rsyslog tasksel tasksel-data
traceroute udev vim-common vim-tiny wget whiptail

Są to pakiety z priorytetem "required" i "important".

Sama instalacja nie trwała długo ale i też zbyt wiele nie zostało zainstalowane. W każdym razie bardzo podstawowy system mamy już wgrany. Co prawda jest nieskonfigurowany i nie da się go jeszcze uruchomić ale popracujemy nad tym. xD

2.8. Chroot

2.8.1. Tworzenie środowiska pod chroot

By móc operować na nowym systemie, potrzebujemy ustawić środowisko chroot:

# mount -o bind /dev/ /mnt/dev/
# mount -o bind /dev/pts /mnt/dev/pts
# mount -o bind /proc /mnt/proc
# mount -o bind /sys /mnt/sys
# cp /etc/resolv.conf /mnt/etc/resolv.conf
# chroot /mnt/ /bin/bash

Od tej chwili wszystkie polecenia będą wydawane w nowym systemie.

Jeszcze taka jedna uwaga. W przypadku zawału systemu wszystko jedno z jakiego powodu, dobrze jest mieć spisaną procedurę odzyskiwania systemu. Opisałem ją w paru słowach tutaj. Przy czym, interesuje nas tylko sekcja odpowiedzialna za dostanie się do zaszyfrowanego dysku.

2.8.2. Wstępna konfiguracja systemu

Pierwsze co robimy, to sprawdzamy czy mamy połączenie z netem:

# ping wp.pl -c 3
PING wp.pl (212.77.100.101) 56(84) bytes of data.
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=1 ttl=247 time=19.8 ms
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=2 ttl=247 time=17.0 ms
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=3 ttl=247 time=16.1 ms

--- wp.pl ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 16.134/17.693/19.862/1.585 ms

Jest dobrze. Można przejść do konfiguracji systemu. W tym celu aktualizujemy listę pakietów oraz instalujemy kilka potrzebnych narzędzi:

# apt-get update
# apt-get install aptitude
# aptitude install locales tzdata console-setup keyboard-configuration hwdata \
vim mc ntp cryptsetup lvm2 dmsetup gpm bash-completion memtest86+

Za pomocą dpkg-reconfigure będziemy konfigurować poszczególne pakiety. Konfiguracja jest przechowywana w odpowiednich plikach i informacja o położeniu tych plików przyda nam się gdy będziemy robić backup ustawień systemowych, by nie musieć ponownie wszystkiego konfigurować na wypadek wgrywania nowego systemu.

2.8.3. Plik /etc/default/locale

W tym pliku są przechowywane zmienne językowe LANG oraz inne zmienne z prefixem LC_ . Do wyboru mamy:

LANG=
LANGUAGE=
LC_CTYPE=
LC_NUMERIC=
LC_TIME=
LC_COLLATE=
LC_MONETARY=
LC_MESSAGES=
LC_PAPER=
LC_NAME=
LC_ADDRESS=
LC_TELEPHONE=
LC_MEASUREMENT=
LC_IDENTIFICATION=
LC_ALL=

Domyślną konfigurację jeżyka możemy ustawić przez:

# dpkg-reconfigure locales

Wybieramy kolejno: en_US.UTF-8, pl_PL.UTF-8 -> pl_PL.UTF-8 . Utworzy to plik /etc/default/locale o treści:

#  File generated by update-locale
LANG="pl_PL.UTF-8"

By zmienić którąś ze zmiennych wypisanych wyżej, wystarczy dodać ją do tego pliku i odpowiednio ustawić. Ja zwykle korzystam też z en_US.UTF-8 .

2.8.4. Plik /etc/default/keyboard

Konfiguracja w tym pliku dotyczy chyba tylko tty -- xorga trzeba konfigurować oddzielnie w jego pliku konfiguracyjnym. W ceku skonfigurowania klawiatury, wydajemy polecenie:

# dpkg-reconfigure keyboard-configuration

Wybieramy odpowiednio: model klawiatury -> Polski -> Domyślne -> bez klawisza Compose . Utworzy to plik /etc/default/keyboard o treści:


# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="logimel"
XKBLAYOUT="pl"
XKBVARIANT=""
XKBOPTIONS="terminate:ctrl_alt_bksp"

BACKSPACE="guess"

By ustawić odpowiedni układ klawiatury już podczas startu systemu, trzeba zmienić w pliku /etc/initramfs-tools/initramfs.conf KEYMAP=y oraz wygenerować nowy initramfs za pomocą update-initramfs -u. Tego na razie nie musimy robić, przyda się dopiero w chwili jak zainstalujemy kernela.

2.8.5. Plik /etc/default/console-setup

Wielu ludzi narzeka na brak polskich znaków pod tty. Konfiguracja console-setup powinna rozwiązać ten problem:

# dpkg-reconfigure console-setup

Wybieramy kolejno: ustawienia terminala UTF-8 -> Latin2 -> Terminus -> 8x16 . Utworzy to plik /etc/default/console-setup o treści:

# CONFIGURATION FILE FOR SETUPCON

# Consult the console-setup(5) manual page.

ACTIVE_CONSOLES="/dev/tty[1-6]"

CHARMAP="UTF-8"

CODESET="Lat2"
FONTFACE="Terminus"
FONTSIZE="8x16"

VIDEOMODE=

# The following is an example how to use a braille font
# FONT='lat9w-08.psf.gz brl-8x8.psf'

2.8.6. Plik /etc/timezone oraz /etc/localtime

W tych plikach znajdują się ustawienia strefy czasowej. Ustawmy zatem odpowiednią strefę:

# dpkg-reconfigure tzdata

Wybieramy kolejno: Europa -> Warsaw . Czas powinien zostać zmieniony:

Current default time zone: 'Europe/Warsaw'
Local time is now:      Tue Jun 11 13:35:49 CEST 2013.
Universal Time is now:  Tue Jun 11 11:35:49 UTC 2013.

2.8.7. Plik /etc/crypttab

W tym pliku musimy dopisać linijkę odpowiadającą za wskazanie zaszyfrowanej partycji, tak by system podczas startu wiedział, którą partycje musi odszyfrować. Plik ma taką postać:

sda6_crypt   UUID=d8138ecf-04e0-45bf-88a2-edf10d574c0f   none    luks
  • sda6_crypt -- pod taką nazwą otworzyliśmy zaszyfrowany kontener
  • UUID -- można podać tez urządzenie w postaci /dev/sda6

UUID możemy odczytać przez lsblk -o name,uuid lub blkid:

# lsblk -o name,uuid
NAME                        UUID
sda
├─sda1                      5668FA8468FA6263
├─sda2                      27e5bccf-256b-4239-a3a4-c0ed81892869
├─sda3
├─sda5                      a8bf24ad-c8da-4a4b-bb1b-647144a873c8
├─sda6                      d8138ecf-04e0-45bf-88a2-edf10d574c0f
│ └─sda6_crypt (dm-0)       1EqB9E-mb60-sUcL-KCmg-6Vaj-Oih2-iB3lJz
│   ├─deb_crypt-root (dm-1) b19e720d-8fdc-4241-80be-b3024d056f9c
│   ├─deb_crypt-home (dm-2) 97e6f56e-f22b-49ed-b68b-508d6653bc67
│   ├─deb_crypt-tmp (dm-3)  67a82b74-7fbe-4e77-b305-a60a53b4338a
│   └─deb_crypt-swap (dm-4) 6c811650-60a7-4109-8f70-dd1c24e2b6c0
└─sda7                      c751ab48-fe9b-4c83-920e-d3205c6ba7ff
sr0
loop0

UUID musi wskazywać na zaszyfrowaną partycję /dev/sda6 . W przypadku gdy dokonamy jakichkolwiek zmian w /etc/crypttab , trzeba zawsze wygenerować nowy initramfs (update-initramfs -u), inaczej system nie odszyfruje odpowiedniej partycji. My nie mamy jeszcze kernela zainstalowanego, także bez obaw.

2.8.8. Plik /etc/inittab

Dokładne wyjaśnienie struktury tego pliku można znaleźć pod tym linkiem. My wyłączymy w nim tylko czyszczenie pierwszej konsoli tty w taki sposób, by po załadowaniu się systemu móc podejrzeć czy proces bootowania przebiegł bez problemów. Oczywiście możemy też doinstalować bootlogd , który logi z tty1 zapisze w pliku /var/log/boot .

By wyłączyć czyszczenie tty1 po uruchomieniu się systemu, dodajemy parametr --noclear do linijki:

1:2345:respawn:/sbin/getty 38400 --noclear tty1

2.8.9. Plik /etc/initramfs-tools/conf.d/resume

W przypadku gdyby uległa zmianie partycja SWAP, trzeba o tym fakcie poinformować kernel:

RESUME=/dev/mapper/deb_crypt-swap

Po jej edycji trzeba wygenerować nowy initramfs (update-initramfs -u).

2.8.10. Plik /etc/adjtime

W tym pliku jest przechowywana konfiguracja zegara sprzętowego. System w oparciu o ten plik ustawia czas systemowy. Plik możemy wygenerować przez:

# hwclock --systohc --utc

i ma on postać:

0.005994 1371536117 0.000000
1371536117
UTC

2.8.11. Plik /etc/apt/sources.list

Plik /etc/apt/sources.list został utworzony przez debootstrap przy instalacji systemu. Zawiera on tylko jeden wpis. Poniżej zamieszczam swój plik i w oparciu o niego przebiegnie dalszy proces instalacji systemu. Oto ten plik:

#wheezy - stable #
#   deb     http://ftp.pl.debian.org/debian/ stable main non-free contrib
#   deb-src http://ftp.pl.debian.org/debian/ stable main non-free contrib
#   deb     http://security.debian.org/ stable/updates main contrib non-free
#   deb-src http://security.debian.org/ stable/updates main contrib non-free

#   deb     http://mirrors.kernel.org/debian wheezy-updates main contrib
#   deb-src http://mirrors.kernel.org/debian wheezy-updates main contrib

#   deb     ftp://ftp.deb-multimedia.org stable main non-free
#   deb-src ftp://ftp.deb-multimedia.org stable main non-free

#   deb     http://ftp.pl.debian.org/debian/ wheezy-backports main

# jessie - testing #
    deb     http://ftp.pl.debian.org/debian/ testing main non-free contrib
#    deb-src http://ftp.pl.debian.org/debian/ testing main non-free contrib
    deb     http://security.debian.org/ testing/updates main contrib non-free
#    deb-src http://security.debian.org/ testing/updates main contrib non-free

#   deb     ftp://ftp.deb-multimedia.org testing main non-free
#   deb-src ftp://ftp.deb-multimedia.org testing main non-free

# SID #
    deb     http://ftp.pl.debian.org/debian/ sid main non-free contrib
#    deb-src http://ftp.pl.debian.org/debian/ sid main non-free contrib
   
    deb     ftp://ftp.deb-multimedia.org sid main non-free
#   deb-src ftp://ftp.deb-multimedia.org sid main non-free

# AptoSID #
#    deb     http://debian.tu-bs.de/project/aptosid/debian/ sid main fix.main
#    deb-src http://debian.tu-bs.de/project/aptosid/debian/ sid main fix.main

#   deb     ftp://ftp.spline.de/pub/aptosid/debian/ sid main fix.main
#   deb-src ftp://ftp.spline.de/pub/aptosid/debian/ sid main fix.main
    
    deb     http://aptosid.office-vienna.at/aptosid/debian/ sid main fix.main
#   deb-src http://aptosid.office-vienna.at/aptosid/debian/ sid main fix.main

# CRUNCHBANG #
#   deb     http://packages.crunchbang.org/waldorf waldorf main
#   deb-src http://packages.crunchbang.org/waldorf waldorf main

# EXPERIMENTAL #
    deb     http://ftp.pl.debian.org/debian/ experimental main contrib non-free
#   deb-src http://ftp.pl.debian.org/debian/ experimental main contrib non-free

# OP #
# Google chrome #
   deb     http://dl.google.com/linux/chrome/deb/ stable main

# dropbox #
    deb     http://linux.dropbox.com/debian sid main
    
# Spideroak (dropbox) #
    deb http://apt.spideroak.com/debian/ stable non-free

# Gajim #
    deb     ftp://ftp.gajim.org/debian unstable main

# PlayOnLinux #
#   deb     http://deb.playonlinux.com/ squeeze main

# Webmin #
#   deb     http://download.webmin.com/download/repository sarge contrib
#   deb     http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib

# VirtualBox #
#   deb     http://download.virtualbox.org/virtualbox/debian wheezy contrib non-free

# Opera Browser #
#   deb     http://deb.opera.com/opera/ stable non-free
#   deb     http://deb.opera.com/opera-beta/ stable non-free

# flashplugin-nonfree #
#   deb     http://repo.dug.net.pl/dfr/ stable main contrib
#   deb     http://repo.dug.net.pl/dfr/ testing main contrib

#  Jitsi (SIP Communicator) #
#   deb     http://download.sip-communicator.org/deb unstable/

# JonDo #
#   deb     http://debian.anonymous-proxy-servers.net sid main

# TOR #
#   deb     http://deb.torproject.org/torproject.org wheezy main
#   deb     http://deb.torproject.org/torproject.org sid main
#   deb     http://deb.torproject.org/torproject.org experimental-wheezy main
#   deb     http://deb.torproject.org/torproject.org experimental-sid main

# getdeb #
#   deb     http://archive.getdeb.net/ubuntu natty-getdeb apps
#   deb     http://archive.getdeb.net/ubuntu natty-getdeb games

# Moblock (PeerGuardian) #
#   deb     http://moblock-deb.sourceforge.net/debian squeeze main
#   deb-src http://moblock-deb.sourceforge.net/debian squeeze main
#   deb     http://moblock-deb.sourceforge.net/debian wheezy main
#   deb-src http://moblock-deb.sourceforge.net/debian wheezy main
#   deb     http://moblock-deb.sourceforge.net/debian sid main
#   deb-src http://moblock-deb.sourceforge.net/debian sid main

# LiveUSB MultiBoot #
#   deb     http://liveusb.info/multisystem/depot all main

# Spotify music #
#   deb     http://repository.spotify.com stable non-free

# PPA #

# Shutter #
#   deb     http://ppa.launchpad.net/shutter/ppa/ubuntu raring main
#   deb-src http://ppa.launchpad.net/shutter/ppa/ubuntu raring main

# Jdownloader #
#   deb     http://ppa.launchpad.net/jd-team/jdownloader/ubuntu saucy main
#   deb-src http://ppa.launchpad.net/jd-team/jdownloader/ubuntu saucy main

# OpenShot #
#   deb     http://ppa.launchpad.net/openshot.developers/ppa/ubuntu precise main
#   deb-src http://ppa.launchpad.net/openshot.developers/ppa/ubuntu precise main
    deb     http://ppa.launchpad.net/jonoomph/openshot-edge/ubuntu quantal main 
#   deb-src http://ppa.launchpad.net/jonoomph/openshot-edge/ubuntu quantal main 

# Haguichi #
#   deb     http://ppa.launchpad.net/webupd8team/haguichi/ubuntu raring main
#   deb-src http://ppa.launchpad.net/webupd8team/haguichi/ubuntu raring main

# Conky #
#   deb     http://ppa.launchpad.net/conky-companions/ppa/ubuntu quantal main
#   deb-src http://ppa.launchpad.net/conky-companions/ppa/ubuntu quantal main

# i2p #
#   deb     http://ppa.launchpad.net/i2p-maintainers/i2p/ubuntu saucy main
#   deb-src http://ppa.launchpad.net/i2p-maintainers/i2p/ubuntu saucy main

# Java (oracle) #
    deb     http://ppa.launchpad.net/webupd8team/java/ubuntu saucy main
#   deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu saucy main

# qBitorrent #
    deb     http://ppa.launchpad.net/hydr0g3n/qbittorrent-stable/ubuntu raring main 
#   deb-src http://ppa.launchpad.net/hydr0g3n/qbittorrent-stable/ubuntu raring main 
#   deb     http://ppa.launchpad.net/hydr0g3n/qbittorrent-trunk/ubuntu raring main 
#   deb-src http://ppa.launchpad.net/hydr0g3n/qbittorrent-trunk/ubuntu raring main 

# Tuxboot #
#   deb     http://ppa.launchpad.net/thomas.tsai/ubuntu-tuxboot/ubuntu raring main
#   deb-src http://ppa.launchpad.net/thomas.tsai/ubuntu-tuxboot/ubuntu raring main

# Grub Customizer #
#   deb     http://ppa.launchpad.net/danielrichter2007/grub-customizer/ubuntu raring main
#   deb-src http://ppa.launchpad.net/danielrichter2007/grub-customizer/ubuntu raring main

# retroshare (p2p) #
#   deb     http://ppa.launchpad.net/csoler-users/retroshare/ubuntu raring main
#   deb-src http://ppa.launchpad.net/csoler-users/retroshare/ubuntu raring main

# darktable graphic #
#   deb     http://ppa.launchpad.net/pmjdebruijn/darktable-release-plus/ubuntu raring main
#   deb-src http://ppa.launchpad.net/pmjdebruijn/darktable-release-plus/ubuntu raring main

# Google fonty #
#   deb     http://ppa.launchpad.net/andrewsomething/typecatcher/ubuntu saucy main
#   deb-src http://ppa.launchpad.net/andrewsomething/typecatcher/ubuntu saucy main

# Synchronizacja plików #
    deb     http://ppa.launchpad.net/freefilesync/ffs/ubuntu raring main
#   deb-src http://ppa.launchpad.net/freefilesync/ffs/ubuntu raring main

# SMPlayer #
    deb     http://ppa.launchpad.net/rvm/smplayer/ubuntu saucy main
#   deb-src http://ppa.launchpad.net/rvm/smplayer/ubuntu saucy main

# Keepass2 #
    deb     http://ppa.launchpad.net/jtaylor/keepass/ubuntu raring main
#   deb-src http://ppa.launchpad.net/jtaylor/keepass/ubuntu raring main

# Terminator #
    deb     http://ppa.launchpad.net/gnome-terminator/ppa/ubuntu saucy main
#   deb-src http://ppa.launchpad.net/gnome-terminator/ppa/ubuntu saucy main

# WineHQ #
#   deb     http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu saucy main 
#   deb-src http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu saucy main 

# spacefm i udevil #
   deb     http://ignorantguru.github.com/debian/ unstable main

# dnscrypt-proxy #
#   deb     http://ppa.launchpad.net/xuzhen666/dnscrypt/ubuntu saucy main 
#   deb-src http://ppa.launchpad.net/xuzhen666/dnscrypt/ubuntu saucy main 

# mati #
#   deb     http://repozytorium.mati75.eu/debian wheezy-backports main contrib non-free
#   deb-src http://repozytorium.mati75.eu/debian wheezy-backports main contrib non-free

    deb     http://repozytorium.mati75.eu/debian sid main contrib non-free
#   deb-src http://repozytorium.mati75.eu/debian sid main contrib non-free

#   deb     http://repozytorium.mati75.eu/debian experimental main contrib non-free
#   deb-src http://repozytorium.mati75.eu/debian experimental main contrib non-free

# Debian snapshot #
#   deb     http://snapshot.debian.org/archive/debian/20121211T222602Z/ testing main contrib non-free
#   deb-src http://snapshot.debian.org/archive/debian/20121211T222602Z/ testing main contrib non-free

Co prawda, większość wpisów jest wykomentowana ale przecie od tego są znaczki # by nie musieć kasować zawartości pliku, a poza tym zawsze się może to komuś przydać.

2.8.12. Plik /etc/apt/preferences

W tym pliku ustawione są priorytety pakietów. Ja korzystam z obcych źródeł pakietów, dlatego by nie narobić sobie syfu w systemie, potrzebna mi jest kontrola nad tym, z którego repo są instalowane paczki. Tak wygląda mój plik:

Package: *
Pin: release o=Debian,a=testing
Pin-Priority: 900

Package: *
Pin: release o=Debian,a=experimental
Pin-Priority: 130

Package: spacefm spacefm-common spacefm-gtk3
Pin: release o=Debian,a=unstable
Pin-Priority: 910

Package: *
Pin: origin archive.getdeb.net
Pin-Priority: 120

Package: *
Pin: origin sourceforge.net
Pin-Priority: 120

Package: *
Pin: origin ppa.launchpad.net
Pin-Priority: 120

Package: *
Pin: origin repozytorium.mati75.eu
Pin-Priority: 130

Package: *
Pin: origin ignorantguru.github.com
Pin-Priority: 120

2.8.13. Plik /etc/apt/apt.conf.d/70debconf

W tym pliku dodamy dwa parametry dotyczące tego w jaki sposób będą instalowane pakiety:

APT::Install-Recommends "false";
APT::Install-Suggests "false";

Można również sprecyzować w jaki sposób mają być pobierane listy pakietów:

Acquire::PDiffs "false";

Przy czym od tej chwili aptitude nie będzie instalował wszystkiego automatycznie. Przy instalacji pakietu zostanie wyrzucona informacja, że jakieś tam pakiety rekomendowane czy polecane nie zostaną zainstalowane. Warto zwracać uwagę na te komunikaty, bo można wyłapać przydatne, a czasem wręcz i niezbędne dla prawidłowego działania aplikacji, pakiety, które powinny się znaleźć w systemie.

2.8.14. Plik /etc/apt/apt.conf.d/02periodic

Jak wspomniałem na wstępie, utworzymy sobie lokalny mirror z paczkami. Nawet przewidziano sytuację, że ktoś będzie chciał coś takiego mieć (plik /etc/cron.daily/apt). Tworzymy plik /etc/apt/apt.conf.d/02periodic o treści:

#Dir::Cache "var/cache/apt/";
#  - Set apt package cache directory

APT::Periodic::MaxAge "0";
#  - Set maximum allowed age of a cache package file. If a cache
#    package file is older it is deleted (0=disable)

APT::Periodic::MaxSize "0";
#  - Set maximum size of the cache in MB (0=disable). If the cache
#    is bigger, cached package files are deleted until the size
#    requirement is met (the biggest packages will be deleted
#    first).

APT::Periodic::Download-Upgradeable-Packages "1";
#  - Do "apt-get upgrade --download-only" every n-days (0=disable)

#APT::Periodic::Download-Upgradeable-Packages-Debdelta "1";
#  - Use debdelta-upgrade to download updates if available (0=disable)

APT::Periodic::AutocleanInterval "14";
#  - Do "apt-get autoclean" every n-days (0=disable)

APT::Periodic::Verbose "1";
#  - Send report mail to root
#      0:  no report             (or null string)
#      1:  progress report       (actually any string)
#      2:  + command outputs     (remove -qq, remove 2>/dev/null, add -d)
#      3:  + trace on

Oczywiście możemy zdefiniować katalog w powyższym pliku konfiguracyjnym za pomocą Dir::Cache "/media/backup/apt/archives" , ja jednak utworzę katalog i go podlinkuje do /var/cache/apt/archives bez zmiany pliku :

# mkdir -p /media/backup/apt/archives
# mv /var/cache/apt/archives/* /media/backup/apt/archives/
# rm /var/cache/apt/archives/
# ln -s /media/backup/apt/archives /var/cache/apt/archives

Oczywiście prawdopodobnie nie potrzebujecie tego wszystkiego. W każdym razie po dodaniu nowych repozytoriów, musimy dociągnąć odpowiednie klucze:

# aptitude update
...
W: Błąd GPG: http://debian.tu-bs.de sid InRelease: Następujące podpisy nie mogły zostać zweryfikowane z powodu braku klucza publicznego: NO_PUBKEY 9FFAACBAE3BD538B
W: Błąd GPG: http://ignorantguru.github.com unstable InRelease: Następujące podpisy nie mogły zostać zweryfikowane z powodu braku klucza publicznego: NO_PUBKEY 27A5AC5A01937621
# gpg --keyserver keyserver.ubuntu.com --recv-keys 9FFAACBAE3BD538B 27A5AC5A01937621
gpg: katalog ,,/root/.gnupg'' utworzony
gpg: nowy plik ustawień ,,/root/.gnupg/gpg.conf'' został utworzony
gpg: OSTRZEŻENIE: opcje w ,,/root/.gnupg/gpg.conf'' nie są jeszcze uwzględnione.
gpg: zbiór kluczy ,,/root/.gnupg/secring.gpg'' został utworzony
gpg: zbiór kluczy ,,/root/.gnupg/pubring.gpg'' został utworzony
gpg: zapytanie o klucz E3BD538B w serwerze hkp keyserver.ubuntu.com
gpg: zapytanie o klucz 01937621 w serwerze hkp keyserver.ubuntu.com
gpg: /root/.gnupg/trustdb.gpg: baza zaufania utworzona
gpg: klucz E3BD538B: klucz publiczny ,,Stefan Lippers-Hollmann (aptosid.com) <s.l-h@gmx.de>'' wczytano do zbioru
gpg: klucz 01937621: klucz publiczny ,,IgnorantGuru <ignorantguru@gmx.com>'' wczytano do zbioru
gpg: brak absolutnie zaufanych kluczy
gpg: Ogółem przetworzonych kluczy: 2
gpg:          dołączono do zbioru: 2  (RSA: 1)
# gpg --armor --export 9FFAACBAE3BD538B 27A5AC5A01937621 | apt-key add -
OK

2.8.15. Plik /etc/network/interfaces

W przypadku używania standardowych ustawień sieci, trzeba stworzyć plik /etc/network/interfaces lub odkomentować w nim odpowiednie sekcje. Tak wygląda mój plik:

# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source /etc/network/interfaces.d/*

# We always want the loopback interface.
#
auto lo
iface lo inet loopback

# To use dhcp:
#
# allow-hotplug eth0
# auto eth0
# iface eth0 inet dhcp

# An example static IP setup: (broadcast and gateway are optional)
#
auto eth0
iface eth0 inet static
   address 10.1.3.61
   network 10.1.0.0/16
   netmask 255.255.0.0
   broadcast 10.1.255.255
   gateway 10.1.255.253

Będę korzystał z dhcpcd5 do automatycznej konfiguracji przewodowego internetu, bo działa on u mnie znakomicie i przy tym jest łatwo konfigurowalny. Niestety konfliktuje on z ifupdown, który to tworzy plik /etc/network/interfaces . Trzeba zatem wykomentować zawartość tego pliku, zostawiając tylko wpis dla lo . Można oczywiście się też pozbyć tego pakietu ale wówczas mogą pojawić się dziwne problemy przy odpalaniu usług lokalnych, np. serwer mysql czy DNS. Ja pozbyłem się tylko pakietów isc-dhcp-client isc-dhcp-common . W nich znajduje się min dhclient . Jeśli występują jakieś problemy z dhcpcd5 to lepiej jest zostawić te trzy pakiety w spokoju i jechać na domyślnych ustawieniach, odpowiednio przy tym zmieniając /etc/network/interfaces . W przypadku zaawansowanych konfiguracji sieci, można posłużyć się narzędziem ipcalc do wyliczenia wszystkich potrzebnych parametrów.

2.8.16. Plik /etc/hostname

Nazwa hosta jest trzymana w pliku /etc/hostname i wystarczy coś tam wpisać, przy czym, to coś będzie trzeba dopisać do pliku /etc/hosts:

# echo morfikownia > /etc/hostname 

2.8.17. Plik /etc/hosts

Ten plik robi za swojego rodzaju lokalny resolver i bardzo fajnie się za jego pomocą blokuje reklamy na necie. My jednak nie będziemy sobie tym na razie głowy zawracać i dodamy tylko bardzo podstawowe wpisy:

127.0.0.1 localhost
# 127.0.1.1 <host_name>.<domain_name> <host_name>
# 127.0.1.1 morfikownia.mhouse morfikownia
10.1.3.61 morfikownia.mhouse morfikownia

# The following lines are desirable for IPv6 capable hosts
#::1     ip6-localhost ip6-loopback
#fe00::0 ip6-localnet
#ff00::0 ip6-mcastprefix
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters
#ff02::3 ip6-allhosts

Zastanawiający jest wpis od 127.0.1.1 . Zgodnie z tym co wyczytałem na necie, ten adres jest przypisywany automatycznie w przypadku braku stałego adresu ip eliminując tym bugi w pewnych aplikacjach np. z rodziny gnome. W przypadku gdy się posiada stały ip, tak jak ja tutaj w tym przykładzie, w miejsce 127.0.1.1 wpisujemy nasz ip.

Druga sprawa dotyczy tego co znajduje się po adresie ip. Z reguły jest tam jedno pole wskazujące na hostname. U mnie jest jeszcze ustawiona nazwa domeny. Do danego hosta można się odwoływać przez ip, hostname albo przez hostname.domainname. Oczywiście można zrezygnować ze środkowego pola i zostawić tylko relacje ip <-> hostname.

2.8.18. Plik /etc/dhcpcd.conf

W tym pliku jest trzymana konfiguracja dhcpcd5. Musimy pierw go zainstalować i przy okazji pozbyć się zbędnych pakietów:

# aptitude purge isc-dhcp-client isc-dhcp-common
# aptitude install dhcpcd5

Będę korzystał z dnsów, które przy okazji będą szyfrować zapytania, także muszę poinformować dhcpcd by nie zmieniał pliku /etc/resolv.conf . Można to zrobić na kilka sposobów.

Pierwszym z nich jest usunięcie domain_name_servers z pliku /etc/dhcpcd.conf , tak by zostało tam tylko:

option domain_name, domain_search, host_name

Drugim ze sposobów jest dopisanie w /etc/dhcpcd.conf w linijce z nohook resolv.conf :

nohook   ... , resolv.conf

2.8.19. Pliki /etc/resolv.conf i /etc/resolv.conf.head

Ja preferuję pierwszy sposób. Poza tym, dhcpcd obsługuje plik /etc/resolv.conf.head , który to, jak nazwa sugeruje, jest dołączany na początek pliku /etc/resolv.conf . Możemy sobie zdefiniować w nim wiele serwerów DNS i odkomentować pożądane. W przypadku gdy jakiś trzeci program będzie próbował nadpisać /etc/resolv.conf , zrobi to ale nasza zwrotka i tak zostanie dołączona na początku pliku. Tak wygląda mój plik /etc/resolv.conf.head :

# DNScrypt-proxy
nameserver 127.0.0.1
#DNSCRYPT_LOCALIP=127.0.0.1
#DNSCRYPT_LOCALPORT=53
#DNSCRYPT_USER=nobody

# serwery OpenDNS
# nameserver 208.67.222.222
# nameserver 208.67.220.220

# serwery Google
# nameserver 8.8.8.8
# nameserver 8.8.4.4

# serwer riseup
# nameserver 172.27.0.1

2.8.20. Szyfrowany DNS

Na obecną chwilę, zakomentujmy 127.0.0.1 i odkomentujmy "serwery OpenDNS", w przeciwnym wypadku uniemożliwi to nam korzystanie z internetu. xD O tym jak skonfigurować szyfrowany DNS pisałem tutaj.

2.8.21. Plik /etc/udev/rules.d/70-persistent-net.rules

Ciekawą opcją jest też zmiana nazw interfejsów sieciowych. Można to osiągnąć przez plik /etc/udev/rules.d/70-persistent-net.rules :


# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x10ec:/sys/devices/pci0000:00/0000:00:1e.0/0000:03:02.0 (8139too)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:e0:4c:75:03:09", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Zgodnie z info na wstępie, plik jest generowany automatycznie ale umożliwia nam zmianę parametru NAME . Ja jednak zostawię domyślne eth0 .

2.8.22. Pliki /etc/fstab , /etc/mtab oraz /proc/mounts

Nie znalazłem żadnej satysfakcjonującej mnie metody generowania pliku /etc/fstab . Jest milusi skrypt genfstab z archlinuxa ale pakiety w debianie są zbyt stare by ten skrypt chciał działać prawidłowo. W przypadku gdy nie używamy UUID, możemy przekopiować zawartość /etc/mtab do /etc/fstab i usunąć zbędne wpisy :

# cat /etc/mtab > /etc/fstab

Oczywiście w naszym systemie jeszcze nie posiadamy pliku /etc/mtab , a ten z kolei jest dowiązaniem do /proc/mounts . Co ciekawe podczas generowania initramfs przy instalacji kernela, zostanie wyrzucony szereg błędów spowodowany brakiem tego skrótu. Dlatego też musimy go sobie pierw utworzyć:

# ln -s /proc/mounts /etc/mtab

Używanie UUID też nie jest konieczne. Jeżeli używamy jednego dysku na tej samej maszynie i nie podpinamy żadnych nośników z których można zabootować inne systemy operacyjne, prawdopodobnie UUID do niczego nam się nie przyda, bo partycja /dev/sda2 będzie zawsze widoczna jako /dev/sda2 i nigdy się nie zmieni. Ale w przypadku posiadania kilku dysków, nazwy urządzeń mogą ulec zmianie, zwłaszcza przy innym podłączeniu fizycznym nośnika na płycie głównej. Wtedy z /dev/sda2 może się nieoczekiwanie zrobić /dev/sdb2 i nie mając UUID, system się nie odpali -- trzeba będzie przepisywać wszystkie wpisy z /dev/sda2 na /dev/sdb2 . Ja korzystam z wielu urządzeń dlatego u mnie UUID jest niezbędne. Oczywiście mamy do dyspozycji graficzne ubuntu live-cd i odszukanie przykładowego pliku /etc/fstab na sieci nie powinno stanowić trudność. Zmieniamy go nieco i wrzucić do naszego systemu. Ja jednak postanowiłem stworzyć ten plik samemu. Może na pierwszy rzut oka wygląda skomplikowanie ale gdy się zacznie go pisać, to się okazuje, że to wcale takie trudne nie jest. Ja i tak preferuję genfstab, choćby ze względu oszczędności czasu. Mój plik /etc/fstab :

# /etc/fstab: static file system information.
# file system                           mount point     type    options                 dump pass

#Entry for /dev/dm-4 :
UUID=9685570b-4c9e-43ea-815e-49d10dc7a1bf   /       ext4    defaults,commit=60      0 1
#Entry for /dev/sda1 :
UUID=f557b9f0-edb5-42bb-94d8-27bc03c3c2c7   /boot       ext4    defaults,noatime,commit=60  0 2
#Entry for /dev/dm-2 :
UUID=93fc8219-f985-45fb-bd5c-2c7940a7512d   /tmp        ext4    defaults,noatime,commit=60  0 2
#Entry for /dev/sda8 :
UUID=a9f4dae5-901c-4f49-bb30-592de3000713   /media/Server   ext4    defaults,noatime,commit=60  0 2
#Entry for /dev/dm-3 :
UUID=12e8566c-8f0f-45ec-8524-6d9d9ee91eae   /home       ext4    defaults,noatime,commit=60  0 2
#Entry for /dev/dm-5 :
UUID=5e3242e1-ec7a-4806-92f7-88a126feea94   /media/Leon ext4    defaults,noatime,commit=60  0 2
#Entry for /dev/dm-6 :
UUID=19101155-6070-4f37-b39d-19f28867c66b   /media/Dane ext4    defaults,noatime,commit=60  0 2
#Entry for /dev/dm-7 :
UUID=e6a0b66c-8fe9-4e7b-9d54-7b2b430e109d   /media/p2p  ext4    defaults,noatime,commit=60  0 2
#Entry for /dev/dm-8 :
UUID=0c084508-cb8b-4b61-832d-6b85273f33c4   /media/Filmy    ext4    defaults,noatime,commit=60  0 2

#Entry for /dev/dm-1 :
UUID=af41e491-730f-4d25-b194-5cd3d1d08c94   none        swap    sw              0 0

proc                        /proc       proc    defaults            0 0

/dev/sr0                    /media/cdrom    udf,iso9660 noauto,ro,user,exec 0 0

#ramfs                      /tmp_ram    ramfs                   0 0
tmpfs                       /tmp_ram    tmpfs   noauto,nodev,nosuid,size=5m,mode=1700   0 0

#cgroup /sys/fs/cgroup                      cgroup  defaults            0 0

Trzeba jeszcze utworzyć pliki pod cdrom:

# cd /media/
media/# mkdir cdrom0
media/# ln -s cdrom0 cdrom
media/# cd /
# ln -s media/cdrom

Przy czym dobrze jest mieć dodane udf,iso9660 zamiast jedynie iso9660. Udf jest rozszerzeniem iso9660 obchodzącym mnustwo jego ograniczeń, takich jak np. wielkość zapisywanego pliki max 2GB. Ja na dobrą sprawę nie używam płytek, bo to prawie jak korzystanie z dyskietek. xD

2.8.23. Plik /etc/ntp.conf

Domyślna konfiguracja synchronizacji czasu jest w porządku. Jednak my zmienimy sobie serwery, z którymi będzie ta synchronizacja dokonywana. By ustalić adresy serwerów, przechodzimy pod adres http://www.pool.ntp.org/ i po prawej stronie odpowiednio do: Europe > Poland . Zostaną wyświetlone 4 wpisy z adresami serwerów. Kopiujemy je i zmieniamy domyślne adresy serwerów w pliku /etc/ntp.conf . Powinno to mniej więcej wyglądać tak:

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
server 0.pl.pool.ntp.org iburst
server 1.pl.pool.ntp.org iburst
server 2.pl.pool.ntp.org iburst
server 3.pl.pool.ntp.org iburst

Więcej informacji na temat konfiguracji NTP można znaleźć tutaj. W przypadku gdy mamy podejrzenia co do poprawności wyświetlanego czasu na naszym PC, możemy ręcznie zsynchronizować czas. W momencie gdy będziemy to robić, trzeba zastopować usługę NTP:

# /etc/init.d/ntp stop
[ ok ] Stopping NTP server: ntpd.
# ntpd -gq
ntpd: time slew +0.009888s
# /etc/init.d/ntp start
[ ok ] Starting NTP server: ntpd.

Jeśli byśmy starali się zaktualizować czas przy włączonym demonie NTP, w syslogu zostanie wyrzucony błąd:

ntpd[13981]: ntpd 4.2.6p5@1.2349-o Mon May 20 15:46:09 UTC 2013 (1)
ntpd[13981]: proto: precision = 0.418 usec
ntpd[13981]: unable to bind to wildcard address 0.0.0.0 - another process may be running - EXITING

Synchronizacji czasu można też dokonać za pomocą ntpdate. Niemniej jednak, jest już on przestarzały i odchodzi się już od tego sposobu. W domyślnej instalacji debiana nie ma go już w systemie i w przypadku gdyby ktoś chciał z niego skorzystać, musi ten pakiet doinstalować.

2.8.24 Instalacja kernela

Przyszła pora na zainstalowanie kernela. Ja będę instalował kernel z aptosida (repo w pliku /etc/sources/list) ale równie dobrze można zainstalować domyślne jądro debiana. Grunt to odszukać odpowiednie pakiety:

# aptitude search linux-image linux-headers
...
linux-image-amd64
linux-image-aptosid-amd64
linux-image-rt-amd64
...
linux-headers-amd64
linux-headers-aptosid-amd64
linux-headers-rt-amd64
...

# aptitude install linux-{image,headers}-amd64 firmware-linux-free

2.8.25 Bootloader

Który bootloader wybrać -- syslinux, extlinux, grub2 ? Ja korzystałem z gruba2 oraz extlinuxa. W przypadku debiana oba bootloadery działają automatycznie przez generowanie odpowiednich plików konfiguracyjnych. Także z perspektywy przeciętnego użytkownika (co wy tu robicie? xD) nie ma za bardzo znaczenia, który bootloader zainstalujemy, oczywiście rozpatrując kwestie czysto użytkowe. Jeśli mamy EFI to raczej skorzystanie z extlinux odpada, przynajmniej na razie. Pozostaje jedynie grub2. Nigdy nie miałem tablicy partycji GPT, także w kwestii EFI albo BIOS-GPT nic nie napiszę. Ja używam LVM i póki nie mam dysków > 2TB, pozostanę przy tablicy partycji MBR, a ograniczenie liczby partycji do 4 (ewentualnie używanie partycji rozszerzonej) obchodzić będę przez LVM. Mogę mieć nawet jedną partycję fizyczną na dysku i na niej nie mam pojęcia ile dysków virtualnych. Problem jest tylko taki, że windows nie potrafi odczytywać LVM (w końcu coś w czym windows ssie xD). Same różnice między MBR i GPT są w przystępny sposób opisane tutaj.

W moim przypadku na partycji /boot jest utworzony system plików ext4 , potrzebuję więc extlinux . Syslinux jest od partycji typu fat, przynajmniej w debianie. Oczywiście nie będziemy korzystać z tych automatycznych rozwiązań i cały bootloader dostosujemy sobie ręcznie. Gdy jednak zdecydujemy się na takie rozwiązanie, trzeba pamiętać o ręcznej aktualizacji wpisów w /boot/extlinux/extlinux.conf , inaczej mogą wystąpić problemy przy uruchamianiu systemu.

2.8.25.1. MBR i tablica partycji

Zanim się zaczniemy bawić z tablicą partycji, która jest zlokalizowana w MBR, najlepiej jest wykonać kopię zapasową tego sektora i zachować ją w bezpiecznym miejscu i najlepiej, żeby to był inny dysk:

# dd if=/dev/sda of=/path/to/backup/sda_mbr_backup bs=512 count=1

W razie problemów można ją będzie przywrócić i uratować w ten sposób dane zawarte na dysku:

# dd if=/path/to/backup/sda_mbr_backup of=/dev/sda bs=446 count=1

Trzeba też pamiętać, że przywrócenie MBR w sytuacji kryzysowej nie znaczy, że wszystkie nasze złe uczynki zostaną cofnięte, a dane odzyskane. W przypadku posiadania rozszerzonej partycji na dysku, jej struktura nie jest trzymana w MBR i przywrócenie MBR nie przywróci nam poprzedniego układu partycji. Na szczęście można skopiować i odtworzyć te dane przy pomocy sfdisk:

# sfdisk -d /dev/sda > sda_table
# sfdisk /dev/sda < sda_table

Tak wygląda przykładowa tablica partycji:

# partition table of /dev/sda
unit: sectors

/dev/sda1 : start=     2048, size=  1951744, Id=83, bootable
/dev/sda2 : start=  1953792, size= 97656832, Id=83
/dev/sda3 : start= 99610624, size=1367187456, Id=83
/dev/sda4 : start=1466800126, size=1463476226, Id= 5
/dev/sda5 : start=1857425408, size=624998400, Id=83
/dev/sda6 : start=2482425856, size=447850496, Id=83
/dev/sda7 : start=1466802176, size=179574784, Id=83
/dev/sda8 : start=1646379008, size=211044352, Id=83

W przypadku gdy się boimy coś popsuć, warto wiedzieć, że jest bardzo użyteczny programik, który wykonuje backup wszystkich wrażliwych danych i może przeprowadzić to automatycznie przy minimalnej naszej ingerencji. Do pobrania z https://github.com/IgnorantGuru/mbrback.

2.8.25.2. Extlinux

Na sam początek instalacja odpowiednich pakietów:

# aptitude install extlinux syslinux syslinux-common

W przypadku gdybyśmy jeszcze doinstalowali pakiet syslinux-stuff , w katalogu /boot/extlinux/ zostanie utworzonych szereg plików z konfiguracją bootloadera. Jeśli nie chcemy korzystać z automatu dostrajającego konfigurację, np. na wypadek aktualizacji kernela, i mamy przy tym zamiar ręcznie edytować plik /boot/extlinux/extlinux.conf , to ten pakiet jest zbędny, a wręcz też i niepożądany.

Po instalacji extlinuxa, pierwsze co musimy zrobić to wgrać program ładujący do MBR. Jest kilka różnych plików, w zależności od konfiguracji partycji na dysku. Wszystkie z nich znajdują się w katalogu /usr/lib/syslinux/mbr/ . W tym przypadku dysk ma tablicę partycji ms-dos i potrzebny nam jest plik mbr.bin . Możemy go wgrać na 2 sposoby:

Przy użyciu dd:

# dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda bs=440 count=1

Lub przy użyciu cat:

# cat /usr/lib/syslinux/mbr/mbr.bin > /dev/sda

2.8.25.3. Plik /etc/default/extlinux

W przypadku automatycznej konfiguracji bootloadera, przydałoby się rzucić okiem na plik /etc/default/extlinux , standardowo wygląda tak:

## /etc/default/extlinux - configuration file for extlinux-update(8)

EXTLINUX_UPDATE=""

EXTLINUX_ALTERNATIVES="default recovery"
EXTLINUX_DEFAULT="l0"
EXTLINUX_ENTRIES="all"
EXTLINUX_MEMDISK="true"
EXTLINUX_MEMDISK_DIRECTORY="/boot"
EXTLINUX_MENU_LABEL="Debian GNU/Linux, kernel"
EXTLINUX_OS_PROBER="true"
EXTLINUX_PARAMETERS="ro quiet"
EXTLINUX_ROOT="root=UUID=9685570b-4c9e-43ea-815e-49d10dc7a1bf"
EXTLINUX_THEME="none"
EXTLINUX_TIMEOUT="50"

Jeśli ustawimy EXTLINUX_UPDATE="false" , extlinux nie będzie nadpisywał pliku konfiguracyjnego w katalogu /boot/extlinux/ . W taki przypadku podczas aktualizacji kernela dostaniemy poniższy komunikat:

Konfigurowanie pakietu linux-image-3.9-6.slh.2-aptosid-686 (3.9-23) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms 3.9-6.slh.2-aptosid-686 /boot/vmlinuz-3.9-6.slh.2-aptosid-686
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.9-6.slh.2-aptosid-686 /boot/vmlinuz-3.9-6.slh.2-aptosid-686
update-initramfs: Generating /boot/initrd.img-3.9-6.slh.2-aptosid-686
run-parts: executing /etc/kernel/postinst.d/zz-extlinux 3.9-6.slh.2-aptosid-686 /boot/vmlinuz-3.9-6.slh.2-aptosid-686
P: extlinux-update is disabled in /etc/default/extlinux.

Dobrze jest też prześledzić pozostałe opcje i dostosować je według uznania.

2.8.25.4. Plik /boot/extlinux/ldlinux.sys

Część pliku ldlinux.sys jest wgrana w pierwszy sektor partycji, zwany VBR . Trzeba o tym pamiętać przy ewentualnym dotykaniu tego pliku, gdyż może to zmienić jego położenie i w efekcie uniemożliwi to programowi ładującemu, który siedzi w MBR zlokalizowanie tego pliku. Poniższe polecenie powinno utworzyć dwa pliki /boot/extlinux/ldlinux.sys oraz /boot/extlinux/ldlinux.sys :

# extlinux --install /boot/extlinux

2.8.25.5. Katalogi /boot/extlinux/ oraz /usr/lib/syslinux/

Jeśli w katalogu /boot/extlinux/ są jakieś inne pliki, usuwamy je. Tak powinna wyglądać struktura plików i katalogów w /boot/ :

config-3.9-5.slh.1-aptosid-686
initrd.img-3.9-5.slh.1-aptosid-686
System.map-3.9-5.slh.1-aptosid-686
vmlinuz-3.9-5.slh.1-aptosid-686
extlinux
memtest86+.bin
memtest86+_multiboot.bin

Pierwsze 4 pozycje dotyczą kernela, następna to katalog z plikami bootloadera, a dwa ostatnie to memtest. W zależności od konfiguracji partycji na dysku musimy wgrać odpowiednie pliki. W katalogu /usr/lib/syslinux/modules/ mamy do dyspozycji trzy inne podkatalogi: bios/ efi32/ efi64/ . W tym przypadku interesują nas pliki w katalogu bios/ -- kopiujemy jego zawartość do /boot/extlinux/ :

# cp /usr/lib/syslinux/modules/bios/* /boot/extlinux/

Ja dodatkowo zrobiłem sobie tapetę pod mojego extlinuxa i stworzyłem pusty plik konfiguracyjny extlinux.conf.

Z reguły, obrazki muszą być w takiej samej rozdzielczości co okno bootloadera, jednak niektóre komputery nie zmienią rozdzielczości na taką, którą wpiszemy do pliku konfiguracyjnego. W takim przypadku trzeba użyć obrazków w rozdzielczości 640x480, inaczej wystąpią dziwne efekty wizualne. Problem w tym, że np. laptopy zwykle nie mają matryc w proporcjach 4:3 i wskazanie extlinuxowi obrazka o takiej rozdzielczości nieco ten obrazek rozciągnie.

By obejść ten problem, trzeba odpowiednio przeskalować daną grafikę. Trzeba stworzyć pierw obrazek w natywnej rozdzielczości monitora, przykładowo 1366x768, potem ładujemy go do gimpa i skalujemy go proporcjonalnie do rozdzielczości 854x480. Ostatnim krokiem jest zmiana bez proporcji pierwszego parametru z 854 do 640 pixeli. To może i zniekształci nieco obrazek ale podczas ładowania go przez extlinux, zostanie on rozciągnięty do prawidłowych proporcji.

2.8.25.6. Plik /boot/extlinux/extlinux.conf

Tak wygląda przykładowy plik konfiguracyjny bootloadrea (/boot/extlinux/extlinux.conf):

# Config file for extlinux -
# /boot/extlinux/extlinux.conf
#
# Please review the wiki: https://wiki.archlinux.org/index.php/Syslinux
# The wiki provides further configuration examples

DEFAULT debian14
PROMPT 0      # Set to 1 if you always want to display the boot: prompt
TIMEOUT 200

# Menu Configuration
# Either menu.c32 or vesamenu32.c32 must be copied to /boot/extlinux
# http://www.syslinux.org/wiki/index.php/Comboot/menu.c32
#UI menu.c32
UI vesamenu.c32

# Refer to http://syslinux.zytor.com/wiki/index.php/Doc/menu
# MENU RESOLUTION $WIDTH $HEIGHT
MENU RESOLUSION 1280 1024

MENU MARGIN 10
MENU WIDTH 80
MENU ROWS 10
MENU HELPMSGROW 25
MENU CMDLINEROW 25
MENU TABMSGROW 25
MENU HSHIFT 0
MENU VSHIFT 0
MENU TITLE Boot Menu
MENU BACKGROUND background_1280x1024.png
MENU COLOR border       30;44   #40ffffff #a0000000 std
MENU COLOR title        1;36;44 #9033ccff #a0000000 std
MENU COLOR sel          7;37;40 #e0ffffff #20ffffff all
MENU COLOR unsel        37;44   #50ffffff #a0000000 std
MENU COLOR help         37;40   #c0ffffff #a0000000 std
MENU COLOR timeout_msg  37;40   #80ffffff #00000000 std
MENU COLOR timeout      1;37;40 #c0ffffff #00000000 std
MENU COLOR msg07        37;40   #90ffffff #a0000000 std
MENU COLOR tabmsg       31;40   #30ffffff #00000000 std

# In order to generate password, use sha1pass or md5pass
ALLOWOPTIONS 1
MENU MASTER PASSWD $4$Nnfq5Ggq$ZUMFNE88Bi0ATmRLZ3YApDzcSmU$

LABEL debian14
#   MENU PASSWD $4$Nnfq5Ggq$ZUMFNE88Bi0ATmRLZ3YApDzcSmU$
    MENU LABEL Debian 3.14-1-amd64
    KERNEL ../vmlinuz-3.14-1-amd64 
    APPEND root=/dev/mapper/debian_crypt-root cgroup_enable=memory ro
    INITRD ../initrd.img-3.14-1-amd64
    TEXT HELP
    Zaszyfrowany debian (/dev/sda2).
    ENDTEXT

LABEL windows
    MENU LABEL WindowsXP
    COM32 chain.c32
    APPEND hd0 1
    TEXT HELP
    Windows XP (/dev/sda1).
    ENDTEXT

LABEL memtest
        MENU LABEL Memtest86+
        LINUX ../memtest86+.bin

LABEL hdt
        MENU LABEL HDT (Hardware Detection Tool)
        COM32 hdt.c32

LABEL reboot
        MENU LABEL Reboot
        COM32 reboot.c32

LABEL off
       MENU LABEL Power Off
      COMBOOT poweroff.c32

MENU CLEAR

Wszystkie opcje MENU odpowiadają za wygląd extlinuxa. Reszta raczej nie powinna sprawić problemu. Przyjrzyjmy się zatem wpisowi od linuxa oraz windowsa.

Wpis od linuxa:

LABEL debian14
#   MENU PASSWD $4$Nnfq5Ggq$ZUMFNE88Bi0ATmRLZ3YApDzcSmU$
    MENU LABEL Debian 3.14-1-amd64
    KERNEL ../vmlinuz-3.14-1-amd64 
    APPEND root=/dev/mapper/debian_crypt-root cgroup_enable=memory ro
    INITRD ../initrd.img-3.14-1-amd64
    TEXT HELP
    Zaszyfrowany debian (/dev/sda2).
    ENDTEXT

Wyjaśnienie opcji:

  • LABEL -- definiuje kolejny wpis
  • PASSWD -- jeśli zostanie ustawiony, po wybraniu tej pozycji wyskoczy okienko z zapytaniem o hasło
  • MENU LABEL -- pod taką nazwą ten wpis się ukaże w menu extlinuxa
  • KERNEL lub LINUX -- KERNEL próbuje wykryć typ pliku, LINUX zawsze spodziewa się kernela linuxa
  • APPEND -- w tym miejscu są parametry kernela
  • INITRD -- obraz z modułami
  • TEXT HELP i ENDTEXT -- tekst między nimi pokaże się po zaznaczeniu określonego menu

Przy instalacji kenrela, w katalogu /boot/ jest tworzonych kilka plików. W przypadku debiana są to: config-* ,initrd.img-* , System.map-* , vmlinuz-* . By skonfigurować extlinuxa, interesują nas dwa z nich -- vmlinuz-* oraz initrd.img-* . Ścieżki do plików podaje się względem pliku konfiguracyjnego, stąd ../ wskazujący na folder wyżej.

Wpis od windowsa:

LABEL windows
    MENU LABEL WindowsXP
    COM32 chain.c32
    APPEND hd0 1
    TEXT HELP
    Windows XP (/dev/sda1).
    ENDTEXT

Wyjaśnienie opcji:

  • COM32 -- moduł bootujący wina
  • APPEND hd0 1 -- partycja, na której siedzi windows, numerowanie: dyski od 0 , partycje od 1

Zamiast kopiować pliki extlinuxa, można potworzyć dowiązania symboliczne, problem jest w sytuacji gdy szyfrujemy partycje, tak jak w naszym przypadku. Nie możemy linkować, bo partycja z plikami w /usr/ podczas wyświetlania okna wyboru systemu jest jeszcze zaszyfrowana i nie ma dostępu do tych plików, dlatego trzeba je przekopiować.

2.8.25.7. Grub2

Zamiast extlinuxa można zainstalować gruba2, choć mi do gustu bardzo przypadł ręczny sposób konfigurowania extlinuxa i bardzo ładnie sprawuje się on w konfiguracji BIOS-MBR. Pełny automat z grubem na pokładzie osiągniemy przez zainstalowanie poniższych pakietów:

# aptitude install grub-pc grub2-common os-prober
...
Creating config file /etc/default/grub with new version
Undefined subroutine &conffile::abs_path called at /usr/bin/ucfq line 529, <HASH> line 6.
Installation finished. No error reported.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.9-6.slh.1-aptosid-686
Found initrd image: /boot/initrd.img-3.9-6.slh.1-aptosid-686
Found linux image: /boot/vmlinuz-3.9-5.slh.1-aptosid-686
Found initrd image: /boot/initrd.img-3.9-5.slh.1-aptosid-686
Found Microsoft Windows XP Professional on /dev/sda1
done

Jak widać z powyższego loga instalacji, został utworzony plik /etc/default/grub , sam grub został zainstalowany w MBR oraz został wygenerowany plik /boot/grub/grub.cfg .

Gruba, tak jak i extlinuxa, możemy także ręcznie zainstalować w MBR za pomocą:

# grub-install --recheck /dev/sda
Installation finished. No error reported.

Możemy też przejść przez cały proces instalacyjny gruba od początku:

# dpkg-reconfigure grub-pc

2.8.25.8. Plik /etc/default/grub

Gruba można konfigurować na 3 sposoby. Jednym z nich jest plik /etc/default/grub . W przypadku gdybyśmy zmieniali ten plik , trzeba zaktualizować wpisy w głównym pliku konfiguracyjnym /boot/grub/grub.cfg przy pomocy update-grub :

# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.9-6.slh.1-aptosid-686
Found initrd image: /boot/initrd.img-3.9-6.slh.1-aptosid-686
Found linux image: /boot/vmlinuz-3.9-5.slh.1-aptosid-686
Found initrd image: /boot/initrd.img-3.9-5.slh.1-aptosid-686
Found Microsoft Windows XP Professional on /dev/sda1
done

To w tym pliku definiujemy rozdzielczość okna gruba oraz parametry kernela. Warto rzucić okiem na ten plik i dostosować go do własnych potrzeb. Gdy używałem gruba, to głównymi zmianami w tym pliku były:

GRUB_GFXMODE=1280x1024
GRUB_DISABLE_RECOVERY="true"

Warto wiedzieć, że gdy system się nie uruchamia z jakiegoś powodu, można wyedytować linijkę kernela w grubie dodając 1 na jej końcu. Przełączy nas to w tryb jednego użytkownika -- taki tryb maintence. Bardzo użyteczne gdy ma się problemy ze sterownikami do grafiki czy jakieś problemy z Xorgiem. Pewnie i w innych sytuacjach ten tryb bardzo się przydaje.

2.8.25.9. Katalog /etc/grub.d/

W katalogu tym są przechowywane skrypty, które zostaną wykonane przy wydaniu polecenia update-grub . Nie wiem czy istnieje możliwość wyłączenia automatycznej aktualizacji pliku /boot/grub/grub.cfg przy instalacji kernela, tak jak to miało miejsce w przypadku extlinuxa, w każdym razie można dodać swoje wpisy w /etc/grub.d/40_custom i zostaną one dołączone do pliku konfiguracyjnego gruba w /boot/grub/grub.cfg . Można także dostosować pozostałe skrypty o ile się wie co się robi. xD

2.8.25.10. Plik /boot/grub/grub.cfg

Głównym plikiem konfiguracyjnym gruba jest /boot/grub/grub.cfg . Można edytować ten plik ręcznie ale nie ma to większego sensu, bo jest on automatycznie generowany przy instalacji nowego kernela i w ten sposób wszelkie zmiany wprowadzone przez nas zostaną nadpisane.

2.8.26. Firewall

Przydałoby się jeszcze mieć prosty firewall. Zamiast tworzyć skrypt startowy z regułami, lepiej jest do tego celu zaciągnąć iptables-persistent. Konfiguracja siedzi w /etc/iptables/ w plikach rules.v4 oraz rules.v6 . Poniżej kilka prostych reguł:

# cat /etc/iptables/rules.v4

# Generated by iptables-save v1.4.20 on Sat Nov  9 22:22:52 2013
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [392670:75352611]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A OUTPUT -m state --state INVALID -j DROP
COMMIT
# Completed on Sat Nov  9 22:22:52 2013
# cat /etc/iptables/rules.v6 

# Generated by ip6tables-save v1.4.20 on Sat Nov  9 22:22:53 2013
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
COMMIT
# Completed on Sat Nov  9 22:22:53 2013

Nadajmy odpowiednie uprawnienia na plik i dodajmy nasz pseudo firewall do autostartu systemu:

# /etc/init.d/iptables-persistent restart
[ ok ] Loading iptables rules... IPv4... IPv6...done.

Po zresetowaniu, reguły powinny zostać dodane do filtra pakietów. Sprawdźmy zatem czy tak faktycznie jest:

# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  104  5876 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
   11   855 ACCEPT     all  --  eth0   *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  tun0   *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
   20  6200 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-proto-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 116 packets, 6810 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID

Nie będziemy się bawić w zaawansowane tworzenie reguł iptables. To co jest wyżej, to konfiguracja dla stacji klienckich, które nie świadczą żadnych usług na sieci, a jedynie z tego typu usług korzystają.

2.8.27. Hasła, użytkownicy oraz grupy

Mamy już wgrany i wstępnie skonfigurowany system podstawowy oraz bootloader. Mamy także zainstalowanego kernela, możemy więc przejść już do ostatniej fazy przeprowadzonej w chroot z poziomu live-cd. Pozostało nam skonfigurowanie userów.

Wydanie polecenia passwd bez argumentów, zmienia hasło dla aktywnego konta, w tym przypadku będzie to root:

# passwd
Proszę podać nowe hasło UNIX:
Proszę ponownie podać hasło UNIX:
passwd: hasło zostało zmienione

Dodamy jeszcze zwykłego użytkownika oraz skonfigurujmy mu grupy i hasło. Ja domyślnie tworzę kilka dodatkowych grup. Prawdopodobnie nie potrzebujecie ich:

# groupadd -g 1000 morfik
# groupadd -g 122 vboxusers
# groupadd -g 5001 dane
# useradd -m -g morfik -G users,sudo,cdrom,floppy,audio,dip,video,plugdev,vboxusers,dane -s /bin/bash morfik
# passwd morfik
Proszę podać nowe hasło UNIX:
Proszę ponownie podać hasło UNIX:
passwd: hasło zostało zmienione

Parametr -g przy groupadd ustawia id grupy. Domyślnie są one numerowane od 1000 w górę. Ja chcę by użytkownicy mieli id 1000,1001,1002, etc. , dlatego wszystkie swoje niestandardowe grupy pakuję na id 5000+ . Informacje na temat grup w systemie są przechowywane w /etc/group .

Wyjaśnienie opcji useradd:

  • -m -- tworzy katalog domowy w /home/
  • -g -- grupa główna
  • -G -- grupy dodatkowe
  • -s -- shell
  • morfik -- nazwa konta

2.8.28. Tasksel oraz priorytety pakietów

I to w zasadzie by było tyle jeśli chodzi o bardzo podstawowy system operacyjny. Gdybyśmy zresetowali teraz maszynę, odpali się, a to najważniejsze. Nasz system za dużo jeszcze nie potrafi, możemy rozszerzyć jego funkcjonalność przez instalację dodatkowych pakietów. Narzędzie tasksel potrafi instalować pakiety o określonych priorytetach. Priorytety do wyboru jakie mamy to: required, important (zainstalowane przez debootstrap), standard, optional i extra. Instalator debiana zwykle dodaje jeszcze paczki z priorytetem standard. Możemy je doinstalować za pomocą:

# tasksel install standard

Znajduje się tam parę paczek, których ja na pewno nie będę używał, dlatego też niezbyt mi się uśmiecha je instalować. Można przejrzeć pakiety, które zostaną zainstalowane dodając parametr -t do powyższej linijki. Gdy już się zorientujemy w tym co chcemy lub nie chcemy instalować, kopiujemy linijkę z pakietami i do całości, na początku, dodajemy aptitude install . U mnie to wygląda tak:

# aptitude install whois pciutils python2.6-minimal mlocate m4 exim4-base \
w3m less dnsutils bsd-mailx apt-listchanges rpcbind doc-debian procmail dc python-support \
bind9-host liblockfile-bin db5.1-util nfs-common exim4-config reportbug texinfo python2.7 \
time exim4 python-minimal debian-faq krb5-locales ftp lsof wamerican gettext-base at bc \
python-reportbug python openssh-client host exim4-daemon-light ncurses-term telnet \
python-apt ca-certificates geoip-database iso-codes lsb-release sudo apt-file psmisc usbutils \
pcmciautils libmtp-runtime

Jeśli chcemy mieć pełną obsługę wszystkich rodzajów systemów plików, możemy doinstalować też te pakiety: btrfs-tools e2fsprogs dosfstools mtools hfsutils hfsprogs jfsutils nilfs-tools ntfs-3g reiser4progs reiserfsprogs xfsprogs . Oczywiście nie musimy instalować ich wszystkich. Mają w nazwie jaki system plików obsługują, więc idzie się w prosty sposób połapać czego nam potrzeba.

2.9. Kończenie instalacji

Możemy wyjść z chroota i zresetować maszynę. System, który wgraliśmy powinien się bez problemu odpalić. Jest to czysty tryb tekstowy. Czeka nas jeszcze instalacja xorga, zamkniętych sterowników do grafiki, instalacja openboxa oraz minimalna konfiguracja tego wszystkiego.

3. Xorg

Xorg, inaczej X-server, dostarcza interfejs graficzny, dzięki któremu zyskujemy możliwość odpalania aplikacji GUI. Bez niego wszystko musielibyśmy robić w czarnej konsoli i funkcjonalność naszej maszyny by bardzo zmalała.

Instalujemy poniższe pakiety:

# aptitude install xorg xserver-xorg xbase-clients xfonts-base

W tej chwili mamy dostęp do prymitywnego środowiska graficznego odpalanego przez startx . Potrzebujemy do niego bardziej zaawansowanego menadżera okien, w tym przypadku będzie to openbox . Zanim jednak przejdziemy do instalacji openboxa, skonfigurujmy sobie nieco Xorga.

Xorga można konfigurować przez plik w /etc/X11/xorg.conf (jeden, duży plik), bądź też przez osobne pliki w /etc/X11/xorg.conf.d/ . Pliki , o których mowa nie istnieją. Na stronie archlinuxa można przeczytać: "Aktualna wersja Xorg skutecznie automatycznie wykrywa większość sprzętu bez wcześniejszej konfiguracji. Ze względu na te ulepszenia, zaleca się rozpocząć bez pliku xorg.conf i nanosić własne zmiany tylko w razie potrzeby. Zaleca się stosowanie xorg.conf tylko wtedy, gdy powstają problemy z konfiguracją lub jeśli chcemy dodatkowych ustawień." Dlatego też jeżeli sprzęt, który mamy w naszym PC działa prawidłowo, nie musimy się przejmować konfiguracją Xorga.

3.1. Plik /etc/X11/xorg.conf

Ja mam jednak sprzęt, który wymaga dodatkowej konfiguracji i będę korzystał z małych plików, które będą odnosić się do konkretnych urządzeń. Ale zanim zaczniemy tworzyć konfigurację Xorga, kilka słów na temat tych plików . Na dobrą sprawę pliki w /etc/X11/xorg.conf.d/ są częściami pliku /etc/X11/xorg.conf . W mojej sytuacji są dwa narzędzia, z których mogę skorzystać w celu wygenerowania pliku xorg.conf Xorg -configure :0 oraz nvidia-settings, który jest dostarczony z zamkniętymi sterownikami graficznymi. Jednak przy odrobinie oleju w głowie bez problemu można powycinać interesujące nas sekcje i poukładać je w odpowiednich plikach w katalogu /etc/X11/xorg.conf.d/ .

Jeżeli ktoś chciałby skorzystać z pliku xorg.conf, polecenie Xorg -configure :0 trzeba wydać z konta roota w trybie tekstowym. Plik z konfiguracją zostanie utworzony w katalogu /root/ . Musimy go przenieść do /etc/X11/xorg.conf . W przypadku korzystania z zamkniętych sterowników graficznych, trzeba wykomentować wpisy z dri oraz w odpowiednim miejscu zmienić sterownik na właściwy. W przypadku gdy posiadamy jeden monitor i jedną kartę graficzną, niektóre sekcje w tym pliku można skasować: section "Device" , section "Monitor" , section "Screen" , zostawiając tym po jednej odpowiednio je konfigurując. Gdybym chciał skorzystać z pliku xorg.conf , najistotniejsze zmiany by wyglądały jak poniżej:

Section "Module"
...
#       Load  "dri"
...
#       Load  "dri2"

Section "Device"
...
        Driver      "nvidia"

3.2. Katalog /etc/X11/xorg.conf.d/

Pliki w /etc/X11/xorg.conf.d/ trzeba odpowiednio nazywać. Plik konfiguracyjny musi zaczynać się od dwóch cyfr, po których jest myślnik. Następny ciąg znaków może być dowolny ale nazwa pliku musi kończyć się kropką z dopiskiem conf . Im mniejszy numer w nazwie pliku, tym konfiguracja w nim zawarta jest wcześniej aplikowana. Reasumując, nazwa pliku powinna wyglądać następująco: 10-evdev.conf .

3.3 Zamknięte sterowniki NVIDIA

Ja posiadam kartę graficzną nvidia Geforce 7600GT i w moim przypadku by używać zamkniętych sterowników trzeba doinstalować kilka pakietów. Niestety w /etc/apt/sources.list standardowo utworzonym przez deboostrap nie ma odpowiednich sekcji -- trzeba tam dodać "contrib" i "non-free". Inaczej nie będzie możliwa instalacja odpowiednich pakietów:

...
deb     http://ftp.pl.debian.org/debian/ testing main non-free contrib
...

To jakie pakiety musimy zainstalować zależy głównie od tego jaką kartę graficzną posiadamy. Ciężko trochę popamiętać te wszystkie numerki ale na szczęście mamy do tego celu pakiet nvidia-detect. Jeśli nie wiemy, które pakiety są przeznaczone dla naszej karty, instalujemy go i sprawdzamy:

# aptitude install nvidia-detect
# nvidia-detect 
Detected NVIDIA GPUs:
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation G73 [GeForce 7600 GT] [10de:0391] (rev a1)
Your card is only supported up to the 304 legacy drivers series.
It is recommended to install the
    nvidia-legacy-304xx-driver
package.

Zatem ja już wiem co mam zainstalować:

# aptitude install nvidia-legacy-304xx-driver nvidia-settings-legacy-304xx

Oczywiście można korzystać też z instalatora nvidii ale ja nie będę się tutaj na ten temat rozpisywał.

3.3.1. Plik /etc/modprobe.d/nvidia-blacklists-nouveau.conf

Po zainstalowaniu sterów, zostanie dodany plik /etc/modprobe.d/nvidia-blacklists-nouveau.conf , który jest dowiązaniem do /etc/alternatives/glx--nvidia-blacklists-nouveau.conf i zawiera treść:

# You need to run "update-initramfs -u" after editing this file.

# see #580894
blacklist nouveau

Widniejący tam wpis blacklist nouveau ma na celu uniemożliwienie załadowania się się modułu nouveau podczas startu systemu. Oba moduły niezbyt się lubią i aktualnie załadowany może być tylko jeden z nich. Trzeba też pamiętać by initramfs zawierał odpowiednie moduły. Prawdopodobnie zostanie wygenerowany automatycznie. Gdyby tak się nie stało, trzeba go wygenerować ręcznie za pomocą update-initramfs -u.

Do sprawdzenia czy korzystamy z modułu nvidia czy nouveau może posłużyć lsmod . Poniżej wynik polecenia przy korzystaniu z modułu nouveau :

# lsmod | grep nouveau
nouveau               660338  1
mxm_wmi                 1071  1 nouveau
wmi                     6223  2 mxm_wmi,nouveau
video                   9606  1 nouveau
i2c_algo_bit            3801  1 nouveau
ttm                    38876  1 nouveau
drm_kms_helper         20383  1 nouveau
drm                   159519  3 ttm,drm_kms_helper,nouveau
button                  3500  1 nouveau

Dla porównania wynik lsmod podczas korzystania z zamkniętych sterowników nvidii:

lsmod | grep nvidia
nvidia              10224647  40

Co się rzuca w oczy to rozmiar modułów. Dlatego Xorg będzie zjadał więcej RAMu na sterowniku nvidia niż ma to miejsce w przypadku sterownika nouveau.

3.4. Plik /etc/X11/xorg.conf.d/20-monitor.conf

Samo zainstalowanie sterowników to nie wszystko, trzeba skonfigurować Xorga by używał odpowiedniego modułu. Tworzymy zatem plik /etc/X11/xorg.conf.d/20-monitor.conf , w którym znajdzie się konfiguracja grafiki oraz monitora. W moim przypadku ten plik wygląda tak:

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "LG Electronics L1732P"
    HorizSync       30.0 - 71.0
    VertRefresh     56.0 - 75.0
EndSection

Section "Device"
    Option         "NoLogo" "1"
    Identifier     "Device0"
#    Driver         "nouveau"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    BoardName      "GeForce 7600 GT"
    BusID          "PCI:1:0:0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "Stereo" "0"
    Option         "metamodes" "nvidia-auto-select +0+0"
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

Powyższe sekcje zostały wygenerowane przez nvidia-setting i odpowiednio wycięte. W każdym razie trzeba pamiętać o zmianie sterownika. Po zresetowaniu PC trzeba się upewnić czy moduł został poprawnie załadowany posługując się lsmod .

Do sprawdzenia wersji sterowników można wykorzystać nvidia-settings :

# nvidia-settings -v

nvidia-settings:  version 304.88  (buildd@murphy)  Mon May 13 20:21:45 UTC 2013
  The NVIDIA X Server Settings tool.

  This program is used to configure the NVIDIA Linux graphics driver.
  For more detail, please see the nvidia-settings(1) man page.

  Copyright (C) 2004 - 2010 NVIDIA Corporation.

Jeżeli system nam się odpalił i powyższe polecenia zwracają pożądane wyniki, możemy przeprowadzić test Xorga i przy okazji sprawdzić czy plik konfiguracyjny, który wgraliśmy nie zawiera błędów. Wydajemy w terminalu polecenie startx . Jeśli X-y zostaną z powodzeniem zainicjowane, to znaczy, że wszystko zostało zrobione prawidłowo.

3.5. Plik /etc/X11/xorg.conf.d/10-keyboard.conf

Skonfigurowaliśmy już sobie monitor oraz grafikę. Przydałoby się jeszcze skonfigurować klawiaturę. Tworzymy plik /etc/X11/xorg.conf.d/10-keyboard.conf o treści:

Section "InputClass"
Identifier              "Logitech Media Keyboard Elite"
MatchIsKeyboard         "on"
MatchDevicePath         "/dev/input/event*"
Driver                  "evdev"
Option                  "XkbModel"      "logimel"
Option                  "XkbLayout"     "pl"
#Option                  "XkbVariant"    ""
Option                  "XkbOptions"    "terminate:ctrl_alt_bksp"
EndSection

XkbModel można wyciągnąć z pliku /usr/share/X11/xkb/rules/xorg.lst znając oczywiście model klawiatury , zaś XkbLayout można odszukać w /usr/share/X11/xkb/symbols/ , w przypadku polskiego układu,jest to pl . Opcja terminate:ctrl_alt_bksp odpowiada za resetowanie X-ów przy pomocy ctrl+alt+backspace.

Kilka uwag w stosunku do starego pliku /etc/X11/xorg.conf . Przede wszystkim zmianie uległ sterownik -- kbd -> evdev . Ustawienia tutaj powinny bez problemu działać ale środowiska graficzne takie jak gnome czy kde ignorują ustawienia Xorga i ustawiają klawiaturę jak i szereg innych rzeczy po swojemu. Ja nie mam zamiaru korzystać z gnome albo innego podobnego zlepku pakietów, dlatego też muszę poustawiać wszystko manualnie ale raz ustawione będzie działać bez problemu.

By sprawdzić czy układ klawiatury jest poprawie ustawiony, odpalamy X-y i wydajemy polecenie:

# setxkbmap -print -verbose 10
Setting verbose level to 10
locale is C
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
Success.
Applied rules from evdev:
rules:      evdev
model:      logimel
layout:     pl
options:    terminate:ctrl_alt_bksp
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete
symbols:    pc+pl+inet(evdev)+terminate(ctrl_alt_bksp)
geometry:   pc(pc104)
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+pl+inet(evdev)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc104)" };
};

Jak widać, wszystko jest w porządku.

Oczywiście Xorg jest dość inteligentny i nie trzeba mu tego wszystkiego mówić, zwykle sam sobie dobierze parametry ale gdy robi to niezbyt udanie, trzeba je dostrajać samemu. W każdym razie, jeśli działa nie naprawiaj.

3.6. Plik /etc/X11/xorg.conf.d/50-synaptics.conf

Ten plik jest przeznaczony dla posiadaczy laptopów i innych urządzeń wykorzystujące touchpady. Parę dni temu byłem zmuszony pracować w minimalnym środowisku właśnie na laptopie i się okazało, że touchpad jest strasznie niewygodny przy standardowych ustawieniach. Tworzymy plik /etc/X11/xorg.conf.d/50-synaptics.conf o treści:

 Section "InputClass"
Identifier "touchpad"
Driver "synaptics"
MatchIsTouchpad "on"
   Option "TapButton1" "1"
   #Option "VertEdgeScroll" "on"
   Option "VertTwoFingerScroll" "on"
   #Option "HorizEdgeScroll" "on"
   Option "HorizTwoFingerScroll" "on"
   Option "PalmDetect" "1"
   Option "PalmMinWidth" "10"
   Option "PalmMinZ" "200"
   Option "RBCornerButton" "3"
 EndSection

Dzięki powyższym opcjom będziemy mogli klikać przy pomocy dowolnego miejsca na powierzchni touchpada oraz scrollować w pionie i poziomie przy użyciu dwóch palców. Opcje z "Palm* odpowiadają za detekcję dłoni i przy "wykryciu" jej touchpad zostanie zablokowany. Przydatne podczas pisania na klawiaturze. Trzeba tylko odpowiednio dobrać wartości. Ostatnia opcja odpowiada za prawy przycisk i jest on przypisany do prawego dolnego rogu touchpada.

Opcji, które można sprecyzować w powyższym pliku jest sporo. Można je podejrzeć posługując się synclient:

$ synclient -l
Parameter settings:
    LeftEdge                = 1781
    RightEdge               = 5579
    TopEdge                 = 1648
    BottomEdge              = 4604
    FingerLow               = 25
    FingerHigh              = 30
    FingerPress             = 256
    MaxTapTime              = 180
    MaxTapMove              = 246
    MaxDoubleTapTime        = 180
    SingleTapTimeout        = 180
    ClickTime               = 100
    FastTaps                = 0
    EmulateMidButtonTime    = 75
    EmulateTwoFingerMinZ    = 282
    EmulateTwoFingerMinW    = 7
    VertScrollDelta         = 111
    HorizScrollDelta        = 111
    VertEdgeScroll          = 0
    HorizEdgeScroll         = 0
    CornerCoasting          = 0
    VertTwoFingerScroll     = 1
    HorizTwoFingerScroll    = 0
    MinSpeed                = 1
    MaxSpeed                = 1.75
    AccelFactor             = 0.0357462
    TrackstickSpeed         = 40
    EdgeMotionMinZ          = 30
    EdgeMotionMaxZ          = 160
    EdgeMotionMinSpeed      = 1
    EdgeMotionMaxSpeed      = 447
    EdgeMotionUseAlways     = 0
    TouchpadOff             = 2
    LockedDrags             = 0
    LockedDragTimeout       = 5000
    RTCornerButton          = 0
    RBCornerButton          = 0
    LTCornerButton          = 0
    LBCornerButton          = 0
    TapButton1              = 1
    TapButton2              = 3
    TapButton3              = 2
    ClickFinger1            = 1
    ClickFinger2            = 1
    ClickFinger3            = 1
    CircularScrolling       = 0
    CircScrollDelta         = 0.1
    CircScrollTrigger       = 0
    CircularPad             = 0
    PalmDetect              = 0
    PalmMinWidth            = 10
    PalmMinZ                = 200
    CoastingSpeed           = 20
    CoastingFriction        = 50
    PressureMotionMinZ      = 30
    PressureMotionMaxZ      = 160
    PressureMotionMinFactor = 1
    PressureMotionMaxFactor = 1
    GrabEventDevice         = 1
    TapAndDragGesture       = 1
    AreaLeftEdge            = 0
    AreaRightEdge           = 0
    AreaTopEdge             = 0
    AreaBottomEdge          = 0
    HorizHysteresis         = 8
    VertHysteresis          = 8
    ClickPad                = 0

Przy pomocy synclient można zmieniać parametry touchpada bez potrzeby resetowania środowiska graficznego. Po wydaniu odpowiedniego polecenia, zmiany mają efekt natychmiastowy. Przykładowe użycie synclient:

$ synclient PalmDetect=1

Jeśli ustawienia, które zmieniliśmy odpowiadają nam, musimy je dopisać w pliku /etc/X11/xorg.conf.d/50-synaptics.conf . Robimy to w bardzo prosty sposób: Najpierw występuje Option później w cudzysłowie nazwa opcji w synclient "PalmDetect" i jako ostatni, również w cudzysłowie, jest wartość parametru jaki ustawialiśmy "1". Wszystko jest oddzielone od siebie za pomocą spacji albo tabulacji.

Do kalibracji touchpada służy evtest. Można w nim podejrzeć wartości nacisku na powierzchnie jak i również pozycję palca na niej. Przy czym, by móc go użyć trzeba go odpalić pod tty i ewentualnie zresetować środowisko graficzne.

Więcej informacji o konfigurowaniu trouchpada można znaleźć pod tym linkiem.

3.7. Plik /var/log/Xorg.0.log

W przypadku wystąpienia problemów z załadowaniem się trybu graficznego, pożyteczne informacje znajdziemy w pliku /var/log/Xorg.0.log . Warto przeszukać go pod kątem WW albo EE przy pomocy:

# cat /var/log/Xorg.0.log | grep WW
# cat /var/log/Xorg.0.log | grep EE

W moim przypadku nie było żadnych wpisów z EE. Było jednak kilka z WW:

[   458.290] (WW) The directory "/usr/share/fonts/X11/cyrillic" does not exist.
[   458.290] (WW) The directory "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType" does not exist.
[  1014.980] (WW) Open ACPI failed (/var/run/acpid.socket) (No such file or directory)
[  1649.198] (WW) NVIDIA(0): Unable to support custom viewPortOut 1280 x 720 +0 +152

Pierwszy z nich można wyeliminować instalując xfonts-cyrillic. Drugiego można było się pozbyć przez instalację pakietu x-ttcidfont-conf . Problem w tym, że go nie ma w systemie i w dodatku występuje jedynie w squeeze. Także to chyba jakiś bug buga i tego się raczej nie da na razie poprawić. Trzeci komunikat woła o instalację ACPI i przy okazji pm-utils. Pakiety: vbetool pm-utils acpi acpi-support acpi-fakekey acpi-support-base . W przypadku ostatniego ostrzeżenia nie mam pojęcia o co chodzi. Występuje to na wszystkich moich systemach, z różnymi środowiskami, z różną konfiguracją Xorga, nawet w przypadku posiadania minimalnego pliku konfiguracyjnego. Pewnie to jakiś bug nvidia-like i też jest poza zasięgiem ręcznej naprawy. W każdym razie to są tylko ostrzeżenia i raczej nie powinno się nic większego dziać z tego powodu.

3.8. Plik ~/.xsession-errors

W tym pliku są przechowywane, jak sama nazwa wskazuje, błędy sesji Xorga. Też warto do niego od czasu do czasu zajrzeć w poszukiwaniu informacji czy aby któraś z aplikacji nie domaga się pomocy z naszej strony. U mnie już na samym początku można było tam dostrzec błędy:

ERROR: openbox-xdg-autostart requires PyXDG to be installed

Doinstalowanie pakietu python-xdg rozwiązało problem. Jak widać wiele problemów można wyeliminować przez analizę logów, nawet nie trzeba się od razu zwracać z pomocą do google, trzeba wiedzieć tylko gdzie szukać użytecznych informacji, a katalog /var/log/ jest pierwszym miejscem gdzie powinniśmy zajrzeć w przypadku dziwnego zachowania się systemu lub aplikacji, z których korzystamy.

4. Openbox

Teraz czas na instalację użytecznego środowiska graficznego i nie będzie to gnome czy kde a jedynie menadżer okien -- openbox. Na jego instalację nie składa się wiele pakietów ale by nas nie odstraszał samym wyglądem, doinstalujemy mu kilka paczek i skonfigurujemy go tak by szło go w miarę komfortowo używać. Instalujemy poniższe pakiety:

# aptitude install openbox obconf obmenu lightdm lightdm-gtk-greeter gnome-icon-theme \
gnome-themes-standard dmz-cursor-theme lxappearance gtk2-engines gtk2-engines-murrine \
gtk2-engines-pixbuf fontconfig qt4-qtconfig accountsservice numlockx compton ttf-mscorefonts-installer \
gnome-icon-theme-symbolic

4.1. Katalog ~/.config/openbox/

Standardowo w openboxie nic nie ma -- żadne pliki nie są kopiowane do katalogu użytkownika i wszystko trzeba robić samemu. Na początek przekopiujmy pliki szkieletowe z /etc/xdg/openbox/ do ~/.config/openbox/ . Są to: autostart, environment, menu.xml, rc.xml :

$ mkdir -p ~/.config/openbox/
$ cp /etc/xdg/openbox/{rc.xml,menu.xml,autostart,environment} ~/.config/openbox

4.1.1. Plik ~/.config/openbox/autostart

Autostart openboxa jest zarządzany przez ~/.config/openbox/autostart . Ponad to, w katalogu /etc/xdg/autostart/ znajdują się pliki .desktop tworzone automatycznie przez część aplikacji. Mogą one być również brane pod uwagę przez openboxa i umieszczenie w tym folderze plików sprawi, że określone aplikacje będą startowane u każdego użytkownika automatycznie. Jeśli chcemy by tak się działo, musimy doinstalować pakiet python-xdg . Oczywiście każdy użytkownik ma swój własny autostart zlokalizowany w ~/.config/autostart/ i w przypadku gdy nie podobają nam się włączone przez administratora usługi, możemy je wyłączyć poprzez umieszczenie kopi pliku .desktop w ~/.config/autostart/ , odpowiednio ją przy tym modyfikując.

Przykładowy plik .desktop wygląda tak:

[Desktop Entry]
Name=Dropbox
GenericName=File Synchronizer
Comment=Sync your files across computers and to the web
Exec=dropbox start -i
Terminal=false
Type=Application
Icon=dropbox
Categories=Network;FileTransfer;
StartupNotify=false
OnlyShowIn=GNOME;XFCE;

Opcja OnlySHowIn odpowiada za ukrywanie pliku w środowiskach, które nie są tam sprecyzowane. W przypadku braku tego pola, usługa zostanie odpalona na każdym z nich. Gdy chcę wyłączyć jakąś usługę, dopisuję tam none , a gdybym chciał odpalić coś tylko na openboxie -- OPENBOX . Powyższy przykład ma tylko kilka pól, które można wykorzystać przy konfiguracji. Pełna ich lista znajduje się tutaj.

Więcej informacji na temat pól, które mogą wystąpić w tym pliku można znaleźć pod adresem http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html.

W celu sprawdzenia, które aplikacje są automatycznie uruchamiane przez xdg, wydajemy polecenie:

$ /usr/lib/x86_64-linux-gnu/openbox-xdg-autostart --list

W przypadku posiadania kilku użytkowników i wgrywaniu plików do ~/.config/autostart/ , wynik zwrócony przez powyższą linijkę może się różnić,w zależności od tego, który user ją wyda.

4.1.2. Plik ~/.config/openbox/environment

W tym pliku definiujemy zmienne środowiskowe, które można podejrzeć przez printenv lub też samo env . Zmienne dopisane do tego pliku będą ustawione permanentnie, a to za sprawą czytania tego pliku przez openbox przy każdym starcie sesji graficznej. Poniżej znajduje się kilka zmiennych, które ja zwykle ustawiam w swoim środowisku:

export GTK2_RC_FILES="$HOME/.gtkrc-2.0"
export GNOME_DESKTOP_SESSION_ID=1
export EDITOR="vim"
export BROWSER="/usr/local/firefox/firefox"
#export VISUAL="geany"
export WINDOWPATH=7
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_CACHE_HOME="$HOME/.cache"
export DISPLAY=":0"
export MPD_HOST=127.0.0.1
export MPD_PORT=6600
export LC_COLLATE=C
export LANGUAGE=en_US.utf8
export GDK_USE_XFT=1
export QT_XFT=true

# ccache
# export PATH=/usr/lib/ccache:$PATH

Powyższe zmienne można również ustawić ręcznie w terminalu. Różnica polega na tym, że będą one widoczne tylko w obrębie odpalonego terminala. W przypadku posiadania uruchomionych równocześnie dwóch lub więcej terminali, zmienna będzie widoczna tylko w tym, w którym wydaliśmy polecenie export . Również aplikacje graficzne odpalane z menu nie będą świadome istnienia ustawionych zmiennych Po zamknięciu konsoli, zmienna przestanie istnieć. Zmienne można także wykasować ze środowiska przez użycie unset . Przykład:

$ unset DISPLAY

Trzeba przy tym pamiętać, że unset DISPLAY nie oznacza tego samego co export DISPLAY="" .

4.1.3. Plik ~/.config/openbox/menu.xml

W tym pliku definiujemy wpisy dla menu kontekstowego, dostępnego pod prawym klawiszem myszki. Można również stworzyć menu dla lewego jak i środkowego przycisku (i pewnie jeszcze kilku innych) . Można też wgrać automat generujący menu. Choć ta ostatnia opcja spowolni trochę działanie samego menu, no i oczywiście doda sporo śmieci. Moim zdaniem lepiej jest menu ręcznie dostosować do swoich potrzeb edytując plik ~/.config/openbox/menu.xml lub też korzystając z graficznego narzędzia obmenu . Po każdej edycji menu trzeba przeładować konfigurację openboxa przy pomocy:

$ openbox --reconfigure

4.1.4. Plik ~/.config/openbox/rc.xml

W tym pliku jest trzymana konfiguracja właściwa openboxa. Można tam ustawić skróty klawiszowe, zrządzać zachowaniem okien (i przy okazji pozbyć się devilspie), ustawić motyw czy domyślne czcionki, kursorki, ikonki i parę innych rzeczy. Część konfiguracji zawartej w tym pliku można zmienić przy pomocy narzędzia obconf . Pozostałe trzeba dostosować edytując ten plik.

Wspomnę tutaj tylko o zarządzaniu zachowaniem okien, bo to jest dość istotne. Wyżej napisałem, że można zrezygnować z devilspie. Ten program potrafił osadzić dowolne okno na pulpicie, usuwając przy tym obramowanie, ustawiając geometrię i parę innych rzeczy. Do tego samego celu można użyć funkcji wbudowanych w openbox. Jednak potrzebujemy do tego celu pewnych informacji, bo niby skąd openbox ma wiedzieć, które okno ma dla nas zmienić? Odszukanie tych informacji może okazać się problematyczne. Na szczęście istnieje narzędzie xprop dostarczane razem z Xorgiem, które to potrafi podać dość zaawansowane info na temat wskazanego okna. istnieje również inne narzędzie, którym można się posłużyć -- obxprop Przykładowy log xprop (myszą trzeba wskazać okno):

$ xprop
_NET_WM_ICON_GEOMETRY(CARDINAL) = 10, 746, 180, 22
XKLAVIER_STATE(INTEGER) = 0, 0
WM_STATE(WM_STATE):
        window state: Normal
        icon window: 0x0
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 22, 0
_NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_MOVE, _NET_WM_ACTION_RESIZE, _NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_MINIMIZE, _NET_WM_ACTION_SHADE, _NET_WM_ACTION_MAXIMIZE_HORZ, _NET_WM_ACTION_MAXIMIZE_VERT, _NET_WM_ACTION_CHANGE_DESKTOP, _NET_WM_ACTION_CLOSE, _NET_WM_ACTION_ABOVE, _NET_WM_ACTION_BELOW
_NET_WM_DESKTOP(CARDINAL) = 4294967295
_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_STICKY
WM_HINTS(WM_HINTS):
        Client accepts input or input focus: True
        Initial state is Normal State.
        bitmap id # to use for icon: 0x4200023
        bitmap id # of mask for icon: 0x4200026
        window id # of group leader: 0x4200001
XdndAware(ATOM) = BITMAP
_MOTIF_DRAG_RECEIVER_INFO(_MOTIF_DRAG_RECEIVER_INFO) = 0x6c, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0
_NET_WM_ICON(CARDINAL) =    Icon (48 x 48):
_NET_WM_SYNC_REQUEST_COUNTER(CARDINAL) = 69206022
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
_NET_WM_USER_TIME_WINDOW(WINDOW): window id # 0x4200005
WM_CLIENT_LEADER(WINDOW): window id # 0x4200001
_NET_WM_PID(CARDINAL) = 4841
WM_LOCALE_NAME(STRING) = "pl_PL.UTF-8"
WM_CLIENT_MACHINE(STRING) = "morfikownia"
WM_NORMAL_HINTS(WM_SIZE_HINTS):
        window gravity: NorthWest
WM_PROTOCOLS(ATOM): protocols  WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST
WM_CLASS(STRING) = "terminator", "Terminator"
WM_ICON_NAME(STRING) = "morfik@morfikownia: ~"
_NET_WM_ICON_NAME(UTF8_STRING) = "morfik@morfikownia: ~"
WM_NAME(STRING) = "morfik@morfikownia: ~"
_NET_WM_NAME(UTF8_STRING) = "morfik@morfikownia: ~"

W przypadku prawie każdej aplikacji można ustawić nazwę okna, pod którą okno będzie widoczne w systemie. Znając nazwę okna, możemy je wskazać openboxowi:

<application title="terminator-bg_1">
<decor>no</decor>
<focus>no</focus>
<layer>below</layer>
<desktop>1</desktop>
<skip_pager>yes</skip_pager>
<skip_taskbar>yes</skip_taskbar>
</application>

Powyżej wypisałem, część opcji jakie można użyć przy konfigurowaniu okien. Opcji, które można użyć jest więcej i nie sprowadzają się one tylko do umieszczania konsoli na desktopie. Są one dość dobrze opisane w pliku konfiguracyjnym openboxa. Przy takim ustawieniu jak wyżej, każde okno o nazwie terminator-bg_1 zostanie osadzone na pierwszym pulpicie. Okna można wskazywać nie tylko po _OB_APP_NAME uzyskanym z xprop ale również po _OB_APP_NAME , OB_APP_CLASS , _OB_APP_ROLE , _OB_APP_TITLE , _OB_APP_TYPE .

4.2. Czcionki oraz fontconfig

Jestem przyzwyczajony do czcionek z windowsa, choć od lat używam linuxa. Nie wiem czemu ale na inne czcionki po prostu nie mogę patrzeć, może to wina mojego monitora albo nie potrafię poprawnie skonfigurować ich wyświetlania, nie wiem. W każdym razie czcionki windowsowskie u mnie bardzo ładnie wyglądają. Teoretycznie istnieją czcionki, które mają naśladować te od MS -- pakiet fonts-liberation ale dla mnie one wyglądają inaczej i drażnią mnie nieco. :]

Do konfiguracji czcionek służy fontconfig. Przy czym można oczywiście skorzystać z półautomatu :

# dpkg-reconfigure fontconfig-config

Możemy też wszystko zrobić ręcznie. Oczywiście wybieramy sposób manualny.

4.2.1. Katalogi /etc/fonts/conf.avail/ , /etc/fonts/conf.d/

Czcionki można konfigurować w kilku miejscach -- można je ustawiać lokalnie(per user) lub globalnie (systemowo). W katalogu /etc/fonts/conf.d/ są dowiązania do /etc/fonts/conf.avail/ i to przez te dowiązania właśnie odbywa się globalna konfiguracja czcionek w systemie. Tak wygląda konfiguracja moich czcionek:

 ls -al /etc/fonts/conf.d/
razem 12
drwxr-xr-x 2 root root 4096 cze 16 09:09 .
drwxr-xr-x 4 root root 4096 cze 15 13:45 ..
lrwxrwxrwx 1 root root   34 cze 16 09:06 10-no-antialias.conf -> ../conf.avail/10-no-antialias.conf
lrwxrwxrwx 1 root root   34 cze 16 09:06 10-no-sub-pixel.conf -> ../conf.avail/10-no-sub-pixel.conf
lrwxrwxrwx 1 root root   39 cze 16 09:06 49-sansserif.conf -> /etc/fonts/conf.avail/49-sansserif.conf
lrwxrwxrwx 1 root root   34 cze 16 09:06 50-user.conf -> /etc/fonts/conf.avail/50-user.conf
lrwxrwxrwx 1 root root   35 cze 16 09:06 51-local.conf -> /etc/fonts/conf.avail/51-local.conf
lrwxrwxrwx 1 root root   27 cze 16 09:06 57-arial.conf -> ../conf.avail/57-arial.conf
lrwxrwxrwx 1 root root   33 cze 16 09:06 57-courier-new.conf -> ../conf.avail/57-courier-new.conf
lrwxrwxrwx 1 root root   37 cze 16 09:06 57-times-new-roman.conf -> ../conf.avail/57-times-new-roman.conf
lrwxrwxrwx 1 root root   29 gru 11  2012 69-unifont.conf -> ../conf.avail/69-unifont.conf
lrwxrwxrwx 1 root root   40 cze 15 13:45 70-no-bitmaps.conf -> /etc/fonts/conf.avail/70-no-bitmaps.conf

Przy czym obecnie lokalizacja plików konfiguracyjnych została przeniesiona z /etc/fonts/conf.avail/ do /usr/share/fontconfig/conf.avail/ . Niemniej jednak, ja pozostawię swoje pliczki w /etc/ , w końcu tu powinna być trzymana cała konfiguracja systemowa.

4.2.2. Pakiet ttf-mscorefonts-installer

Jest kilka dość znaczących zmian, które trzeba przeprowadzić by czcionki doprowadzić do porządku. Po pierwsze, trzeba stworzyć pliki konfiguracyjne dla czcionek MS, które będą ustawiać czcionki arial, courier new i times new roman jako domyślne w systemie. Będą ustawione jako: arial -- sans (sans-serif), courier new -- monospace, times new roman -- serif. Dzięki temu zabiegowi, appsy, które domyślnie używają nazwy sans lub monospace (czyli mniej więcej wszystkie), automatycznie ustawią sobie pożądaną przez nas czcionkę.

Tworzymy zatem 3 pliki konfiguracyjne -- po jednym dla każdego kroju czcionki.

Plik /etc/fonts/conf.avail/57-arial.conf :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "../fonts.dtd">
<!-- /etc/fonts/conf.d/57-dejavu-sans.conf

     Define aliasing and other fontconfig settings for
     Arial.

     © 2006-2008 Nicolas Mailhot <nicolas.mailhot at laposte.net>
-->
<fontconfig>
  <!-- Font substitution rules -->
  <alias binding="same">
    <family>Arev Sans</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Bepa</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Bitstream Prima Sans</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Bitstream Vera Sans</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>DejaVu LGC Sans</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Hunky Sans</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Olwen Sans</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>SUSE Sans</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Verajja</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <!-- In case VerajjaPDA stops declaring itself as Verajja -->
  <alias binding="same">
    <family>VerajjaPDA</family>
    <accept>
      <family>Arial</family>
    </accept>
  </alias>
  <!-- Generic name assignment -->
  <alias>
    <family>Arial</family>
    <default>
      <family>sans-serif</family>
    </default>
  </alias>
  <!-- Generic name aliasing -->
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Arial</family>
    </prefer>
  </alias>
</fontconfig>

Plik /etc/fonts/conf.avail/57-courier-new.conf :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "../fonts.dtd">
<!-- /etc/fonts/conf.d/57-dejavu-sans-mono.conf

     Define aliasing and other fontconfig settings for
     Courier New.

     © 2006-2008 Nicolas Mailhot <nicolas.mailhot at laposte.net>
-->
<fontconfig>
  <!-- Font substitution rules -->
  <alias binding="same">
    <family>Bepa Mono</family>
    <accept>
      <family>Courier New</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Bitstream Prima Sans Mono</family>
    <accept>
      <family>Courier New</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Bitstream Vera Sans Mono</family>
    <accept>
      <family>Courier New</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>DejaVu LGC Sans Mono</family>
    <accept>
      <family>Courier New</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Olwen Sans Mono</family>
    <accept>
      <family>Courier New</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>SUSE Sans Mono</family>
    <accept>
      <family>Courier New</family>
    </accept>
  </alias>
  <!-- Generic name assignment -->
  <alias>
    <family>Courier New</family>
    <default>
      <family>monospace</family>
    </default>
  </alias>
  <!-- Generic name aliasing -->
  <alias>
    <family>monospace</family>
    <prefer>
      <family>Courier New</family>
    </prefer>
  </alias>
</fontconfig>

Plik /etc/fonts/conf.avail/57-times-new-roman.conf :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fontconfig SYSTEM "../fonts.dtd">
<!-- /etc/fonts/conf.d/57-dejavu-serif.conf

     Define aliasing and other fontconfig settings for
     Times New Roman.

     © 2006-2008 Nicolas Mailhot <nicolas.mailhot at laposte.net>
-->
<fontconfig>
  <!-- Font substitution rules -->
  <alias binding="same">
    <family>Bitstream Prima Serif</family>
    <accept>
      <family>Times New Roman</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Bitstream Vera Serif</family>
    <accept>
      <family>Times New Roman</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>DejaVu LGC Serif</family>
    <accept>
      <family>Times New Roman</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Hunky Serif</family>
    <accept>
      <family>Times New Roman</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>Olwen Serif</family>
    <accept>
      <family>Times New Roman</family>
    </accept>
  </alias>
  <alias binding="same">
    <family>SUSE Serif</family>
    <accept>
      <family>Times New Roman</family>
    </accept>
  </alias>
  <!-- In case Verajja Serif stops declaring itself as Times New Roman -->
  <alias binding="same">
    <family>Verajja Serif</family>
    <accept>
      <family>Times New Roman</family>
    </accept>
  </alias>
  <!-- Generic name assignment -->
  <alias>
    <family>Times New Roman</family>
    <default>
      <family>serif</family>
    </default>
  </alias>
  <!-- Generic name aliasing -->
  <alias>
    <family>serif</family>
    <prefer>
      <family>Times New Roman</family>
    </prefer>
  </alias>
</fontconfig>

Te trzy pliki są takie same jak ich odpowiedniki z 57-dejavu* . Zmieniły się tyko nazwy czcionek. Druga sprawa to usunięcie dowiązań 57-dejavu* z /etc/fonts/conf.d/ i utworzenie nowych dowiązań do stworzonych wyżej plików. Operacja ta sprawi, że domyślne czcionki w systemie (dejavu) zostaną zastąpione przez te z MS.

4.2.3. Pliki ~/.config/fontconfig/fonts.conf oraz ~/.fonts.conf

Czcionki można również konfigurować lokalnie przez plik ~/.config/fontconfig/fonts.conf . Obecnie odchodzi się od konfiguracji przez plik ~/.fonts.conf . Dlatego też nie powinno się używać bezpośrednio tego pliku. Dużo lepszym rozwiązaniem jest stworzenie linku wskazującego na plik: ~/.config/fontconfig/fonts.conf . W przypadku konfigurowania czcionek globalnie, nie ma potrzeby ich konfigurować lokalnie, chyba, że nie mamy wpływu na systemowe ustawienia czcionek. Wtedy tworzymy plik ~/.config/fontconfig/fonts.conf o treści:

<?xml version="1.0"?>
<!--?xml version="1.0"?>-->
<!--DOCTYPE fontconfig SYSTEM "fonts.dtd">-->
<!-- ~/.fonts.conf for per-user font configuration -->
<fontconfig>
  <alias>
    <family>serif</family>
    <prefer>
      <family>Times New Roman</family>
    </prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Arial</family>
    </prefer>
  </alias>
  <alias>
    <family>sans</family>
    <prefer>
      <family>Arial</family>
    </prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer>
      <family>Courier New</family>
    </prefer>
  </alias>

 <match target="font">
  <edit mode="assign" id="hinting" >
   <bool>true</bool>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" id="hintstyle" >
   <const>hintfull</const>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" id="rgba" >
   <const>none</const>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" id="antialias" >
   <bool>false</bool>
  </edit>
 </match>

</fontconfig>

4.2.4. Katalog ~/.config/fontconfig/conf.d/

Czcionki można również skonfigurować przez dowiązania do plików znajdujących się w /etc/fonts/conf.avail/ . Wszelkie dowiązania muszą znajdować się w ~/.config/fontconfig/conf.d/ . Przy czym jedna uwaga -- administrator systemu możne zabronić userom ustawiania czcionek po swojemu. Wystarczy, że usunie dowiązanie /etc/fonts/conf.d/50-user.conf .

4.2.5. Czcionki azjatyckie

Prawdopodobnie większość z nas nie potrzebuje tego bajeru. Ja niebyt się orientuje w chińskim czy innym tego typu języku ale trochę drażni mnie fakt, że na pewnych stronach zamiast konkretnych znaków mam prostokąciki. Korzystam z forów językowych, takich jak wordreference.com i tam jest to dość dobrze widoczne. Ja generalnie instaluje dwa pakiety -- ttf-baekmuk (od czcionek koreańskich) oraz ttf-kochi-mincho (ten chyba od japońskich).

# aptitude install ttf-baekmuk ttf-kochi-mincho

Po instalacji tych pakietów nie spotkałem się z krzakami w przeglądarce.

4.3. Pliki ~/.Xresources oraz ~/.Xdefaults

Za sprawą tych pliku można konfigurować wygląd różnych aplikacji. Można też w nim ustawić kursor myszki jak i czcionki. Plik ~/.Xdefaults jest przestarzały i powinno się zamiast niego używać ~/.Xresources . Poniżej przykładowy plik .Xresources :

! fonts ----------------------------------------------------------------------
Xft.dpi:        96
Xft.antialias:  false
Xft.rgba:       none
Xft.hinting:    true
Xft.hintstyle:  hintfull

! Xcursor --------------------------------------------------------------------
Xcursor.theme: DMZ-Black
! Xcursor*size: 20

! xscreensaver ---------------------------------------------------------------
!font settings
xscreensaver.Dialog.headingFont:        -*-dina-bold-r-*-*-12-*-*-*-*-*-*-*
xscreensaver.Dialog.bodyFont:           -*-dina-medium-r-*-*-12-*-*-*-*-p*-*-*
xscreensaver.Dialog.labelFont:          -*-dina-4.1.4.medium-r-*-*-12-*-*-*-*-*-*-*
xscreensaver.Dialog.unameFont:          -*-dina-medium-r-*-*-12-*-*-*-*-*-*-*
xscreensaver.Dialog.buttonFont:         -*-dina-bold-r-*-*-12-*-*-*-*-*-*-*
xscreensaver.Dialog.dateFont:           -*-dina-medium-r-*-*-12-*-*-*-*-*-*-*
xscreensaver.passwd.passwdFont:         -*-dina-bold-r-*-*-12-*-*-*-*-*-*-*
!general dialog box (affects main hostname, username, password text)
xscreensaver.Dialog.foreground:         #ffffff
xscreensaver.Dialog.background:         #111111
xscreensaver.Dialog.topShadowColor:     #111111
xscreensaver.Dialog.bottomShadowColor:  #111111
xscreensaver.Dialog.Button.foreground:  #666666
xscreensaver.Dialog.Button.background:  #ffffff
!username/password input box and date text colour
xscreensaver.Dialog.text.foreground:    #666666
xscreensaver.Dialog.text.background:    #ffffff
xscreensaver.Dialog.internalBorderWidth:24
xscreensaver.Dialog.borderWidth:        20
xscreensaver.Dialog.shadowThickness:    2
!timeout bar (background is actually determined by Dialog.text.background)
xscreensaver.passwd.thermometer.foreground:  #ff0000
xscreensaver.passwd.thermometer.background:  #000000
xscreensaver.passwd.thermometer.width:       8
!datestamp format--see the strftime(3) manual page for details
xscreensaver.dateFormat:    %H:%M %d-%m-%Y

! mc ----------------------------------------------------------------------
XTerm*metaSendsEscape: true

W powyższym przykładzie mamy skonfigurowany kursor myszki, czcionki, wygląd wygaszacza ekranu, oraz jedną opcję w xtermie. Więcej informacji na temat samego pliku jak i jego konfiguracji można znaleźć pod tym adresem.

4.4. Konfiguracja motywu Openboxa

Wygląd openboxa co prawda nie powala na pierwszy rzut oka ale można to bez problemu zmienić. Trzeba ustawić odpowiedni theme, np. używając do tego celu lxappearance. Jeśli cierpimy na zbyt mały wybór motywów, możemy doinstalować murrine-themes , który zawiera ich sporo i sobie wybrać, który nam odpowiada. Ja korzystam z zewnętrznego theme i musiałem go umieścić w katalogu ~/.themes/ .

Jeśli chcemy by graficzne appsy odpalane z konta root nie wyglądały okropnie, trzeba podlinkować ~/.themes/ do /root/.themes , oczywiście zmieniając uprawnienia katalogu ~/.themes/ , tak by zwykły user mógł tylko odczytywać z niego dane.

4.5. Pliki ~/.xinitrc i ~/.xprofile

W debianie ustawienie środowiska openbox odbywa się na trochę innych zasadach niż to ma miejsce np. w archlinuxie. Przede wszystkim nie używa się plików ~/.xinitrc czy ~/.xprofile . Konfiguracji sesji jak i window managera dokonujemy przez:

# update-alternatives --config x-session-manager
# update-alternatives --config x-window-manager

Zmienne środowiskowe, które mają być ustawione przed startem openboxa ustawia się w /etc/xdg/openbox/environment albo ~/.config/openbox/environment .

Za to całe zamieszanie jest odpowiedzialny skrypt w /usr/bin/openbox-session . Wygląda on tak:

#!/bin/sh

if test -n "$1"; then
    echo "Syntax: openbox-session"
    echo
    echo "See the openbox-session(1) manpage for help."
  exit
fi

# Clean up after GDM
xprop -root -remove _NET_NUMBER_OF_DESKTOPS \
      -remove _NET_DESKTOP_NAMES \
      -remove _NET_CURRENT_DESKTOP 2> /dev/null

# Set up the environment
A="/etc/xdg/openbox/environment"
test -r $A && . $A
A="${XDG_CONFIG_HOME:-"$HOME/.config"}/openbox/environment"
test -r $A && . $A

# Run Openbox, and have it run the autostart stuff
exec /usr/bin/openbox --startup "/usr/lib/openbox/openbox-autostart OPENBOX" "$@"

Z tego skryptu wynika, że plik environment jest dołączany przed startem sesji openbox . Oczywiście trzeba mieć na uwadze, że zmienne eksportowane przy pomocy tego pliku są widoczne tylko i wyłącznie w sesji openboxa. W przypadku zalogowania się na tty (albo skorzystania z innego środowiska graficznego), zmienne nie zostaną ustawione i trzeba je ustawić przez plik konfiguracyjny shella, np. ~/.bashrc .

4.6. Ujednolicanie wyglądu aplikacji gtk i qt

4.6.1. Pliki ~/.gtk2rc-2.0 oraz ~/.config/gtk-3.0/settings.ini

Za pomocą tych dwóch plików możemy skonfigurować wygląd aplikacji gtk2 oraz gtk3. Można te pliki tworzyć ręcznie lub mogą one zostać wygenerowane przez jedno z narzędzi dostępnych w repozytorium. Ja po części korzystam z obu tych rozwiązań. Najpierw wygenerowałem sobie oba pliki za pomocą lxappearance, a potem je lekko dostosowałem.

Plik ~/.gtk2rc-2.0 :

gtk-theme-name="Zukitwo"
gtk-icon-theme-name="gnome"
gtk-font-name="Sans 9"
gtk-cursor-theme-name="DMZ-Black"
gtk-cursor-theme-size=0
gtk-toolbar-style=GTK_TOOLBAR_ICONS
gtk-toolbar-icon-size=GTK_ICON_SIZE_SMALL_TOOLBAR
gtk-button-images=1
gtk-menu-images=1
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=1
gtk-xft-antialias=0
gtk-xft-hinting=1
gtk-xft-hintstyle="hintfull"
gtk-xft-rgba="none"
#include "/home/morfik/.gtkrc-2.0.mine"
#include "/home/morfik/.themes/Zukitwo/gtk-2.0/gtkrc"

style "scrollbar"
{
    GtkScrollbar::slider-width = 8
}
class "Gtk*Scrollbar" style "scrollbar"

style "resize-grip"
{
    GtkWindow::resize-grip-height = 24
    GtkWindow::resize-grip-width = 24
}
class "GtkWindow*" style "resize-grip"

Plik ~/.config/gtk-3.0/settings.ini :

[Settings]
gtk-theme-name=Zukitwo
gtk-icon-theme-name=gnome
gtk-font-name=Sans 9
gtk-cursor-theme-name=DMZ-Black
gtk-cursor-theme-size=0
gtk-toolbar-style=GTK_TOOLBAR_ICONS
gtk-toolbar-icon-size=GTK_ICON_SIZE_SMALL_TOOLBAR
gtk-button-images=1
gtk-menu-images=1
gtk-enable-event-sounds=1
gtk-enable-input-feedback-sounds=0
gtk-xft-antialias=0
gtk-xft-hinting=1
gtk-xft-hintstyle=hintfull
gtk-xft-rgba=none

gtk-icon-sizes = panel-menu=16,16:gtk-large-toolbar=16,16

gtk-recent-files-max-age=0
gtk-recent-files-limit=0

4.6.2. Plik ~/.config/Trolltech.conf

W tym pliku są przechowywane ustawienia aplikacji qt. Plik można wygenerować za pomocą qtconfig-qt4. Interesuje nas poniższa sekcja tego pliku:

[Qt]
font="Sans Serif,9,-1,5,50,0,0,0,0,0"
Palette\active=#2c2c2c, #dcdcdc, #ffffff, #cbc7c4, #b8b8b8, #b8b5b2, #2c2c2c, #ffffff, #2c2c2c, #f7f7f7, #dcdcdc, #a9a9a9, #93acbf, #f5f5f5, #0000ff, #ff00ff, #f0f0f0, #000000, #ffffdc, #000000
Palette\inactive=#2c2c2c, #dcdcdc, #ffffff, #cbc7c4, #b8b8b8, #b8b5b2, #2c2c2c, #ffffff, #2c2c2c, #f7f7f7, #dcdcdc, #a9a9a9, #91aabe, #f5f5f5, #0000ff, #ff00ff, #f0f0f0, #000000, #ffffdc, #000000
Palette\disabled=#848484, #dcdcdc, #ffffff, #cbc7c4, #b8b8b8, #b8b5b2, #848484, #ffffff, #848484, #f7f7f7, #dcdcdc, #a9a9a9, #bfbfbf, #f5f5f5, #0000ff, #ff00ff, #f0f0f0, #000000, #ffffdc, #000000
fontPath=@Invalid()
embedFonts=true
style=GTK+
doubleClickInterval=400
cursorFlashTime=1000
wheelScrollLines=3
resolveSymlinks=false
globalStrut\width=0
globalStrut\height=0
useRtlExtensions=false
XIMInputStyle=On The Spot
DefaultInputMethod=xim
audiosink=Auto
videomode=Auto
GUIEffects=none

By aplikacje qt i gtk wyglądały z grubsza tak samo, trzeba ustawić style=GTK+ . Jednak to nie zadziała bez posiadania zmiennej GTK2_RC_FILES="$HOME/.gtkrc-2.0" w środowisku. Inną uciążliwością może być niezgodność ikon -- w aplikacjach gtk są ikony gnome, a w aplikacjach qt są ikonki kde. Można to ujednolicić przez ustawienie zmiennej GNOME_DESKTOP_SESSION_ID=1 . To jednak pociąga za sobą pewne komplikacje, gdyż ta zmienna wysyła do programów błędne sygnały o obecności środowiska gnome na pokładzie, a my gnome nie posiadamy -- posiadamy jedynie menadżer okien openbox. Prawdopodobnie trzeba będzie doinstalować pewne komponenty środowiska gnome by zachować kompatybilność. Być może część aplikacji, których będziemy używać już zawiera odpowiednie pakiety w zależnościach. Oczywiście można odpuścić sobie tą zmienna jeśli różne ikonki nam nie przeszkadzają. Jeśli jednak chcemy mieć je takie same to dopisujemy poniższe dwie linijki do ~/.config/openbox/environment :

export GTK2_RC_FILES="$HOME/.gtkrc-2.0"
export GNOME_DESKTOP_SESSION_ID=1

4.6.3. Tapeta pulpitu

Tapetę można ustawić albo korzystając z pakietu nitrogen albo posługując się feh. I to ten drugi sposób wybierzemy. Musimy pierw zainstalować feh:

# aptitude install feh libjpeg-progs

Ja stworzyłem w swoim katalogu domowym folder ~/wallpapers/ do niego będę wrzucał tapety. Wydajemy polecenie:

$ feh --bg-scale /home/morfik/wallpapers/tapeta.png

Stworzy to plik ~/.fehbg o treści jak linijka powyżej ale bez znaku zachęty.

Musimy jeszcze to dodać do autostartu, tak by openbox ustawił nam tapetę automatycznie. Do pliku ~/.config/openbox/autostart dopisujemy:

eval `cat $HOME/.fehbg` &

4.7. Katalog /etc/default/

W tym katalogu znajdują się pliki z częściową konfiguracją demonów. Zmienne zawarte w nich odnoszą się do skryptów init. Ułatwia to życie administratorom systemów gdyż w przypadku aktualizacji pakietu nie trzeba określonych i nie zmiennych opcji konfigurować na nowo. Część z tych plików odnosi się do usług urządzeń np. skanera. Zostaną one uwzględnione później. Poniżej zaś zostaną opisane pliki, które zasługują na nieco więcej uwagi.

4.7.1. Plik /etc/default/rcS

W tym miejscu możemy min. zdefiniować czy pliki w katalogu /tmp/ powinny być czyszczone wraz ze startem systemu. Domyślnie ta opcja jest włączona. Czyszczenie plików tymczasowych możemy wyłączyć (TMPTIME=-1) lub też możemy ustawić czas (w postaci liczby dni), po którym starsze pliki zostaną skasowane.

Można też wymusić pełne załadowanie systemu zanim zwykłemu użytkownikowi zezwoli się na zalogowanie (DELAYLOGIN=yes). Z tego co wyczytałem, lepiej jest zezwolić na logowanie wcześniej ale nie było napisane z jakiego powodu. W przypadku ustawienia tej opcji, zostanie utworzony plik /var/lib/initscripts/nologin oraz link do niego w /etc/nologin . Podczas procesu bootowania, program login sprawdza obecność /var/lib/initscripts/nologin przy pomocy dowiązania i póki cel linku istnieje, nie zezwala na zalogowanie się użytkownikom innym niż root.

Są też opcje dla trybu bardziej rozmownego podczas startu systemu -- VERBOSE oraz automatycznego naprawiania błędów systemu plików bez pytania -- FSCKFIX . FSCKFIX=yes może być niebezpieczny. W przypadku gdy pojawiają się dość skomplikowane błędy, np. przy niepoprawnym odmontowaniu voluminów truecrypta, normalnie zostanie wyrzucony komunikat z treścią "co zrobić, czy naprawiać?". Nigdy nie ustawiałem tej opcji na "yes" ale z tego co piszą na necie, taki błąd zostałby naprawiony bez pytania, co w przypadku zaszyfrowanego dysku prawdopodobnie będzie się wiązać z utratą danych zawartych na nim. Nie wiem czy tak jest w istocie i nie mam zamiaru sprawdzać. xD

4.7.2. Plik /etc/default/tmpfs

W tym pliku możemy ustawić opcje montowania katalogu /tmp/ w pamięci RAM. W przypadku gdy mamy jej dużo, ten sposób jest zalecany, gdyż znacząco przyśpiesza działanie systemu, zwłaszcza w przypadku korzystania z przeglądarek internetowych przy używaniu dysków hdd. W przypadków dysków sdd, przedłuża ich życie, gdyż całe tony GiB śmieci tymczasowych przechodzą tylko przez RAM, który jest wieczny, przynajmniej przy odpowiednim traktowaniu. W przypadku gdy ktoś zdecyduje się na zamontowanie katalogu /tmp/ w RAMie, może wyłączyć opcje czyszczenia katalogu /tmp/ przy starcie systemu w pliku /etc/default/rcS , gdyż dane w pamięci RAM zostają wyczyszczone po odcięciu zasilania, przynajmniej w teorii. xD

4.7.3. Plik /etc/default/useradd

Plik ten odpowiada za konfigurację użytkowników przy dodawaniu ich do systemu. Można w nim zdefiniować domyślnego shella czy grupę, do której użytkownicy będą automatycznie dodawani. Można też zmienić domyślny katalog domowy /home/ oraz ustawić unieważnienie hasła do konta po określonym czasie w przypadku gdy konto zostanie trwale wyłączone.

4.8. Urządzenia

4.8.1. Kursor myszki

Kursory myszy można skonfigurować przez lxappearance albo przez plik ~/.Xresources , o którym wspomniałem wyżej. Konfiguracja raczej nie powinna sprawić problemu ale ja napotkałem śmieszny błąd, który objawiał się różnymi kursorami (biały lub czarny) w zależności od tego gdzie kursor się znajdował. Można to wyeliminować przez ustawienie domyślnego kursora myszy dla całego systemu przy pomocy:

# update-alternatives --config x-cursor-theme
Są 2 dostępne alternatywy dla x-cursor-theme (dostarczające /usr/share/icons/default/index.theme).

  Wybór       Ścieżka                                Priorytet  Status
------------------------------------------------------------
  0            /usr/share/icons/DMZ-White/cursor.theme   90        tryb auto
* 1            /usr/share/icons/DMZ-Black/cursor.theme   30        tryb ręczny
  2            /usr/share/icons/DMZ-White/cursor.theme   90        tryb ręczny

Proszę wcisnąć Enter, aby pozostawić bieżący wybór[*]; albo wpisać wybrany numer: 1

4.8.2. Klawisze multimedialne oraz inne niedziałające klawisze

Zwykle nawet poprawne ustawienie klawiatury nie daje gwarancji, że wszystkie klawisze będą działać. W przypadku tych, które jeszcze nie działają (zwykle są to klawisze multimedialne), trzeba je do pracy zmusić ręcznie. Wszystko sprowadza się do przemapowania klawiszy. Mapowanie klawiszy to nic innego jak powiązanie ze sobą scancode z keycode. Xorg ma problemy z obsługą klawiszy, których keycode jest większy niż 255. W przypadku mojej klawiatury nie działało paręnaście klawiszy -- zwykle miały keykode > 300. Po przemapowaniu ich, tylko jeden nadal pozostał "ślepy" ale on nie miał ani scancode ani keycode. Także racze w tej kwestii nie dało się nic zrobić.

Keycode są trzymane w /usr/include/linux/input.h . Do ustalenia, który klawisz ma jaki keycode można się posłużyć xev albo showkey (showkey tylko pod tty). Jak zmusić niedziałające klawisze do pracy dokładnie opisałem pod tym linkiem.

4.8.3. Drukarka

Ja jestem tym szczęśliwcem, który posiada takie fajne urządzenie zwane drukarką. Bardzo umila życie pod warunkiem, że działa jak należy, a z tym zwykle są problemy. Cups (serwer druku) radzi sobie, przynajmniej w moim wypadku, dość dobrze z obsługa mojej drukarki. Niemniej jednak, potrzebne mu są odpowiednie sterowniki do niej. Te sterowniki, jak i całe mnustwo innych, są zawarte w pakiecie printer-driver-gutenprint. By postawić sprawnie działający serwer wydruku potrzeba zainstalować poniższe 3 pakiety:

# aptitude install cups printer-driver-gutenprint ghostscript 

Drukarką będziemy zarządzać przez przeglądarkę internetową, w polu adresu której trzeba wpisać localhost:631. Można tam przeprowadzić dosłownie wszystkie prace administracyjne, począwszy od dodania drukarki, skończywszy na szczegółowej jej konfiguracji.

Pliki konfiguracyjne cupsa znajdują się w /etc/cups/ . Jeśli chcemy dostosować cupsa do własnych potrzeb rezygnując przy tym ze standardowej konfiguracji demona, powinniśmy zainteresować się plikami /etc/cups/cupsd.conf oraz /etc/cups/cups-files.conf .

4.8.4. Skaner

Mam również i skaner, choć za dużo nie skanuję -- mamy XXI wiek i praktycznie to urządzonko wychodzi powoli z użycia, niczym płytki cd. Spójrzmy prawdzie w oczy, dziś wszystko już mamy w wersji elektronicznej i nie ma sposobu by uniemożliwić tworzenie virtualnych kopi dokumentów, książek, czy co tam się jeszcze skanowało w XX wieku.

Pakiety, które są potrzebne:

# aptitude install sane sane-utils xsane xsane-common

W pliku /etc/default/saned możemy zdefiniować czy usługa będzie odpalana wraz ze startem systemu oraz jaki user ma zarządzać demonem saned. Warto też rzucić okiem na pliki konfiguracyjne skanera w /etc/sane.d/ . Mój skaner jest firmy Plustek (kto tą nazwę wymyślił xD) i w moim przypadku będzie to plik /etc/sane.d/plustek.conf . Standardowe ustawienia mnie zadowalają, także ja nic tam nie zmieniam.

4.8.5. Bluetooth

Bluetooth, bardzo użyteczne urządzenie, jednak pod linuxem zwykle nie działa out of box , a czasem to i w ogóle nie działa. Ja z reguły korzystam z bluemana by komunikować się z moim PC przy użyciu telefonu. Jednak czasem wgrywanie na telefon danych jest bardzo upierdliwe, pomijając już prędkość przesyłu, i trzeba ratować się ręcznym montowaniem telefonu w systemie przy użyciu obexa.

Potrzebne pakiety

# aptitude install bluez blueman obexfs

Gdy nasz bluetooth działa prawidłowo, możemy korzystać z bluemana. Konfiguracji demona bluetooth dokonujemy w pliku /etc/default/bluetooth . Pliki konfiguracyjne znajdują się w /etc/bluetooth/ .

W przypadku "the worst case scenario" trzeba będzie montować urządzenie ręcznie. Skomplikowane to nie jest ale najlepiej mieć pod ręka krótką rozpiskę jak to zrobić, by później nie tracić czasu na szukanie informacji.

Przede wszystkim trzeba pamiętać, że by mieć możliwość montowania pamięci telefonu w systemie jako zwykły użytkownik, musimy się pierw dodać do grupy fuse. W przeciwnym wypadku, do telefonu uzyskamy dostęp tylko z konta root. Gdy się dodamy do odpowiedniej grupy (adduser morfik fuse) musimy zresetować środowisko graficzne by ta zmiana zaczęła obowiązywać. Po zalogowaniu się, by podejrzeć co mamy w telefonie, wydajemy polecenie:

$ obexfs -b 58:17:0c:11:46:0f /mnt/fon/
$ cd /mnt/fon/
$ ls -al /mnt/fon/
razem 5,0K
drwxr-xr-x 1 morfik morfik    0 cze 20 23:31 .
drwxr-xr-x 3 root   root   4,0K cze 20 23:09 ..
drwxr-xr-x 1 morfik morfik    0 sty  1  1970 Karta pamięci
drwxr-xr-x 1 morfik morfik    0 sty  1  1970 Pamięć telefonu

Gdy skończymy wymieniać dane z telefonem, odmontowujemy:

$ fusermount -u /mnt/fon/

Oczywiście ja preferuje wyciągnięcie karty z telefonu i podpięcie jej przez czytnik kart pamięci wprost do portu usb, co sprawia, że karta jest traktowana przez system jako zwykły pendrive. Problem pojawia się w momencie gdy chcę uzyskać dostęp do pamięci telefonu, a to mogę jedynie zrobić przy pomocy bluetooth.

4.8.6. Temperatura podzespołów

Płyta główna czy dyski twarde zawierają czujniki umożliwiające monitorowanie pewnych parametrów podczas ich pracy. Zwykle jest to temperatura. Istnieją narzędzia, które umożliwiają jej podgląd. Od temperatury dysków jest hddtemp , zaś od temperatury procesora i innych układów umieszczonych na płycie głównej jest lm-sensors .

Potrzebne pakiety:

# aptitude install hddtemp lm-sensors

Wydając polecenie sensors-detect jako root uzyskamy moduł, który trzeba dopisać do pliku /etc/modules .

# sensors-detect
...
Driver `it87':
  * ISA bus, address 0x290
    Chip `ITE IT8718F Super IO Sensors' (confidence: 9)

To load everything that is needed, add this to /etc/modules:
#----cut here----
# Chip drivers
it87
#----cut here----
If you have some drivers built into your kernel, the list above will
contain too many modules. Skip the appropriate ones!

Do you want to add these lines automatically to /etc/modules? (yes/NO)

Unloading i2c-dev... OK
Unloading cpuid... OK

W tej chwili czujniki powinny zostać wykryte przez system. By sprawdzić czy tak faktycznie jest, wydajemy polecenie:

$ sensors
it8718-isa-0290
Adapter: ISA adapter
in0:          +1.22 V  (min =  +0.00 V, max =  +4.08 V)
in1:          +1.79 V  (min =  +0.00 V, max =  +4.08 V)
in2:          +3.25 V  (min =  +0.00 V, max =  +4.08 V)
+5V:          +2.88 V  (min =  +0.00 V, max =  +4.08 V)
in4:          +0.00 V  (min =  +0.00 V, max =  +4.08 V)  ALARM
in5:          +0.00 V  (min =  +0.00 V, max =  +4.08 V)  ALARM
in6:          +1.25 V  (min =  +0.00 V, max =  +4.08 V)
in7:          +2.98 V  (min =  +0.00 V, max =  +4.08 V)
Vbat:         +4.08 V
fan1:         762 RPM  (min =   10 RPM)
fan2:           0 RPM  (min =    0 RPM)
fan3:        1603 RPM  (min =    0 RPM)
temp1:        -55.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
temp2:        +32.0°C  (low  = +127.0°C, high = +60.0°C)  sensor = thermal diode
temp3:         -1.0°C  (low  = +127.0°C, high = +127.0°C)  sensor = thermistor
cpu0_vid:    +1.263 V
intrusion0:  ALARM

By sprawdzić temperaturę dysków twardych, trzeba uruchomić i skonfigurować pierw demona. Plik konfiguracyjny znajduje się w /etc/default/hddtemp . Zmieniamy w nim poniższe linijki:

RUN_DAEMON="true"
DISKS="/dev/sda /dev/sdb"

Po czym restartujemy demona za pomocą /etc/init.d/hddtemp restart . Możemy teraz odczytać temperaturę dysku przez wydanie polecenia:

$ nc localhost 7634
|/dev/sda|WDC WD15EARS-00MVWB0|38|C|

4.8.7. Sterowanie prędkością obrotów wentylatorów

Fancontrol umożliwia dostosowanie prędkości wentylatorów na podstawie temperatury podzespołów. Głównie chodzi o wiatrak na procesorze. Instalujemy pakiet:

# aptitude install fancontrol

By fancontrol wykonał swoje zadanie, potrzebny jest mu odpowiedni plik konfiguracyjny -- /etc/fancontrol . Można go wygenerować za pomocą pwmconfig . Plik będzie miał postać podobną do tej poniżej:

# Configuration file generated by pwmconfig, changes will be lost
INTERVAL=10
DEVPATH=hwmon0=devices/platform/it87.656
DEVNAME=hwmon0=it8718
FCTEMPS= hwmon0/device/pwm1=hwmon0/device/temp2_input
FCFANS= hwmon0/device/pwm1=hwmon0/device/fan1_input
MINTEMP= hwmon0/device/pwm1=20
MAXTEMP= hwmon0/device/pwm1=45
MINSTART= hwmon0/device/pwm1=150
MINSTOP= hwmon0/device/pwm1=0
MAXPWM= hwmon0/device/pwm1=255

Odszyfrowanie parametrów raczej nie powinno sprawić problemów. Cała sztuka w odpowiednim przypisaniu wentylatora do czujnika temperatury oraz określenie progów temperatur, przy których wiatrak się zatrzyma oraz będzie się kręcił z pełną prędkością.

4.8.8. Skalowanie procesora

Nowe procesory, by oszczędzić zużycie energii, posiadają możliwość skalowania częstotliwości czyli doboru mocy w zależności od obciążenia. Powoduje to lekki spadek wydajności ale potrafi w sposób znaczny obniżyć prądożerność procesora. Instalujemy pakiet cpufrequtils:

# aptitude install cpufrequtils

Sprawdzamy czy procesor jest skalowalny:

 cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 160 us.
  hardware limits: 2.40 GHz - 3.00 GHz
  available frequency steps: 3.00 GHz, 2.40 GHz
  available cpufreq governors: userspace, ondemand, performance
  current policy: frequency should be within 2.40 GHz and 3.00 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency is 2.40 GHz.
analyzing CPU 1:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 1
  CPUs which need to have their frequency coordinated by software: 1
  maximum transition latency: 160 us.
  hardware limits: 2.40 GHz - 3.00 GHz
  available frequency steps: 3.00 GHz, 2.40 GHz
  available cpufreq governors: userspace, ondemand, performance
  current policy: frequency should be within 2.40 GHz and 3.00 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency is 2.40 GHz.

Jeżeli nasz procesor posiada co najmniej dwie częstotliwości, to znaczy że możemy mu ustawić skalowanie. W przypadku dwóch wartości raczej niewiele jest do roboty ale gdy jest ich tam więcej, można je ogarnąć przy pomocy pliku /etc/init.d/cpufrequtils zmieniając odpowiednie wartości. W moim przypadku są to:

...
ENABLE="true"
GOVERNOR="ondemand"
MAX_SPEED="3000000"
MIN_SPEED="2400000"
...
if [ -n "$MAX_SPEED" ] && [ $MAX_SPEED != "3000000" ] ; then
    CPUFREQ_OPTIONS="$CPUFREQ_OPTIONS --max $MAX_SPEED"
fi

if [ -n "$MIN_SPEED" ] && [ $MIN_SPEED != "2400000" ] ; then
    CPUFREQ_OPTIONS="$CPUFREQ_OPTIONS --min $MIN_SPEED"
...

Wartości, które można wpisać w zmiennych GOVERNOR , MAX_SPEED , MIN_SPEED można odczytać za pomocą cpufreq-info lub też podglądając odpowiednie pliki (inny, bardziej zaawansowany sprzęt xD):

$ more /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
1999000 1866000 1733000 1599000 1466000 1333000 1199000 1066000 933000 
$ more /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
userspace ondemand performance 

Moje problemy ze skalowaniem procka można znaleźć tutaj albo http://forum.dug.net.pl/viewtopic.php?id=23115tutaj.

4.8.9. S.M.A.R.T

Technologia S.M.A.R.T ma na celu przewidzenie awarii dysku twardego. Monitoruje ona szereg parametrów urządzenia i ich analiza może pomóc w określeniu stanu dysku. Do sprawdzenia parametrów S.M.A.R.T możemy użyć tekstowego smartctl albo graficznego narzędzia gsmartcontrol .

Pakiety do zainstalowania:

# aptitude install smartmontools gsmartcontrol

W pliku /etc/default/smartmontools ustawiamy konfigurację demona smart. Zmieniamy w nim poniższe opcje:

enable_smart="/dev/sda"
start_smartd=yes

4.8.10. Dźwięk

4.8.10.1. PulseAudio

Wielu ludzi niezbyt przepada za pulseaudio z powodu problemów jakie u nich generuje, u mnie jednak on działa w miarę w porządku. Pracuje z nim od początku jak mam linuxa (prawie 5 lat) i przez cały ten okres czasu tylko parę razy miałem z nim problemy, z czego większość dotyczyła aplikacji korzystających z alsy. Nie miałem czasu by zając się konfiguracją alsy (przez 5 lat?) ale przy posiadaniu samej alsy w systemie, mój dźwięk działa gorzej niż w przypadku większości osób używających pulseaudio. xD Skupię się tutaj głównie na konfiguracji pulse, także jeśli ktoś nie chce instalować go w swoim systemie, może pominąć ten rozdział.

Potrzebne pakiety:

# aptitude install alsa-base alsa-utils gstreamer0.10-alsa gstreamer0.10-pulseaudio \
pulseaudio pavucontrol vlc-plugin-pulse pulseaudio-module-gconf pulseaudio-module-x11 \
pulseaudio-utils libao4

W przypadku posiadania dźwiękowych aplikacji KDE, takich jak amarok czy kadu, trzeba również doinstalować:

# aptitude install phonon phonon-backend-vlc

4.8.10.2. Plik /etc/modprobe.d/alsa-base.conf

Zanim przejdziemy bezpośrednio do konfiguracji pulse, musimy pierw zrobić porządek z urządzeniami w systemie. W pliku /etc/modprobe.d/alsa-base.conf jest trzymana konfiguracja kart dźwiękowych. Jako, że mam dwa urządzenia odtwarzające dźwięk, dopisałem do niego dwie poniższe linijki:

options snd-ca0106 index=0
options snd-hda-intel index=1

Tym sposobem moje karty -- jedna obsługiwana przez moduł snd-ca0106 , druga zaś przez moduł snd-hda-intel -- występują w systemie w takiej samej kolejności. Pierwsza jest karta zewnętrzna, druga jest karta wewnętrzna, zintegrowana z płytą główną. I teraz odwołując się do pierwszej karty mam pewność, że dźwięk trafia w pożądane miejsce i nie leci czasem gdzieś indziej. Oczywiście można też wyłączyć zbędną kartę w biosie, zostawiając tylko jedno urządzenie i problem powinien się sam rozwiązać.

W przypadku chęci posiadania kilku urządzeń dźwiękowych, trzeba pierw ustalić jakie moduły w kernelu są odpowiedzialne za ich obsługę. Pomóc nam w tym mogą poniższe polecenia:

$ cat /proc/asound/cards
 0 [CA0106         ]: CA0106 - CA0106
                      Audigy SE [SB0570] at 0xa000 irq 19
 1 [Intel          ]: HDA-Intel - HDA Intel
                      HDA Intel at 0xe3100000 irq 42
$ cat /proc/asound/modules
 0 snd_ca0106
 1 snd_hda_intel

Wrzucamy moduły do pliku /etc/modprobe.d/alsa-base.conf i ustawiamy odpowiedni index. Po zresetowaniu maszyny, karty powinny być już w odpowiednim porządku.

4.8.10.3. Konfiguracja PulseAudio

Pliki konfiguracyjne znajdują się w /etc/pulse/ ale można zrobić z nich kopie lokalną w katalogu ~/.pulse/ i skonfigurować pulse dla każdego użytkownika osobno. Ja jednak będę operował na plikach w /etc/pulse/ gdyż chcę by zmiany w ustawieniach dotyczyły wszystkich użytkowników w systemie.

Na starcie przydałoby się wyłączyć automatyczne resetowanie się pulse. Edytujemy plik /etc/pulse/client.conf i usuwamy ; z początku linii:

autospawn = no

Od tej chwili możemy swobodnie zatrzymywać (pulseaudio -k) i stratować (pulseaudio -D) pulse. Pamiętajmy by robić to z konta zwykłego użytkownika a nie roota.

Przechodzimy do konfiguracji demona edytując plik /etc/pulse/daemon.conf . Ja w nim zmieniłem poniższe linijki:

daemonize = yes
use-pid-file = yes
flat-volumes = no
default-sample-rate = 44100
alternate-sample-rate = 48000
default-sample-channels = 4
default-channel-map = front-left,front-right,rear-left,rear-right

Jest kilka miejsc w systemie, w których musimy ustawić pulse jako domyślne wyjście dźwięku.

Plik /etc/libao.conf :

default_driver=pulse

Przy korzystaniu z mplayera2 były dziwne problemy ale wyrzucenie pakietu mplayer2 i doinstalowanie pakietu mplayer sprawiło, że wszystko wróciło do normy. Można też skonfigurować mplayera by domyślnie używał wyjścia pulse w pliku /etc/mplayer/mplayer.conf dodając poniższą linijkę:

ao=pulse,alsa,sdl:aalib

Można również ustawić domyślne wyjście gstreamera wpisując jako zwykły użytkownik dwa polecenia:

$ gconftool -t string --set /system/gstreamer/0.10/default/audiosink pulsesink
$ gconftool -t string --set /system/gstreamer/0.10/default/audiosrc pulsesrc

Do tego dochodzi oczywiście konfiguracja aplikacji, np. vlc czy smplayer.

Obecnie nie ma potrzeby tworzyć plików ~/.asoundrc czy /etc/asound.conf by przekierować aplikacje używające alsy do pulse, gdyż odbywa się to za pomocą pliku /usr/share/alsa/pulse-alsa.conf , który wygląda jak poniżej:

# This file is referred to by /usr/share/alsa/pulse.conf to set pulseaudio as
# the default output plugin for applications using alsa when PulseAudio is
# running.

pcm.!default {
    type pulse
    hint {
        show {
            @func refer
            name defaults.namehint.basic
        }
        description "Playback/recording through the PulseAudio sound server"
    }
}

ctl.!default {
    type pulse
    hint {
        show {
            @func refer
            name defaults.namehint.basic
        }
        description "Playback/recording through the PulseAudio sound server"
    }
}

pcm.pulse {
    type pulse
    hint {
        description "Playback/recording through the PulseAudio sound server"
    }
}

ctl.pulse {
    type pulse
    hint {
        description "Playback/recording through the PulseAudio sound server"
    ii}
}

Oczywiście, dalej istnieje możliwość nadpisania ustawień przez te pliki, o czym warto pamiętać.

Pulseaudio domyślnie skonfigurowany jest by zajmować urządzenie dźwiękowe, co czyni niemożliwym odtwarzanie aplikacji korzystających z alsy przy jednoczesnym odtwarzaniu dźwięku w aplikacjach korzystających z pulse. Niektóre aplikacje nie posiadają natywnej obsługi pulse, a emulacja alsy nie zawsze działa poprawnie. Jeśli korzystamy z tego typu programów, dobrze jest skonfigurować pulseaudio tak by nie był taki samulobny i dzielił się urządzeniem z alsą. W tym celu edytujemy plik /etc/pulse/default.pa zmieniając w nim:

load-module module-alsa-sink device=dmix
load-module module-alsa-source device=dsnoop

W moim przypadku przy używaniu konfiguracji na 4 głośniki występują problemy z dźwiękiem po odhibernowaniu systemu -- jeden głośnik jest głuchy. Nigdy nie sprawdzałem czy tego typu sytuacja istnieje w przypadku działania samej alsy, bo tam mi działają tylko 2 głośniki xD ale idzie się z tym uporać przez odpowiedni skrypt, który w połączeniu z pm-utils przywróci dźwięk do normy. Pakiet pm-utils powinniśmy mieć już wgrany, także przystąpmy do napisania skryptu. Nie jest on jakoś rozbudowany i wygląda tak:

#!/bin/bash
case "$1" in
    hibernate|suspend)
        pkill amarok
        pkill volumeicon
        su morfik -c "pulseaudio -k"
        sleep 5
       ;;
    thaw|resume)
        su morfik -c "pulseaudio -D"
        sleep 1
        su -l morfik -c "/usr/bin/volumeicon_start" 
       ;;
    *) exit $NA
       ;;
 esac

Zapisujemy go w /etc/pm/sleep.d/10_sound .

Skrypt nic nie robi przy hibernowaniu i usypianiu systemu. W przypadku jego wybudzenia, zostanie ubity pulseaudio, a następnie przeładowane zostaną moduły jądra odpowiadające za obsługę urządzeń dźwiękowych. Po chwili demon pulse zostanie wystartowany na nowo.

W powyższym przykładzie wziął udział inny skrypt -- alsa (/usr/sbin/alsa). To za jego pomocą zostały przeładowane dźwiękowe moduły kernela. Oczywiście skrypt można sobie pożyczyć i używać w każdym innym przypadku, niekoniecznie musi to być hibernacja systemu. Tak na wszelki wypadek gdyby ten skrypt został skasowany, poniżej zamieszczam jego treść:

#!/bin/sh
#
# alsa-base control script
#
# Description: Used to load and unload ALSA modules and
#              restore and store mixer levels. There is no
#              longer any need to run this script on bootup
#              or shutdown. It is now moved to /usr/sbin.

set -e

# Exit if alsa-base package is not installed
[ -f /etc/modprobe.d/alsa-base.conf ] || exit 0

MYNAME=/usr/sbin/alsa
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# Default values of variables in /etc/default/alsa-base
force_unload_modules_before_suspend=""

[ -f /etc/default/alsa-base ] && . /etc/default/alsa-base

# $* MESSAGE
warn() { echo "${MYNAME}: Warning: $* " >&2 ; }

#
# Attempt to create /var/run/alsa if it is absent.
# Return true if /var/run/alsa exists after this attempt,
# otherwise false.
#
check_run_dir()
{
    [ -d /var/run/alsa ] && return 0
    # We have no business creating /var/run if it doesn't exist
    if ! [ -d /var/run ] ; then
        warn "Could not create /var/run/alsa/ because /var/run/ is not present."
        return 1
    fi
    if ! mkdir --mode=755 /var/run/alsa ; then
        warn "Failed to create /var/run/alsa/."
        return 1
    fi
    [ -d /var/run/alsa ] && return 0
    return 1
}

echo_procs_using_sound()
{
    for i in /proc/[0-9]*/fd/* ; do
        var="$(readlink $i)"
        if test x"$var" != x"${var#/dev/snd/pcm}" ; then
            IFS=/; set -- $i; unset IFS; echo $3
        fi
    done
}

# $* [PID]...
echo_with_command_names()
{
    [ "$1" ] || return 0
    echo $( \
        ps --no-headers -o "%p %c" "$@" \
        | sed -e 's/\([0-9][0-9]*\) \(.*\)/\1(\2)/' \
    )
}

kill_procs_using_sound()
{
    procs_using_sound="$(echo_procs_using_sound)"
    if [ "$procs_using_sound" ] ; then
        echo -n "Terminating processes:"
        for attempt in 1 2 3 4 ; do
            echo -n " ${procs_using_sound}"
            kill $procs_using_sound || :
            sleep 1
            procs_using_sound="$(echo_procs_using_sound)"
            [ "$procs_using_sound" ] || break
        done
        # Either no more procs using sound or attempts ran out
        if [ "$procs_using_sound" ] ; then
            echo -n " (with SIGKILL:) ${procs_using_sound}"
            kill -9 $procs_using_sound || :
            sleep 1
        fi
        procs_using_sound="$(echo_procs_using_sound)"
        if [ "$procs_using_sound" ] ; then
            echo " (failed: processes still using sound devices: $(echo_with_command_names $procs_using_sound))."
            return 1
        fi
        echo "."
    fi
    return 0
}

# $* MODULE-NAME [MODULE-NAME]... | "all"
unload_modules()
{
    procs_using_sound="$(echo_procs_using_sound)"
    if [ "$procs_using_sound" ] ; then
        warn "Processes using sound devices: $(echo_with_command_names $procs_using_sound)."
    fi
    if check_run_dir ; then
        :> /var/run/alsa/modules-removed
    else
        warn "Not keeping list of removed modules because /var/run/alsa is absent.
It will not be possible automatically to reload these modules."
    fi
    echo -n "Unloading ALSA sound driver modules:"
    [ -d /proc/asound ] || { echo " (none loaded)." ; return 0 ; }
    echo_snd_modules_loaded()
    {
        lsmod \
        | sed -n -e 's/^\(snd[-_][^[:space:]]*\)[[:space:]].*/\1/p' \
        | sed -e 's/_/-/g'
    }
    for FSMBS in $* ; do
        MODULES_TO_REMOVE=""
        SND_MODULES_LOADED="$(echo_snd_modules_loaded)"
        case "$FSMBS" in
          all)
            MODULES_TO_REMOVE="$SND_MODULES_LOADED"
            ;;
          snd_*|snd-*)
            FSMBS="$(echo "$FSMBS" | sed -e 's/_/-/g')"
            for M in $SND_MODULES_LOADED ; do
                if [ "$FSMBS" = "$M" ] ; then
                    MODULES_TO_REMOVE="$FSMBS"
                    break
                fi
            done
            ;;
        esac
        [ "$MODULES_TO_REMOVE" ] || continue
        if [ -d /var/run/alsa ] ; then
            echo "$MODULES_TO_REMOVE" >> /var/run/alsa/modules-removed
        fi
        for M in $MODULES_TO_REMOVE ; do
            echo -n " ${M}"
            modprobe -r "$M" >/dev/null 2>&1 || :
        done
    done
    if [ -f /var/run/alsa/modules-removed ] ; then
        MODULES_STILL_LOADED="$(echo_snd_modules_loaded | grep -F -f /var/run/alsa/modules-removed)"
        MODULES_STILL_LOADED="$(echo $MODULES_STILL_LOADED)"
    else
        MODULES_STILL_LOADED=""
    fi
    if [ "$MODULES_STILL_LOADED" ] ; then
        echo " (failed: modules still loaded: ${MODULES_STILL_LOADED})."
        return 1
    else
        echo "."
        return 0
    fi
}

# $* MODULE-NAME [MODULE-NAME]... | "all"
force_unload_modules()
{
    kill_procs_using_sound || :
    unload_modules "$@" || return 1
    return 0
}

load_unloaded_modules()
{
    LUM_RETURNSTATUS=0
    MODULES_TO_LOAD=""
    [ -d /var/run/alsa ] || warn "Directory /var/run/alsa is absent."
    echo -n "Loading ALSA sound driver modules:"
    [ -f /var/run/alsa/modules-removed ] && MODULES_TO_LOAD="$(echo $(cat /var/run/alsa/modules-removed))"
    [ "$MODULES_TO_LOAD" ] || { echo " (none to reload)." ; return $LUM_RETURNSTATUS ; }
    echo -n " $MODULES_TO_LOAD"
    for MDL in $MODULES_TO_LOAD ; do
        modprobe $MDL || LUM_RETURNSTATUS=1
    done
    case "$LUM_RETURNSTATUS" in
      0) echo "." ;;
      *) echo " (failed)." ;;
    esac
    return $LUM_RETURNSTATUS
}

case "$1" in
  unload)
    unload_modules all || exit $?
    ;;
  reload)
    EXITSTATUS=0
    unload_modules all || EXITSTATUS=1
    load_unloaded_modules || EXITSTATUS=1
    exit $EXITSTATUS
    ;;
  force-unload)
    force_unload_modules all || exit $?
    ;;
  force-reload)
    EXITSTATUS=0
    force_unload_modules all || EXITSTATUS=1
    load_unloaded_modules || EXITSTATUS=1
    exit $EXITSTATUS
    ;;
  suspend)
    case "$force_unload_modules_before_suspend" in
      ""|false) : ;;
      all|true) force_unload_modules all || exit $? ;;
      *) force_unload_modules $force_unload_modules_before_suspend || exit $? ;;
    esac
    ;;
  resume)
    case "$force_unload_modules_before_suspend" in
      ""|false) : ;;
      *) load_unloaded_modules || exit $? ;;
    esac
    ;;
  *)
    echo "Usage: $MYNAME {unload|reload|force-unload|force-reload|suspend|resume}" >&2
    exit 3
    ;;
esac

4.8.10.4. Problemy z PulseAudio

W przypadku problemów z dźwiękiem można zajrzeć w log pulse, a ten z kolei uzyskamy przez:

$ LANG=C pulseaudio -vvvv --log-time=1 > ~/pulseverbose.log 2>&1

Przy czym pierw trzeba zastopować pulse (pulseaudio -k) i dopiero wtedy wprowadzić powyższą linijkę. Log będzie dość spory, także trzeba się przygotować mentalnie na to co się będzie działo z procesorem. xD

Warto też nie zapominać o alsie przy używaniu pulse. Do dyspozycji jest alsamixer, w którym mogą być przyciszone albo zmutowane potencjometry. Nawet jeżeli po odpaleniu alsamixer widzimy tylko 1 czy 2 suwaki, możemy wybrać kartę za pomocą F6 i dostosować ją indywidualnie.

Pomocne może okazać się również usunięcie ~/.pulse/ oraz ~/.pulse-cookie przy wyłączonym środowisku graficznym oraz zresetowanie maszyny.

Więcej informacji o konfiguracji pulse można znaleźć na wiki archlinuxa albo gentoo.

4.8.10.5. Notyfikacje dźwięku

Niebyt przepadam za wyskakującymi na pulpicie okienkami ale w przypadku zmiany głośności jest to mi wielce niezbędne. Najprościej jest to osiągnąć przez doinstalowanie pakietu z xfce oraz volumeicon :

# aptitude install volumeicon-alsa xfce4-notifyd libnotify-bin

xfce4-volumed również potrafi uporać się dość dobrze z wyświetlaniem notyfikacji. Problem z nim jest taki, że konfliktuje z volumeicon. Ja chcę mięć głośniczek na panelu ale w przypadku gdy ktoś go nie potrzebuje, może zwyczajnie zainstalować w miejsce volumeicon-alsa pakiet xfce4-volumed i później dodać demona do autostartu openboxa w pliku ~/.config/openbox/autostart . Dokładnie taka sama procedura jest w przypadku volumeicon -- zmienia się tylko nazwa w pliku autostatru openboxa. Xfce4-notifyd dostarcza narzędzie xfce4-notifyd-config , które umożliwia konfigurację wyskakujących powiadomień, min. jest tam też opcja gdzie umieścić okienko z notyfikacjami. Z kolei libnotify-bin daje nam narzędzie notify-send , za pomocą którego możemy może wysyłać notyfikacje.

Volumeicon-alsa działa bezproblemowo z pulseaudio.

4.9. Usługi i skrypty startowe

Wielu ludzi może pomyśleć, że sporej części usług nie potrzebuje, np. drukarki, czy bluetootha, bo korzystają z nich raz czy dwa razy w roku, a jak nie patrzeć, działające w tle demony zjadają zasoby systemowe. Wyjścia z takiej sytuacji są dwa -- albo instalować pakiety od święta albo zainstalować pakiety na stałe i przy pomocy skryptów startowych wyłączyć usługi, których się nie potrzebuje. W przypadku gdy zajdzie potrzeba skorzystania z danej usługi, bez problemu można ją włączyć, oszczędzając tym sporo czasu, który byśmy stracili przy instalacji.

Skrypty startowe znajdują się w katalogu /etc/init.d/ . Zarządzamy nimi przez narzędzie update-rc.d. Aktywujemy/Deaktywujemy usługę przy starcie systemu za pomocą:

# update-rc.d cups enable
# update-rc.d cups disable

Pierwsze polecenie zmieni nazwę dowiązania do pliku /etc/init.d/cups w /etc/rc{2,3,4,5}.d na S23cups, zaś druga linijka zmieni nazwę na K01cups. S -- oznacza start, K -- stop usługi w /etc/init.d/ .

W przypadku gdy chcemy zatrzymać/wystartować usługę w trakcie sesji, możemy to zrobić na dwa sposoby. Pierwszy z nich wykorzystuje update-rc.d:

# update-rc.d cups start
# update-rc.d cups stop

Drugi zaś bezpośrednio się odnosi do skryptów w /etc/init.d/ :

# /etc/init.d/cups start
# /etc/init.d/cups stop

By dodać całkiem nowy skrypt do autostartu:

# update-rc-d wypasiona_usluga defaults

Więcej informacji na temat bardziej zaawansowanego dodawania skryptów startowych można znaleźć tutaj.

4.10. Lightdm

Istnieje kilka sposobów by zalogować się w środowisku graficznym. My korzystamy z lightdm. Przydałoby się go nieco dopracować. Potrzebne pakiety mamy już w systemie, także przejdźmy od razu do konfiguracji. Pliki konfiguracyjne znajdują się w /etc/lightdm/ . Nas interesują poniższe trzy:

Plik /etc/lightdm/lightdm.conf jest dość przyzwoicie opisany, a domyślna konfiguracja raczej powinna nas zadowolić.

Plik /etc/lightdm/lightdm-gtk-greeter.conf u mnie ma postać:

[greeter]
background=/usr/share/images/desktop-base/login-background.svg
theme-name=Adwaita
icon-theme-name=gnome
font-name=Sans 9
xft-antialias=true
xft-dpi=96
xft-hintstyle=hintfull
xft-rgba=none
show-language-selector=true
#show-indicators=
show-clock=true
clock-format=%T %d-%m-%Y
#keyboard=

By dostosować zegar do własnego upodobania potrzebne są parametry, które można odczytać z date --help . W moim przypadku zegar ma postać 13:45:55 15-06-2013 .

W pliku /etc/lightdm/users.conf ustawiamy konfigurację użytkowników, którzy mają być obsługiwani przez lightdm. Mój plik wygląda tak:

[UserList]
minimum-uid=1000
hidden-users=nobody nobody4 noaccess
hidden-shells=/bin/false /sbin/nologin

Pierwsza linijka odpowiada za minimalne id użytkownika, który może się zalogować do graficznej sesji. Nazwy zawarte w drugim wierszu nie pojawią się na liście w przypadku ustawienia wyświetlania listy użytkowników. Listę jako taką można też wyłączyć. Ostatni wpis z kolei ukrywa wszystkich użytkowników, którzy mają ustawiony określony shell. Przy tych dwóch shellach nie możliwe by było zalogowanie się, także nie ma sensu zaśmiecać sobie listy użytkowników.

Dodatkowo można dostosować pewne opcje lightdm za pomocą accountsservice . Ja wykorzystałem go do ustawienia avatara mojego konta. Teoretycznie powinna być możliwość dokonania tego za pomocą pliku ~/.face lub ~/.face.icon . U mnie jednak to nie zadziałało. Za to bez problemowo accountsservice dał sobie z tym radę.

Tworzymy plik /var/lib/AccountsService/users/morfik , przy czym morfik oznacza nazwę konta, do którego chcemy ustawić avatar, o następującej treści:

[User]
Language=en_US.utf8
XSession=openbox
Icon=/var/lib/AccountsService/icons/morfik.icon

Następnie wgrywamy do katalogu /var/lib/AccountsService/icons/ plik o nazwie zdefiniowanej wyżej. Obrazki powinny mieć 96x96px i nie być w formacie .png .

W przypadku posiadania kilku menadżerów logowania, domyślny możemy zdefiniować za pomocą:

# update-alternatives --config lightdm

4.11. Dodatkowe oprogramowanie

4.11.1. Minimalne minimum

By dodać trochę możliwości naszemu systemowi, musimy doinstalować mu kilka podstawowych graficznych narzędzi. Jest to niezbędne minimalne minimum:

# aptitude install geany geany-common geany-plugin-spellcheck conky terminator scrot \
spacefm udevil lynx mesa-utils synaptic policykit-1 gparted xulrunner-17.0 flashplugin-nonfree \
tint2 aspell-pl aspell-en

Kilka słów o słownikach. Mamy do wyboru: Aspell, Hunspell, Ispell, MySpell . Jaka jest różnica między nimi i który wybrać? Zgodnie z tym co piszą na wiki:

  • MySpell – korektor pisowni pakietu OpenOffice.org, od marca 2006 zastąpiony przez Hunspella.
  • Hunspell jest to standardowy korektor pisowni w OpenOffice.org.
  • Ispell jest programem sprawdzania pisowni dla systemów uniksowych. Został jednak zastąpiony programem Aspell.
  • GNU Aspell lub po prostu Aspell – standardowy w systemach GNU program do sprawdzania pisowni.

Musimy zatem zainstalować parę pakietów hunspell oraz aspell. Oczywiście odradzam instalowanie metapakietów, gdyż zainstalują one słowniki do chyba wszystkich znanych języków i tylko nam zaśmiecą system. Lepszym wyjściem jest po prostu doinstalować pożądane pakiety, w moim przypadku są to:

# aptitude install aspell-en aspell-pl hunspell-en-us myspell-pl

4.11.2. Spacefm i udevil

Spacefm to najlepszy file manager z jakim miałem do czynienia. Udevil zaś to bardzo poręczne narzędzie do montowania urządzeń -- te dwa pakiety wręcz nie mogą istnieć bez siebie. Spacefm jest dostępny już w repo debiana, z udevilem jest trochę gorzej ale mając repo repozytorium.mati75.eu , bez problemu możemy go wgrać do swojego systemu. W razie czego jest jeszcze repo:

deb  http://ignorantguru.github.com/debian/ unstable main

Z tym, że tutaj przed instalacją zostaną te paczki dopiero skompilowane i trochę przy tym zaśmiecą nam system. Oczywiście jeżeli kompilujemy sporo, to nie powinno nas to przestraszyć, o ile w ogóle jakieś pakiety zostaną dociągnięte.

Obszerny manual do spacefm, który warto przeczytać znajduje się na http://ignorantguru.github.io/spacefm/spacefm-manual-en.html.

4.11.3. Geany

Geany to bardzo lekki i dość zaawansowany edytor tekstu. Jak tylko się o nim dowiedziałem, stał się domyślnym w moim systemie. Na szczęście istnieje w debianie i jego instalacja nie powinna sprawić problemów. Jest przy tym pozbawiony wszelkich zależności gnome czy kde. W sam raz do openboxa.

Tak jak i w przypadku spacefm, istnieje dość sporej wielkości manual, który opisuje wszystkie funkcje programu. Do poczytania pod adresem http://www.geany.org/manual/current/index.html.

4.11.4. Oprogramowanie użyte do instalacji systemu

Poniżej znajdują się wszystkie pakiety, które wzięły udział w instalacji systemu operacyjnego:

4.11.4.1. Oprogramowanie instalowane z poziomu live-cd

required

base-files base-passwd bash bsdutils coreutils dash debconf debconf-i18n debianutils \
diffutils dpkg e2fslibs e2fsprogs findutils gcc-4.7-base gcc-4.8-base grep gzip hostname \
initscripts libacl1 libattr1 libblkid1 libc-bin libc6 libcomerr2 libgcc1 liblocale-gettext-perl \
liblzma5 libmount1 libncurses5 libpam-modules libpam-modules-bin libpam-runtime libpam0g libpcre3 \
libselinux1 libsepol1 libss2 libtext-charwidth-perl libtext-iconv-perl libtext-wrapi18n-perl \
libtinfo5 libuuid1 login lsb-base mawk mount multiarch-support ncurses-base ncurses-bin passwd \
perl-base sed sensible-utils sysv-rc sysvinit sysvinit-utils tar tzdata util-linux zlib1g

important

adduser apt apt-utils aptitude aptitude-common bsdmainutils cpio cron debian-archive-keyring \
dmidecode gnupg gpgv groff-base info install-info iproute iptables iputils-ping kmod libapt-inst1.5 \
libapt-pkg4.12 libboost-iostreams1.49.0 libbz2-1.0 libcwidget3 libgdbm3 libkmod2 libncursesw5 \
libnewt0.52 libpipeline1 libpopt0 libprocps0 libreadline6 libsigc++-2.0-0c2a libslang2 libssl1.0.0 \
libstdc++6 libudev0 libusb-0.1-4 logrotate man-db manpages nano net-tools netbase netcat-traditional \
procps readline-common rsyslog tasksel tasksel-data traceroute udev vim-common vim-tiny wget whiptail

standard (poprawiony)

locales tzdata console-setup keyboard-configuration vim mc ntp cryptsetup lvm2 dmsetup \
gpm bash-completion memtest86+ dhcpcd5 firmware-linux-free extlinux syslinux-common whois pciutils \
python2.6-minimal mlocate m4 exim4-base w3m less dnsutils bsd-mailx apt-listchanges rpcbind doc-debian \
procmail dc python-support bind9-host liblockfile-bin db5.1-util nfs-common exim4-config reportbug \
texinfo python2.7 time exim4 python-minimal debian-faq krb5-locales ftp lsof wamerican gettext-base at \
bc python-reportbug python openssh-client host exim4-daemon-light ncurses-term telnet python-apt \
ifupdown ca-certificates geoip-database iso-codes lsb-release sudo apt-file psmisc usbutils pcmciautils \
libmtp-runtime psmisc

Pakiety po priorytetach można odszukać używając poniższej linijki:

$ aptitude search '~prequired'|sed -ne 's/^i [ A] \([^ ]*\).*$/\1/p' | tr '\n' ' ' | sort -u|fold -s ; echo

4.11.4.2. Pozostałe oprogramowanie

Poniżej znajdują się wszystkie pakiety, które zainstalowałem w swoim systemie za wyjątkiem sterowników zamkniętych i narzędzi do kompilacji:

aptitude install accountsservice acpi acpi-support acpi-support-base alsa-base alsa-utils apt-rdepends \
arj arping audacity avidemux baobab bash-completion bchunk blueman bluez bluez-tools btrfs-tools \
ccd2iso ccze conky console-data console-setup convertall bootlogd nvidia-detect \
cpufrequtils cryptsetup cups deborphan desktop-file-utils devede disk-manager \
dkms dmsetup dmz-cursor-theme dosfstools dsniff e2fsprogs easytag eject ethtool \
fbcat feh filezilla finger firmware-linux-free flac flashplugin-nonfree foremost \
frei0r-plugins gajim geany geany-plugin-spellcheck ghex ghostscript gimp gksu \
gnome-icon-theme gnome-subtitles gnome-themes-standard gnutls-bin gpa gparted gpicview gpm \
gprename grsync gsmartcontrol gstreamer0.10-alsa gstreamer0.10-pulseaudio gtk2-engines \
gtk2-engines-murrine gtk2-engines-pixbuf gtkhash gtkorphan hardinfo hddtemp hdparm xorg hfsprogs \
hfsutils htop iftop iotop ipcalc isomaster jfsutils kadu kadu-external-modules kbd \
keepass2 keyboard-configuration lame libao4 libav-tools libavcodec-extra-53 libgtk2.0-bin \
libjpeg-progs libmtp-runtime libnotify-bin libqca2-plugin-gnupg libreoffice libreoffice-gnome \
libreoffice-gtk libreoffice-l10n-pl libreoffice-style-tango lightdm \
lightdm-gtk-greeter lm-sensors locales lsb-release lvm2 lxappearance lynx mc mdf2iso meld memtest86+ \
mencoder mesa-utils mp3splt mp3wrap mpc mpd mplayer mtools mumble ncmpcpp nilfs-tools \
nmap nrg2iso ntfs-3g ntp numlockx nvclock-gtk obconf obexfs obmenu openbox openshot \
openssl-blacklist oracle-jdk7-installer orage p7zip-full pavucontrol phonon \
phonon-backend-vlc pm-utils printer-driver-gutenprint proxychains \
psi-plus psi-plus-common psi-plus-l10n psi-plus-plugins compton google-chrome-stable \
psi-plus-skins psi-plus-sounds pulseaudio pulseaudio-module-gconf pulseaudio-module-x11 \
pulseaudio-utils python-crypto python-keybinder python-notify python-openssl python-xdg qalculate \
qalculate-gtk qbittorrent qnapi qpdfview qpdfview-ps-plugin qpdfview-djvu-plugin qt4-qtconfig \
radiotray rcconf recordmydesktop reiser4progs claws-mail dropbox spideroak \
reiserfsprogs remmina remmina-plugin-rdp remmina-plugin-vnc sane scrot sleuthkit smartmontools \
smplayer minitube spacefm steghide streamripper sudo synaptic sysv-rc-conf \
terminator testdisk tint2 transcode tree ttf-baekmuk lshw ttf-kochi-mincho ttf-mscorefonts-installer \
tzdata udevil uget uif2iso unace unrar unzip vbetool videocut vim virtualbox virtualbox-dkms \
virtualbox-guest-additions-iso virtualbox-qt vlc vlc-plugin-pulse volumeicon-alsa \
wine wireshark xbase-clients xchat xfburn xfce4-notifyd xfonts-base xfonts-cyrillic \
xfsprogs xsane xscreensaver xserver-xorg xulrunner-17.0 zenmap zip zsh xdg-utils xarchiver \
gtk3-engines-unico xz-utils libpam-gnome-keyring openvpn python-gnomekeyring xbindkeys xinput \
texlive-extra-utils latexmk texlive-base texlive texlive-fonts-recommended \
texlive-pstricks preview-latex-style prosper tipa texlive-latex-extra texlive-binaries \
pgf texlive-latex-recommended texlive-generic-recommended texlive-latex-base \
latex-beamer texlive-lang-polish texlive-font-utils latex-xcolor texlive-pictures \
bzip2 colordiff cgroup-bin idle3-tools intel-microcode iucode-tool mysql-workbench \
mysql-utilities libgnomeui-0 bum gnome-media gtk-recordmydesktop gnome-icon-theme-symbolic \
apt-xapian-index python-xapian squashfs-tools live-build cramfsprogs gcp python-progressbar \
installation-report popularity-contest mkvtoolnix-gui ddclient mediainfo-gui \
pybootchartgui bootchart2 pv sysstat python-potr python3-potr texmaker hunspell \
hunspell-dictionary-pl hunspell-dictionary-en-us amarok gnome-keyring xdotool \
iptables-persistent busybox initramfs-tools python3.3 python2.7 desktop-base libpaper-utils

Sterowniki nvidii:

# aptitude install nvidia-legacy-304xx-driver nvidia-settings-legacy-304xx

W przypadku kompilacji i budowania paczek na naszym systemie, musimy również zainstalować poniższe pakiety:

# aptitude install build-essential make automake fakeroot autoconf binutils bison flex gcc groff libtool \
pkg-config mingw32 module-assistant git rapidsvn checkinstall kernel-package ccache gdb

Dodatkowo, ja instaluję w swoim systemie pakiety, których nie ma standardowo w repo debiana:

teamspeak3 dnscrypt-proxy netbeans skype firefox thunderbird

5. Kopia plików konfiguracyjnych

Tyle się napracowaliśmy, nie możemy zaprzepaścić naszej ciężkiej pracy. Zróbmy sobie kopie zapasową wszystkich plików, które zmienialiśmy. Nie chodzi o kopię całego folderu /etc/ + /home/ . Będzie to kopia podstawowych ustawień systemu. W przypadku gdy poznamy system bardziej i będziemy zmieniać dodatkowe pliki, łatwo będzie rozbudować poniższy skrypt kopiujący i tym samym trzymać kopię systemu up to date:

#/bin/bash

check_root() {
    if [ "$(id -u)" -ne '0' ] ; then
        echo -e "Musisz się zalogować na konto roota."
        exit 0    
    fi
}

check_root;

DATE=`date +'%Y_%m_%d_%H_%M_%S'`
TAR=".tar.gz"
NAME="backup"
USER="morfik"

tar -pczf $NAME_$DATE.$TAR \
/etc/default/locale \
/etc/default/keyboard \
/etc/default/console-setup \
/etc/timezone \
/etc/localtime \
/etc/crypttab \
/etc/inittab \
/etc/initramfs-tools/conf.d/resume \
/etc/adjtime \
/etc/apt/sources.list \
/etc/apt/preferences \
/etc/apt/apt.conf.d/70debconf \
/etc/apt/apt.conf.d/02periodic \
/etc/network/interfaces \
/etc/hostname \
/etc/hosts \
/etc/dhcpcd.conf \
/etc/resolv.conf \
/etc/resolv.conf.head \
/etc/udev/rules.d/70-persistent-net.rules \
/etc/fstab \
/etc/mtab \
/etc/ntp.conf \
/etc/default/extlinux \
/boot/extlinux/ \
/boot/extlinux/extlinux.conf \
/etc/init.d/firewall \
/etc/group \
/etc/X11/xorg.conf.d/20-monitor.conf \
/etc/X11/xorg.conf.d/10-keyboard.conf \
/etc/fonts/conf.avail/ \
/etc/fonts/conf.d/ \
/home/$USER/.config/fontconfig/conf.d/ \
/home/$USER/.config/fontconfig/fonts.conf \
/home/$USER/.fonts.conf \
/home/$USER/.Xresources \
/home/$USER/.gtkrc-2.0 \
/home/$USER/.config/gtk-3.0/settings.ini \
/home/$USER/.config/Trolltech.conf \
/etc/default/rcS \
/etc/default/tmpfs \
/etc/default/useradd \
/etc/modprobe.d/alsa-base.conf \
/home/$USER/.config/openbox/autostart \
/home/$USER/.config/openbox/environment \
/home/$USER/.config/openbox/menu.xml \
/home/$USER/.config/openbox/rc.xml \
/etc/cups/cupsd.conf \
/etc/cups/cups-files.conf \
/etc/default/saned \
/etc/sane.d/plustek.conf \
/etc/default/bluetooth \
/etc/bluetooth/ \
/etc/modules \
/etc/default/hddtemp \
/etc/fancontrol \
/etc/init.d/cpufrequtils \
/etc/default/smartmontools \
/etc/pulse/client.conf \
/etc/pulse/daemon.conf \
/etc/pulse/default.pa \
/etc/libao.conf \
/etc/mplayer/mplayer.conf \
/usr/share/alsa/pulse-alsa.conf \
/etc/pm/sleep.d/60_sound \
/usr/sbin/alsa \
/etc/lightdm/lightdm.conf \
/etc/lightdm/lightdm-gtk-greeter.conf \
/etc/lightdm/users.conf \
/var/lib/AccountsService/users/morfik \
/var/lib/AccountsService/icons/morfik.icon \
/etc/vimrc \
/home/$USER/.themes/ \
/home/$USER/.zshrc \
/home/$USER/.bashrc \
/root/.themes/ \
/root/.bashrc \
/root/.zshrc \
/root/.config/gtk-3.0/settings.ini \
/root/.config/Trolltech.conf \
/root/.gtkrc-2.0 \

6. Więcej informacji

Przy pisaniu tego artykułu (książki bardziej xD) korzystałem min. z poniższych linków:

http://www.debian.org/releases/stable/i386/apds03.html.en
http://www.debian.org/releases/stable/i386/index.html.en
http://www.debian.org/doc/manuals/debian-reference/ch05.en.html
http://wiki.debian.org/Openbox
http://urukrama.wordpress.com/openbox-guide/#Introduction
https://wiki.archlinux.org/index.php/Openbox
https://wiki.archlinux.org/index.php/Xorg
http://www.x.org/archive/current/doc/man/man5/xorg.conf.5.xhtml
http://www.x.org/archive/X11R6.8.0/doc/xorg.conf.5.html
http://wiki.debian.org/NvidiaGraphicsDrivers
https://wiki.archlinux.org/index.php/NVIDIA
http://shallowsky.com/linux/extlinux.html
https://wiki.archlinux.org/index.php/Syslinux
https://wiki.archlinux.org/index.php/GRUB
http://forum.dug.net.pl/

Komentarze i sugestie na temat artykułu można zostawiać tutaj.

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks