Skip navigation.

My some Blog

Посмотрим, что получиться из этого блога.

gentoo tips

, ,

Ставлю Генту, но т.к. использую 2 винта вечно какая-то беда происходит с именами устройств. К примеру root раздел в fstab /dev/sda3, а в grub'e в параметре real_root он уже /dev/sdb3

//Пишу с другого компьютера, поэтому значения несколько другие.
$ sudo blkid
/dev/sda1: UUID="8c1e959e-3b12-4068-94c2-148687e0d33c" TYPE="ext4"
/dev/sda5: UUID="0c48c193-81c4-441f-bd88-c576844be0a7" TYPE="swap"


В /boot/grub/grub.conf теперь записать параметр как:
real_root=UUID=8c1e959e-3b12-4068-94c2-148687e0d33c


аналогично и в fstab'e, скопировано с убунты:
UUID=8c1e959e-3b12-4068-94c2-148687e0d33c /               ext4    errors=remount-ro 0       1


И важный момент, ядро я собираю через genkernel, нужно указать опцию при сборке --disklabel, чтобы ядро подхватывало при загрузке такие разделы.

genkernel --disklabel --menuconfig all

Почему я люблю Ruby и не люблю Python ;)

Надо было сделать быстро получить для одного дела строку наоборот, т.е. её реверс из консоли.

В общем открываем irb:
irb(main):001:0> "hello".reverse
=> "olleh"


Всё логично и просто.

А теперь в консоли python:
$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> "hello".reverse
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'reverse'


Хм, ничего интуитивного в голову не приходит, лезем в гугл, по первой ссылке находим такой вот способ:
>>> "hello"[::-1]
'olleh'

Убого же..

Яндекс добавили возомжность добаления собственных доменов для почты.

Собственно все подробности на странице:

http://clubs.ya.ru/company/replies.xml?item_no=19900

Планы на после отпускное время.

Следующее нужно будет сделать после отпуска:

- написать daemon'a на ruby, чтобы парсил RSS и уведомлял через XMPP модуль на jabber. Плюс добавить парсер контакта =)

- сделать распределенную систему заметок =) подробности и ТЗ чуть позже )

Ну и разумеется доиграться с VLC и ARM

Редактор.

Навеено многими своими поисками редактора для Ruby, Ruby On Rails, которые не увенчались успехом, и аналогичными поисками своих знакомых.

Стоит отметить - есть очень хорошая штука NetBeans, но этот IDE написан на Java, и на моих 1,6 Ггц NetBeans вызывает панический ступор (это послужило поводом для того, чтобы отложить Rails, увы). TextMate штука хорошая, но Mac'ов не держу.

1. Редактор должен быть написан на компилируемом языке, а не интерпретируемом.

RedCar - редактор, конечно, значимый, но написанный на руби с использованием gtk-библиотек в моем KDE окружении это тормоз.

Минус в использование интерпретируемых языков - зависимости. Коллега на ЛОРе пишет свой плеер на основе python\Qt:
http://www.linux.org.ru/view-message.jsp?msgid=3927753


Python, PyQt4, GStreamer с плагинами для mp3, GStreamer-python, SQLite 3, Python-Xlib (без неё не будет хоткеев), Chardet и Mutagen.



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

Отсюда вытекает распространение. Представте ставить аналогичное под Windows, MacOs, Solaris и прочее. Я как пользователь Windows отказался от запуска своего же приложения на ruby\Qt (сам отказ, правда, заключался в отказе от Windows - но это не решение проблемы)

2. Автодополнение.

Подсветка синтаксиса это хорошо, но еще удобно нажать CTRL+SPACE и получить список функций, а еще лучше список собственных переменных.

3. Работа с проектом и каталогами.

Как известно rails-проект включает в себя много файлов в множестве директорий и под-директорий. И при внесение изменений в код, необходимо поправить 2-3 файла в разных директориях. В NetBeans\Komodo данное замечание реализовано очень хорошо.

4. Актуальность.

С выхода Qt 4 и KDE 4 прошло 4 и 1,5 года соответственно. А до сих пор нету стабильного релиза KDevelop для 4-й ветки.
(на днях попробую скомпилить из сырцов, но там предполагаю опять зависимости вылезут на моей древней кубунте). И судя по всему увидем только в Кубунту 10.04 ((

Linux + QT on ARM, ч. 2

Сборка QT и "допилование" образа.

Сейчас нужно будет скомпилировать библиотеку QT, записать тестовое приложение и довести до ума файловую иерархию в образе.
Установка библиотеки QT [1]

Убедитесь, что в PATH присутствует путь /usr/arm-unknown-linux-uclibc/bin
# cd /arm/source/
# wget http://get.qtsoftware.com/qt/source/qt-embedded-linux-opensource-src-4.5.2.tar.gz
# tar xvf qt-embedded-linux-opensource-src-4.5.2.tar.gz
# cd qt-embedded-linux-opensource-src-4.5.2
# mcedit mkspecs/qws/linux-arm-g++/qmake.conf


И отредактиваровать qmake.conf до такого состояния:
QMAKE_CC                = arm-unknown-linux-uclibc-gcc
QMAKE_CXX               = arm-unknown-linux-uclibc-g++
QMAKE_LINK              = arm-unknown-linux-uclibc-g++
QMAKE_LINK_SHLIB        = arm-unknown-linux-uclibc-g++

QMAKE_AR                = arm-unknown-linux-uclibc-ar cqs
QMAKE_OBJCOPY           = arm-unknown-linux-uclibc-objcopy
QMAKE_STRIP             = arm-unknown-linux-uclibc-strip


Задаем опции для конфигурирование, архетектура arm, путь с конфами компилятора, статичная сборка. Отключаем всё по максимуму, впринципе оно для тестового приложения не понадобиться. А если что-то будет требоваться в вашем приложение - тогда включите эту опцию. Затем компилируем и ставим.
# ./configure -embedded arm -xplatform qws/linux-arm-g++  -qvfb -static -opensource -no-qt3support -no-svg  \
  -no-webkit -no-gif -qt-libpng -no-libjpeg -no-openssl -no-cups -no-iconv -qt-freetype -no-opengl \
  -nomake examples -nomake demos -nomake docs -nomake translations -qt-mouse-pc -qt-mouse-bus

Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into /usr/local/Trolltech/QtEmbedded-4.5.2-arm

To reconfigure, run 'gmake confclean' and 'configure'.

# gmake
# gmake install


Библиотеки Qt инсталируются в /usr/local/Trolltech/QtEmbedded-4.5.2-arm
Сборка тестового приложения.

Скопмилируем "аналоговые часы", исходники программы идут в поставке QT.
# cd /arm/source/
# cp -r /arm/source/qt-embedded-linux-opensource-src-4.5.2/examples/widgets/analogclock .
# cd analogclock/
# /usr/local/Trolltech/QtEmbedded-4.5.2-arm/bin/qmake -project
# /usr/local/Trolltech/QtEmbedded-4.5.2-arm/bin/qmake

Конечно, можно добавить в PATH - /usr/local/Trolltech/QtEmbedded-4.5.2-arm/bin
Теперь нужно подредактировать pro-файл.
# mcedit analogclock.pro


И добавить строчку для статично сборки:
CONFIG += static

Теперь можно собрать приложение
# make


На выходе получится бинарник analogclock
Создание образа initrd.

То, что делалалось в предыдушем пункте конечно можно использовать и далее, только если делать по хорошему - нужно определить устройства, загрузочные скрипты и т.д. Поэтому соберем initrd заново, из предыдущего пункта понадобятся Ядро (zImage) - без измения, непосредственно для запуска; busybox и библиотеки uclibc.
Выберем директорию для нашего нового образа: /arm/system/rootfs
# mkdir /arm/system/rootfs
# mkdir /arm/system/rootfs/boot
# mkdir /arm/system/rootfs/etc
# mkdir /arm/system/rootfs/tmp
# mkdir /arm/system/rootfs/proc
# mkdir /arm/system/rootfs/dev

Ставим BusyBox:
# cd /arm/source/busybox-1.13.3
# make ARCH=arm CC="arm-unknown-linux-uclibc-gcc -static" CROSS_COMPILE="arm-unknown-linux-uclibc-"  CONFIG_PREFIX=/arm/system/rootfs install


Копируем библиотеки uclibc и gcc:
# cp -rv /usr/arm-unknown-linux-uclibc/lib /arm/system/rootfs/
# cp -v /usr/lib/gcc/arm-unknown-linux-uclibc/4.4.0/* /arm/system/rootfs/lib/


Копируем приложение analogclock:
# cp /arm/source/analogclock/analogclock /arm/system/rootfs/


Теперь нужно создать устройства.
# cd /arm/system/rootfs/dev
# MAKEDEV busmice
# MAKEDEV fb0
# MAKEDEV console
# MAKEDEV std


Скрипты загрузки.
# cd /arm/system/rootfs
# ln -s bin/busybox init


При запуске, ядро вызывает init скрип. В данном случае это бизибокс, который читает настройки инициализации из /etc/initab и выполняет указанные там скрипты инициализации (Можно почитать на странице http://www.busybox.net/downloads/BusyBox.html, искать команду init), если /etc/inittab'a нет, используется свой встроенный формат загрузки. Опять же всё там написано. Единственно, что стоит отметить, busybox не поддерживает runlevels. Так что :smile:
Для запуска приложения понадобятся шрифты, как их вставить в бинарник я пока еще не понял.
# mkdir -p /arm/system/rootfs/usr/local/Trolltech/QtEmbedded-4.5.2-arm/lib/fonts
# cp -v /usr/local/Trolltech/QtEmbedded-4.5.2-arm/lib/fonts/* /arm/system/rootfs/usr/local/Trolltech/QtEmbedded-4.5.2-arm/lib/fonts/


Теперь опять можно собрать систему
# find . | cpio -o -H newc | gzip -9 > ../initrd.img

И запустить c ядром, полученным на первом этапе:
$ qemu-system-arm -M versatileab -kernel zImage -initrd initrd.img -append "root=/dev/ram" 

После загрузки системы набрать:
/analogclock -qws

Сборка базовой системы Linux на ARM архитектуре, ч. 1

Умные люди давно уже всё сделали, тем немее идея такая - собрать Linux под arm, чтобы можно было запустить под qemu-system-arm и поиграться с qt-embedded под тот же arm.

План такой
  1. Сборка базовой системы
    1. Установка toolchain через crossdev
    2. Сборка BusyBox
    3. Сборка Linux-ядра
    4. Проверка
      1. Hello, world на С и С++
      2. Базовый initrd
  2. QT
    1. Статичная сборка QT-embedded через toolchain
    2. Сборка qt-приложение
    3. конфигурирование initrd
    4. проверка.

Немножко слов.

Идея собрать систему для запуска QT-приложения на ARM-оборудование. В качестве эмулятора ARM-архитектуры используется qemu, машина versatilepb.
В качестве хост-системы используется Gentoo.
host gcc - 4.1.2

Сборка базовой системы

Установка toolchain через crossdev

Для кросскомпиляции нам потребуется toolchain (набор утилит). В генту мы создадим их автоматически при использование crossdev [1]. Для устновки наберите:

# emerge --sync
# emerge -av portage-utils crossdev
Теперь при помощи crossdev создадим кросскомпилятор [2]
                                                       
crossdev --target arm-unknown-linux-uclibc                   

arm-unknown-linux-uclibc - машина arm, vendor unknown, ядро linux, ОС uclibc. Подробнее об каноническом имени http://www.gentoo.org/proj/en/base/embedded/handbook/index.xml?part=1&#38;chap=3

Примечание 1 В /etc/make.conf необходимо добавить директиву: PORTDIR_OVERLAY=/usr/local/portage (и создать директорию) , если она еще не определена.

Стоит отметить, что сборка происходит долго, на моей хост-системе, запещенной в виртуальной машине с CPU 3 ГГц и 524 ОЗУ собиралось 1,5 часа.

Если всё прошло удачно, на экране увидим следующее:

-----------------------------------------------------------------------------------------------------------------------------------------------
 * Host Portage ARCH:     x86                                                                                                                  
 * Target Portage ARCH:   arm                                                                                                                  
 * Target System:         arm-unknown-linux-uclibc                                                                                             
 * Stage:                 4 (C/C++ compiler)                                                                                                   

 * binutils:              binutils-[latest]
 * gcc:                   gcc-[latest]     
 * headers:               linux-headers-[latest]
 * libc:                  uclibc-[latest]       

 * PORTDIR_OVERLAY:       /usr/local/portage
 * PORT_LOGDIR:           /var/log/portage  
 * PKGDIR:                /usr/portage/packages/cross/arm-unknown-linux-uclibc
 * PORTAGE_TMPDIR:        /var/tmp/cross/arm-unknown-linux-uclibc             
  _  -  ~  -  _  -  ~  -  _  -  ~  -  _  -  ~  -  _  -  ~  -  _  -  ~  -  _  ~
 * Forcing the latest versions of {binutils,gcc}-config/gnuconfig ...              [ ok ]
 * Log: /var/log/portage/cross-arm-unknown-linux-uclibc-binutils.log                     
 * Emerging cross-binutils ...                                                     [ ok ]
 * Log: /var/log/portage/cross-arm-unknown-linux-uclibc-linux-headers-quick.log          
 * Emerging cross-linux-headers-quick ...                                          [ ok ]
 * Log: /var/log/portage/cross-arm-unknown-linux-uclibc-uclibc-headers.log               
 * Emerging cross-uclibc-headers ...                                               [ ok ]
 * Log: /var/log/portage/cross-arm-unknown-linux-uclibc-gcc-stage1.log                   
 * Emerging cross-gcc-stage1 ...                                                   [ ok ]
 * Log: /var/log/portage/cross-arm-unknown-linux-uclibc-linux-headers.log                
 * Emerging cross-linux-headers ...                                                [ ok ]
 * Log: /var/log/portage/cross-arm-unknown-linux-uclibc-uclibc.log                       
 * Emerging cross-uclibc ...                                                       [ ok ]
 * Log: /var/log/portage/cross-arm-unknown-linux-uclibc-gcc-stage2.log                   
 * Emerging cross-gcc-stage2 ...                                                         

Как видно, будет собран gcc, glibc и библиотеки, которые будут использоваться для последуещей кросскомпиляции приложений.
TODO Описать какие компиляторы получаться и где для них будут лежать либы.

Директории для работы

# mkdir /arm                     //директория, где будет происходит работа над проектом
# cd /arm                                                                              
# mkdir source                   //директория для загрузки исходного кода и компиляции 
# mkdir system                   //директория для хранения базовой ФС, ядра, initrd    
# mkdir system/initrd            //директория с файловой иерархией для образа initrd   
# cd source/                                                                           

BusyBox [3]

# cd /arm/source/
# wget http://busybox.net/downloads/busybox-1.13.3.tar.bz2
# wget http://svn.cross-lfs.org/svn/repos/cross-lfs/branches/clfs-embedded/config/busybox-1.13.3.config
# wget http://svn.cross-lfs.org/svn/repos/cross-lfs/branches/clfs-embedded/patches/busybox-1.13.3-branch_update-1.patch
# tar xvf busybox-1.13.3.tar.bz2                                                                                       
# cd busybox-1.13.3                                                                                                    
# patch -Np1 -i ../busybox-1.13.3-branch_update-1.patch                                                                
# cp ../busybox-1.13.3.config .config                                                                                  
# make oldconfig                                                                                                       
# make ARCH=arm CC="arm-unknown-linux-uclibc-gcc -static" CROSS_COMPILE="arm-unknown-linux-uclibc-"                    
# make ARCH=arm CC="arm-unknown-linux-uclibc-gcc -static" CROSS_COMPILE="arm-unknown-linux-uclibc-" \                  
        CONFIG_PREFIX=/arm/system/initrd install                                                                       

Установка ядра Linux.

# cd /arm/source/
Получаем последнее ядро и распаковываем архив.
                                              
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.1.tar.bz2
# tar xvf linux-2.6.30.1.tar.bz2                                         
# cd linux-2.6.30.1                                                      
Собираем ядро [4][5][6]
                       
# make ARCH=arm defconfig    
# make ARCH="arm" CROSS_COMPILE="arm-unknown-linux-uclibc-"  zImage modules
# make ARCH=arm CROSS_COMPILE="arm-unknown-linux-uclibc-" INSTALL_MOD_PATH=/arm/system/initrd/ modules_install

# mkdir /arm/system/initrd/boot
# cp System.map /arm/system/initrd/boot/
# mkdir -p /arm/system/initrd/lib/modules/2.6.30
# /arm/source/busybox-1.13.3/examples/depmod.pl -F /arm/system/initrd/boot/System.map -b /arm/system/initrd/lib/modules/2.6.30
Копируем ядро в /arm/system/zImage
                                  
# cp arch/arm/boot/zImage /arm/system/  

Тестовые приложения.

Напишем 2 программы на С и С++, чтобы потом проверить систему, что у нас присутствуют все библиотеки в системе.

test_gcc.c
          
#include &lt;stdio.h&gt;
main(){                 
    printf("Hello, World!\nComplied by C\n");
}                                            
test_g++.cpp
            
#include &lt;iostream&gt;

int main(){
    std::cout &lt;&lt; "Hello, would\n" &lt;&lt; "Compiled by C++" &lt;&lt; std::endl;
    return 0;                                                                         
}                                                                                     
И компилируем с использованием статичной сборки:
                                                
# arm-unknown-linux-uclibc-gcc test_gcc.c -static -o run_c_app
# arm-unknown-linux-uclibc-g++ test_g++.cpp -static -o run_cpp_app
И скопируем их на целевую систему:
                                  
# cp -v run_c* /arm/system/initrd/      
`run_c_app' -&gt; `/arm/system/initrd/run_c_app'
`run_cpp_app' -&gt; `/arm/system/initrd/run_cpp_app'

Сборка initrd

# cd /arm/system/initrd
# cat &gt;&gt; init &lt;&lt; EOF
  #!/bin/sh
  /bin/sh --login
  EOF

# chmod +x init
Непосредственно создание образа initrd:
# find . | cpio -o -H newc | gzip -9 &gt; ../initrd.img

Образ initrd будет распложен в /arm/system/initrd.img

Теперь можно запустить виртуальную машину и проверить.
$ qemu-system-arm -M versatilepb -kernel zImage -initrd initrd.img -append "root=/dev/ram"

Так же можно запустить скомпилированное "hello, world" приложение, напечатав в консоли:
/run_c_app
/run_cpp_app

[1] http://www.gentoo.org/proj/en/base/embedded/handbook/index.xml?part=1&#38;chap=1
[2] http://www.gentoo.org/proj/en/base/embedded/handbook/index.xml?part=1&#38;chap=4
[3] http://cross-lfs.org/view/clfs-embedded/arm/final-system/busybox.html
[4] http://www.gentoo.org/proj/en/base/embedded/handbook/index.xml?part=1&#38;chap=6
[5] http://linux.onarm.com/index.php/QEMU_boot_up
[6] http://cross-lfs.org/view/clfs-embedded/arm/bootable/kernel.html

P.S. Как-то нехорошо опера сделала теги CODE

OpenVZ begin

,

Захотелось в общем щтуку аналогичную Jail'ов во FreeBSD, но под Гентой.

Собственно всё написано тут: http://www.gentoo.org/proj/en/vps/openvz-howto.xml , но у меня возникло пару трудностей.

Устанавливаем сырцы ядра с openvz
# emerge openvz-sources


Конфигурируем
# cd /usr/src/linux-<KERNELVERSION>-openvz-<OPENVZVERSION>
# make menuconfig

Processor type and features  --->
  [*] Fair CPU scheduler
  [*]   VCPU scheduler support
File Systems  --->
  [*] Quota support
  <M> VPS filesystem
  <M> Virtuozzo Disk Quota support
  [ ]   Unloadable Virtuozzo Disk Quota module
  [*]   Per-user and per-group quota in Virtuozzo quota partitions
OpenVZ  --->
  [*] Virtual Environment support
  <M>   VE calls interface
  [ ]   Enable sysfs support in Virtual Environments
  <M>   VE networking
  [*]     VE netfiltering
  <M>   VE watchdog module


а дальше у меня из хендбука не получилось завести, пришлось собрать ядро через genkernel, т.к. либо я не выбрал какие-то модули, либо еще что-то, а так собрал ядро и инетрд и вперед)

genkernel all --kerneldir=/usr/src/linux-2.6.18-openvz-028.056


В /boot/ появится ядро и инитрд, правим груб и перезагружаемся под новое ядро.

Ставим утилиту для управления виртуальными средами:
# emerge vzctl
# rc-update add vz default
# /etc/init.d/vz start



Для создание виртуальной среды нужен теплейт. Почитать как создавать свои темплейты можно на странице: http://wiki.openvz.org/Gentoo_template_creation
Ну а я воспользуюсь stage3
# cd /vz/template/cache
# wget http://mirror.yandex.ru/gentoo-distfiles/releases/x86/2008.0/stages/stage3-x86-2008.0.tar.bz2
# bunzip2 stage3-x86-2008.0.tar.bz2
# mv stage3-x86-2008.0.tar gentoo-x86-1.tar
# gzip gentoo-x86-1.tar



Создаем теперь виртуальную машину из теплейта:
# vzctl create 101 --ostemplate gentoo-x86-1


Запускаем и входим в неё:
# vzctl start 101
# vzctl enter 101
entered into VE 101


Вот и всё. С конфигами, лимитами и сетью буду разбираться чуть позже. На сегодня хватит, а завтра всё же exim.

Немножко об initrd

Мда.. ну никак я могу научиться последовательно делать вещи, вчера весь день настраивал Exim+SQlite. Осталось только пару правил дописать. Сегодня думал продолжну... Сейчас.. Поставил Генту - хотел мельком глянуть на OpenVZ, ядро при загрузке не цепляло диск и уходило в кернел паник (ну тут скорее всего я его собрал без необходимых драйверов). Но мне это показалось не оч. интересно, собрал ядро с ОпенВЗ и инитрд. Всё сработало. Начал разбираться, а что же за фрукт этот initrd (всё никак руки не доходили поконкретнее разобраться).

Так вот - initrd это обычный слепок файловой системы с необходимым минимум программ(команд) типа ls, cat, mount, modprobe плюс модули для ядра. Grub при старте считывает этот initrd в Оперативную Память, загружает ядро и указывает ядру область памяти с виртуальной системой. И ядро уже при помоще загруженных утилит может и систему примантировать и модули подгрузить (опять же их ФС в памяти).

Как-то так.

А теперь немножко вкусности.

Есть убунта. в /boot/ есть ядро vmlinuz-2.6.27-14-generic и initrd initrd.img-2.6.27-14-generic

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

Переходим в какой-нибудь каталог (к примеру, /tmp/initrd/)

Распаковываем:
gunzip -c -9 /boot/initrd.img-2.6.27-14-generic | cpio -i -d -H newc --no-absolute-filenames


Получается привычная нам файловая иерархия.
$ ls
bin  conf  etc  init  lib  sbin  scripts  usr  var



Пишем простую программку на C++:
#include <iostream>

int main(){
    std::cout << "Hello, world! From initrd." << std::endl;
    std::cout << "By F3ex" << std::endl;
}


И компилируем статически.
g++ -static test_cpp.cpp -o my_hello


Копируем программу в ФС initrd
cp my_hello /tmp/initrd/bin/



Теперь можно собрать initrd:
cd /tmp/initrd
find . | cpio -o -H newc | gzip -9 > ../initrd.img


Всё. Можно проверять.

qemu-system-i386 -kernel /boot/vmlinuz-2.6.27-14-generic -initrd /tmp/initrd.img /dev/zero


-kernel указал текущее убунтовское ядро
-initrd - путь до нового initrd
/dev/zero - винчестер (в нашем случае не нужен)

Зугружаемся и в консоли набираем:
my_hello

Всё банально и просто, почитать на русском можно на странице:
http://opennet.ru/base/sys/initrd_intro.txt.html

А мне пора возвращаться к exim'у...

aLFS

Заметка. При сборке LFS при использование автоматический скриптов (aLFS, jhalfs) нужно в директорию source класть kernel-config с конфигом ядра.

P.S. LFS я уже собирал, так что не зудите попусту.
Download Opera, the fastest and most secure browser
December 2009
M T W T F S S
November 2009January 2010
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31