сряда, 18 май 2011 г.

Често използвани методи за оптимизация на Линукс десктоп машини


[Файлови системи]

<Най-често използвани файлови системи>

* XFS - Отлична производителност при работа с големи файлове. Бавна при работа с малки файлове.
* ReiserFS - Отлична производителност при работа с малки файлове.
* ext3 - Добра обща производителност, добра надеждност.
* ext4 - Добра обща производителност, добра надеждност, леки проблеми с производителността при работа с sqlite и други бази данни.
* JFS - Добра обща производителност, много ниско натоварване на централния процесор.
* Btrfs - Добра обща производителност (по-добра от ext4), добра надеждност(стига да излезе стабилна версия), много възможности, все още активно се разработва. Не използвайте тази файлова система преди да има официална стабилна версия, освен ако наистина знаете какво правите и сте подготвени за потенциална загуба на данни.




Индексиране на директории

Тази опция ускорява достъпа до файлове в директории, които съдържат много файлове, като използва бинарни дървета за да съхранява информацията за директориите. Напълно безопасно е да се използва, като подобрението е значително в повечето случаи. Поради тази причина е добра идея индексирането да бъде включено:

# tune2fs -O dir_index /dev/hdXY

Това ще има ефект само върху директории, които са създадени след изпълнението на тази команда. За да се приложи върху вече съществуващи директории можете да използвате e2fsck, но имайте предвид, че файловате система не трябва да бъде монтирана т.е. трябва да заредите от livecd:

e2fsck -D -f /dev/hdXY

Toва работи както на ext2 така и на ext3 файлови системи. В зависимост от размера на файловата система това може да отнеме доста време.



<Компресиране на /usr>

Това е един много ефективен начин да се ускори четенето от хард диска, тъй като така информацията, която трябва да бъде прочетена е значително по-малко. Разбира се при използването на компресия централния процесор се натоварва допълнително, но това не се забелязва при използването на относително съвременен процесор и при положение, че повечето от файловете в /usr са с малък размер. Някои файлови системи поддържат фонова компресия (например Btrfs и ReiserFS4), но техния коефициент на компресия е ограничен от 4К размер на блока. Добра алтернатива е да се използва SquashFS за компресиране на /usr с размер на блока 64К(128К). По този начин се спестява много място, обикновено две трети от некомпресираното /usr, и по-важното е, че приложенията се стартират доста по-бързо. Недостатък е, че промените, които се извършват в /usr се записват некомпресирани. Toва се постига като се използва aufs в комбинация със SquashFS. Необходимо е периодично SquashFS имиджа да се рекомпресира за да се отразяват промените в /usr.

Необходими пакети са aufs2 и squashfs-tools. SquashFS е налична в Линукс ядрото, а aufs е достъпна като пакет за повечето дистрибуции.

Команди:

# mkdir -p /squashed/usr/{ro,rw}

В /squashed/usr/ro ще се монтира SquashFS имиджа, а в /squashed/usr/rw ще се зписват промените, които се правят в /usr. След това двете директории се монтират чрез Aufs2 в /usr.

За да компресираме /usr в SquashFS имидж използваме:

# mksquashfs /usr /squashed/usr/usr.sfs -b 65536

За да може архива да се монтира заедно с директорията за промените при boot, трябва да променим /etc/fstab:

# nano /etc/fstab

добавяме следните редове:

/squashed/usr/usr.sfs /squashed/usr/ro squashfs loop,ro 0 0
usr /usr aufs udba=reval,br:/squashed/usr/rw:/squashed/usr/ro 0 0

След като запишем файла можем да рестартираме. Оригиналния автор препоръчва да се изтрие старото /usr, но в зависимост от дистрибуцията това може да доведе до проблеми при boot и при рекомпресиране на SquashFS имиджа. За по-сигурно препоръчвам оригиналното /usr да се остави или като компромисен вариант, с цел спестяване на място, може да се замени с /usr от чиста инсталация на дистрибуцията с инсталирани само aufs2 и squashfs-tools.

С цел допълнително ускоряване SquashFS имиджа може да се постави на USB флаш памет. Това може да звучи глупаво, защото четенето от флашка е много по-бавно от четенето от хард диска, но това е вярно само при последователно четене. При произволен достъп флашката е значително по-бърза. Такава постановка може да се сравни с "технологията на Microsoft®" Vista ReadyBoost.

Tестовете, които съм провел са извършени на лаптоп Gateway ID49c с Gentoo (2.6.38) и флаш памет (Verbatim Store 'n' Go). Преди компресията /usr заемаше около 8G, а след това около 2G.

Kато за начало тествах някои програми за колко време се стартират:

без SquashFS:

boot до GNOME десктоп със стартирани AWN, wbar, conky, compiz-fusion, yakuake: 65 cek.

firefox: 6 cek.
OpenOffice Writer: 5 cek.
gimp: 13 cek.
vlc: 6 cek.
opera: 5 cek.
Qt Designer: 8 cek.


със SquashFS като имиджа е на хард диска:

boot до GNOME десктоп със стартирани AWN, wbar, conky, compiz-fusion, yakuake: 41 cek.

firefox: 3 cek.
OpenOffice Writer: 3 cek.
gimp: 6 cek.
vlc: 1,5 cek.
opera: 3 cek.
Qt Designer: 5 cek.


със SquashFS като имиджа е на флаш памет:

boot до GNOME десктоп със стартирани AWN, wbar, conky, compiz-fusion, yakuake: 36 cek.

firefox: 3 cek.
OpenOffice Writer: 3 cek.
gimp: 4 cek.
vlc: 1,5 cek.
opera: 2 cek.
Qt Designer: 4 cek.


В случай, че намирате тези тестове за несериозни съм извършил по-тежки тестове както препоръчва оригиналния автор:

без SquashFS:

# time find /usr -type f -printf "%s %p\n" | sort -R | awk '{ printf $2; printf "\n" }' > /sort
real 3m43.513s

# time cpio -o --quiet -H newc < sort > /dev/null
real 59m51.432s

със SquashFS като имиджа е на хард диска:


# time find /usr -type f -printf "%s %p\n" | sort -R | awk '{ printf $2; printf "\n" }' > /sort
real 0m23.814s

# time cpio -o --quiet -H newc < sort > /dev/null
real 11m45.367s

със SquashFS като имиджа е на флаш памет:


# time find /usr -type f -printf "%s %p\n" | sort -R | awk '{ printf $2; printf "\n" }' > /sort
real 0m33.935s

# time cpio -o --quiet -H newc < sort > /dev/null
real 8m24.090s

За рекомпресиране и обновяване на SquashFS имиджа може да използвате следния скрипт:

#!/bin/bash

#This script comes with ABSOLUTELY NO WARRANTY use it at your own risk!

mksquashfs /usr /squashed/usr/usr_tmp.sfs -b 65536
umount -l /usr
umount -l /squashed/usr/ro
rm /squashed/usr/usr.sfs
mv /squashed/usr/usr_tmp.sfs /squashed/usr/usr.sfs
rm -rf /squashed/usr/rw/*
mount /squashed/usr/ro
mount /usr



[CPU]



2.6.38 ядрото представя една съвсем нова система за разпределяне на процесорното време между процесите, която значително подобрява времето за реакция на системата при средно и високо натоварване. За да се използва системата в ядрото трябва да са включени:

-> General setup
-->Control Group support[CONFIG_CGROUPS](CGROUPS )
--->Group CPU scheduler[CONFIG_CGROUP_SCHED](CGROUP_SCHED)
---->Group scheduling for SCHED_OTHER[FAIR_GROUP_SCHED]


Verynice

Verynice е демон, който динамично променя приоритетите (nice levels) на процесите. Използването му е сравнително лесно - в /etc/verynice.conf се дефинират goodexe програми които трябва да има висок приоритет например X, мултимедийни програми и др. Също така там се дефинират и badexe програми, които работят във фонов режим и използват много от ресурсите на централния процесор. Това приоритизиране на процесите значително подобрява времето за реакция на системата при голямо натоварване.


[Prelink]

Повечето приложения използват споделени библиотеки. Teзи споделени библиотеки трябва да бъдат заредени в оперативната памет по време на изпълнение. За повечето малки приложения динамичното свързване се осъществява бързо, но за програми писани на C/C++, които имат много библиотечни зависимости, динамичното свързване може да отнеме значително време.

На повечето системи споделените библиотеки не се променят много често, а операциите, които се извършват за динамично свързване всеки път отнемат едно и също време. Prelink се възползва от това като свързва дънамичните библиотеки във изпълнимия файл.

Prelink може значително да намали времето за стартиране на приложенията. Например за едно KDE приложение времето може да бъде намалето до 50%. Единственото условие това да се поддържа е когато има промяна в споделените библиотеки prelink да се изпълни повторно.

След като имаме инсталиран prelink на системата можем да го стартираме по следния начин за да промени всички изпълними файлове в директориите изброени в /etc/prelink.conf:

# prelink -amR

Aко в даден момент размислите и решите да върнете изпълнимите файлове в оригиналния си вид само трябва да изпълните:

# prelink -au




Връзки:

https://wiki.archlinux.org/index.php/Maximizing_Performance
https://wiki.archlinux.org/index.php/Ext3_Filesystem_Tips
https://wiki.archlinux.org/index.php/Ext4#Improving_performance
https://wiki.archlinux.org/index.php/JFS_Filesystem#Optimizations
https://wiki.archlinux.org/index.php/Maximizing_Performance#XFS
https://wiki.archlinux.org/index.php/Maximizing_Performance#Reiserfs
https://wiki.archlinux.org/index.php/Maximizing_Performance#BTRFS
http://forums.gentoo.org/viewtopic-t-646289.html
http://www.linuxfordevices.com/c/a/News/Linux-2638-released/
http://forums.gentoo.org/viewtopic-t-869309.html?sid=82ed6f95c7818a61a8902b257469f9fa
http://www.gentoo.org/doc/en/prelink-howto.xml
https://bbs.archlinux.org/viewtopic.php?id=88515
https://bbs.archlinux.org/viewtopic.php?pid=714052

неделя, 15 май 2011 г.

Криптиран партишън с Luks

Наскоро се сдобих с нов външен хард диск. Проблема с външните дискове е, че лесно могат да бъдат загубени или задигнати а поставената на тях информация да излезе наяве което никога не е приятно ако информацията е лична.
За тази цел реших да криптирам диска си, но исках лесно да мога да го достъпвам и менежирам. Това ме доведе до Luks - http://code.google.com/p/cryptsetup/

Ето как се прави криптирането с лукс
sudo apt-get install cryptsetup
инсталираме си необходимият пакет
приемаме че диска се разпознава като /dev/sdb
sudo dd if=/dev/zero of=/dev/sdb bs=4K
OR
sudo badblocks -c 10240 -s -w -t random -v /dev/sdb
OR
sudo dd if=/dev/urandom of=/dev/sdb bs=4K


пречистваме диска за да може да не се злоупотреби със стара информация по него
метода с /dev/urandom e най-сигурен и най-бавен (/dev/random е още по-сигурен и ооооще по-бавен)

Аз избрах badblocks метода който е доста по-бърз и едновременно с това проверява диска за лоши сектори като
пише произволна информация базирана на pattern и после чете от нея.

sudo fdisk /dev/sdb
създаваме си partition table и partition от тип 83 на диска.

sudo modprobe dm-crypt
sudo modprobe sha256
sudo modprobe aes

зареждаме необходимите модули за алгоритмите които сме си избрали да използваме

sudo cryptsetup --verify-passphrase luksFormat /dev/sdb1 -c aes -s 256 -h sha256
криптираме партишъна с избраните алгоритми (ще поиска да поставим парола - ЗАПОМНЕТЕ Я!)
има и други от които можем да изберем за криптация и хеш (man cryptsetup)

sudo cryptsetup luksOpen /dev/sdb1 securebackup
отваряме криптирания дял (ще ни поиска паролата)

sudo mkfs -t ext3 -m 1 -O dir_index,filetype,sparse_super /dev/mapper/securebackup
създаваме партишън вътре в криптирания дял
-t ext3 - ext3 партишън

-m 1 - намаля процента резервирани блокове за super user-a до 1 процент (0 също е опция)

-O dir_index - ускорява търсенето в директория

-O filetype - запазва filetype информация в директориите (с цел ускорение на работата)

-O sparse_super - създава по-малко super block backups (полезно при големи партишъни)

Готово! Най-лесният начин да употребявате новият си криптиран диск е просто да го включите. Повечето съвременни дистрибуции ще го монтират автоматично като в процеса ще поискат парола

Ако ви се наложи на ръка да го затворите използвайте:
sudo cryptsetup luksClose securebackup

TinyCore на ext партишън на USB (и не само)

Идеята на този вид инсталация е да имате възможност за boot на tinycore който сте променили по ваш вкус или пък сте оставили в оригиналният му вид.
Това което можете да постигнете е:
- persistance
- минимална употреба на ram
- възможност за предварително интегриране на пакети и настройка в tinycore

Стъпка по стъпка:
1. Изтегляме си последната версия на tinycore
2. Променяме дистрибуцията по наш вкус:
    - отваряме iso файла:
      mount -o loop tinycore-current.iso /mnt/
    - копираме съдържанието в предварително създадена за целта директория (аз съм я кръстил newiso)
      cp -R /mnt/* /home/peach/newiso
    - създаваме си директория tce в newiso (използва се за поставяне на пакети и конфигурация на поведението при зареждането на пакетите)
    - създаваме директория в tce с име optional и вътре поставяме пакетите (с разширение tcz - пакети можете да намерите в http://distro.ibiblio.org/tinycorelinux/3.x/tcz/  - само имайте грижата да поставите и депендънситата на избраните пакети)
    - в директорията tce поставяме файловете:
onboot.lst в който описваме пакетите които искаме да се инсталират при boot
copy2fs.flg - с празно съдържание ако искаме всички пакети да се копират в /opt (ЗАБЕЛЕЖКА: в зависимост от последващата конфигурация /opt може да се намира и в рам-а така че съответният флаг файл е важен ако искаме новото ни tiny да работи и без USB/CDROM/HDD/NFS след като веднъж стартира copy2fs.lst - ако искаме само някой от пакетите да се заредят в трайно в /opt ги описваме тук ( при това положение flg файла не е нужен.
    - за да правим промени по init файла трябва първо да го декомпресираме и разархивираме (направете си отделна директория за него пр. /home/peach/newinit)
cp /home/peach/newiso/boot/tinycore.gz /home/peach/newinit
cd /home/peach/newinit
gunzip tinycore.gz
cpio -idm < tinycore
.
правим промени каквито ни се искат
.
и идва ред да пакетираме init-a
find ./ | cpio -H newc -o > ../tinycore2
gzip tinycore2

копираме новият инит на мястото на стария  в boot
cp /home/peach/tinycore2.gz /home/peach/newiso/boot/tinycore.gz
до тук сме променили инита като сме му сложили конфигурации и файлове каквито са ни нужни, също така сме поставили пакети които ще се зареждат (или не при стартиране).
В този момент ако искате да произведете iso за да го напишете на диск или да използвате UNetBootin за създаване на boot девайс трябва да изпълните следната команда:
mkisofs -l -J -V TC-custom \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \
-o TC-remastered.iso newiso


С това получаваме новото iso с промени и пакети по наш вкус.

3.Тази точка покрива направата на boot девайс по старомодният начин което дава определени екстри като лесен механизъм за промяна на пакетите и като цяло boot процеса

Оригинален източник: http://fragilematter.blogspot.com/2010/09/installing-tiny-core-linux-on-usb-drive.html

3.1 подготвяме диска/USB-то
fdisk /dev/sdX
 C - спира dos compatiability
 U - започва да показва всичко в сектори вместо цилиндри
 О - правим нов partition table
 N - нов partition
 P - primary
 1 - първи
 Т - тип на партишъна
 83 - linux тип
 А - active
 1 - нашият (става активен)
 W - записваме промените (ще ви изтрие всичко на медията която ползвате така че ако има нещо важно по-добре си направете backup) 


Сега след като имаме партишън е време да му направим файлова система ext2 отгоре:
mkfs.ext2 -L "tc" /dev/sdX1
правим файлова система с лейбъл tc - това можете да промените по ваш вкус

за да сме сигурни че ядрото е наясно с промените монтираме и демонтираме партишъна 
 mount /dev/sdX1 /mnt
 eject sdX1 или umount /dev/sdX1


Ако сте следвали предишните стъпки за промени по iso-то или поне копирането му в директория newiso следва да преместим нещата съдържащи се в него на подготвеният партишън (който отново ще монтираме - за целта предполагам че ващата дистрибуция автоматично го е монтирала в /media/tc)

cp -R /home/peach/newiso/boot /media/tc/
cd /media/tc/boot/
mv isolinux extlinux
mv extlinux/isolinux.cfg extlinux/extlinux.conf
rm extlinux/isolinux.bin

cp -R /home/peach/newiso/tce /media/tc/ (ако не сме я създавали в newiso можем да я направим директно в /media/tc)

mkdir /media/tc/opt

blkid -s UUID /dev/sdX1 (това ще ни даде стринг във вида /dev/sdX1: UUID="{some long string})
копирайте частта UUID="{some long string} защото ще я използваме.

Отворете extlinux/extlinux.conf в любимият си текстов едитор и на реда започващ с  append initrd= накрая добавете
 waitusb=5 tce=UUID="..." restore=UUID="..." home=UUID="..." opt=UUID="..."
 
 като на мястото на UUID="..." сложете стринга копиран след изпълнението на blkid командата.

тези опции указват:

waitusb=5 - ще изчака 5 секунди преди да потърси usb-то (това се налага в случай че устройството не се инициализира достъчно бързо)


tce=.. - къде е tce директорията
restore=.. - къде tinycore ще запазва рестор файловете си
home=... - същото за home директорията
opt=.. - и opt директорията

имайте предвид че ако искате дистрибуцията да се зарежда изцяло в паметта трябва да махнете restore,home и opt опциите и да добавите copy2fs.flg в tce директорията

можете да добавите и други опции (описани са в  boot/isolinux или boot/extlinux ако вече сте я преименували във файловете f2, f3 и f4)

почети сме готови остава само да си гарантираме че устройството ще е boot-ващо

extlinux -i /media/tc/boot/extlinux (изисква инсталиран пакет syslinux)
cat /usr/share/syslinux/mbr.bin > /dev/sdX - инсталираме MBR на устройството (файла mbr.bin може да се намира на друго място във вашата дистрибуция)

С това сме готови остава единствено да демонтираме устройството и да запалим от него
eject tc

Успех и честито на притежателите на ново,променено по собствен вкус и с пакети по собствен избор boot-ващо от USB - tinycore.