Linux From Scratch 6.1.1
Версию 6.1.1 я скачал по адресу http://www.linuxfromscratch.org/ - в общей сложности все весит около 150 метров .
Английскую документацию можно взять тут (150 кб) .
В качестве хоста я использовал SUSE 10.0
Все можно разделить на 4 основных этапа 1. Подготовка
2. Сборка пакетов LFS
3. Сборка стартовых скриптов LFS
4. Настройка загрузчика LFS
1. Подготовка
Я выделил под LFS отдельную партицию на винчестере - /mnt/lfs.
Минимальное требование - полтора гига .
Рекомендуется выполнить команду для выделенной партиции :
mke2fs /dev/[xxx]
Если у вас нет swap-раздела - создайте его:
mkswap -v /dev/[yyy]
Необходимо создать переменную среды :
export LFS=/mnt/lfs
Монтирование раздела :
mkdir -p $LFS
mount /dev/[xxx] $LFS
Создаем каталоги :
mkdir -pv $LFS
mount -v /dev/[xxx] $LFS
mkdir -v $LFS/usr
mount -v /dev/[yyy] $LFS/usr
Теперь запустите без параметров команду
mount
и посмотрите на свои партиции
Создаем новый каталог
mkdir -v $LFS/sources
Присвоим этому каталогу атрибуты 1777 :
chmod -v a+wt $LFS/sources
Проверка :
echo $LFS
Создаем новый каталог
mkdir -v $LFS/tools
Создадим симлинк на созданный каталог:
ln -sv $LFS/tools /
2 каталога /tools необходимы для компиляции как на хосте , так и на вновь создаваемой партиции.
Добавим пользователя
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
bash становится шеллом по умолчанию для юзера lfs.
Будет создан каталог /home/lfs.
Залогиниваемся вновь созданным пользователем:
su - lfs
Создадим новый bash_profile в каталоге /home/lfs:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
Создадим там же новый .bashrc
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF
Выполним команду
source ~/.bash_profile
Далее начинаем компиляцию минимальной linux-системы.
Она состоит из 2 частей :
1. компилятор,линкер,библиотеки,утилиты
2. все остальное .
Все будет складываться в каталоге $LFS/tools.
Важное замечание : исходники пакетов нужно распаковывать пользователем
lfs.Каталоги с исходники и билдами пакета после компиляции нужно тут же удалить.
Проверим еще раз , но уже из-под пользователя lfs:
echo $LFS
Распаковываем binutils. Запускаем скрипт
config.guess
Должны получить вывод :
686-pc-linux-gnu
Конфигурация binutils :
./configure --prefix=/tools --disable-nls
Компиляция :
make
Инсталяция :
make install
make -C ld clean
make -C ld LIB_PATH=/tools/lib
Каталог binutils - один из немногих , который удалять не нужно - ни исходники, ни билд
gcc-3.4.3 разархивируем в каталог /mnt/lfs/sources/gcc-3.4.3.
Рядом создадим рабочий каталог /mnt/lfs/sources/gcc-build и из него запустим конфигурацию :
../gcc-3.4.3/configure --prefix=/tools \
--libexecdir=/tools/lib --with-local-prefix=/tools \
--disable-nls --enable-shared --enable-languages=c
Компиляция
make bootstrap
bootstrap подразумевает несколько проходов компиляции.
Инсталляция :
make install
Создадим симлинк :
ln -vs gcc /tools/bin/cc
Нужно в /tools/include скопировать подкаталога хидеров -
cp -Rv include/asm-i386 /tools/include/asm
cp -Rv include/linux /tools/include
Компиляция Glibc
Cоздадим рабочий каталог /mnt/lfs/sources/glibc-build и из него запустим конфигурацию :
../glibc-2.3.4/configure --prefix=/tools \
--disable-profile --enable-add-ons \
--enable-kernel=2.6.0 --with-binutils=/tools/bin \
--without-gd --with-headers=/tools/include \
--without-selinux
Компиляция : make
Проверка: make check
Инсталляция :
mkdir -v /tools/etc
touch /tools/etc/ld.so.conf
make install
Установка локали
mkdir -pv /tools/lib/locale
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i ja_JP -f EUC-JP ja_JP
Инсталляция линкераmake -C ld install
Динамический линкер
SPECFILE=`gcc --print-file specs` &&
sed 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g' \
$SPECFILE > tempspecfile &&
mv -f tempspecfile $SPECFILE &&
unset SPECFILE
Настройка :
rm -vf /tools/lib/gcc/*/*/include/{pthread.h,bits/sigthread.h}
Распакуем пакет tcl , зайдем в его подкаталог unix :
cd unix
./configure --prefix=/tools
make
make install
cd ..
export TCLPATH=`pwd`
ln -sv tclsh8.4 /tools/bin/tclsh
Не удаляйте каталог с исходниками tcl - они еще пригодятся.
Далее вы должны будете собрать из-под пользователя lfs следующие пакеты :
Expect-5.43.0
DejaGNU-1.4.4
GCC-3.4.3 - Pass 2
Binutils-2.15.94.0.2.2 - Pass 2
Gawk-3.1.4
Coreutils-5.2.1
Bzip2-1.0.3
Gzip-1.3.5
Diffutils-2.8.1
Findutils-4.2.23
Make-3.80
Grep-2.5.1a
Sed-4.1.4
Gettext-0.14.3
Ncurses-5.4
Patch-2.5.4
Tar-1.15.1
Texinfo-4.8
Bash-3.0
M4-1.4.3
Bison-2.0
Flex-2.5.31
Util-linux-2.12q
Perl-5.8.7
Я не буду подробно описывать как - смотрите английскую документацию ,
ссылку на которую я дал выше.
2. Сборка пакетов LFS
Билдинг пакетов должен осуществляться в строгой последовательности , а не параллельно.
Забудем о пользователе lfs
Дальше мы будем работать от рута.
Убедитесь вначале , что существует переменная среды $LFS
Вначале нужно построить файловую систему
mkdir -pv $LFS/{proc,sys}
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vft tmpfs tmpfs $LFS/dev
mount -vft tmpfs tmpfs $LFS/dev/shm
mount -vft devpts -o gid=4,mode=620 devpts $LFS/dev/pts
Все последующее нужно обязательно выполнять с предварительно настроенным chroot-ом : chroot "$LFS" /tools/bin/env -i \
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h
В противном случае вы можете разрушить свою собственную систему.
Дадим пользователю lfs права на каталог /tools в хост-системе
chown -R 0:0 /tools
Создадим структуру каталогов в lfs-системе
install -dv /{bin,boot,dev,etc/opt,home,lib,mnt}
install -dv /{sbin,srv,usr/local,var,opt}
install -dv /root -m 0750
install -dv /tmp /var/tmp -m 1777
install -dv /media/{floppy,cdrom}
install -dv /usr/{bin,include,lib,sbin,share,src}
ln -sv share/{man,doc,info} /usr
install -dv /usr/share/{doc,info,locale,man}
install -dv /usr/share/{misc,terminfo,zoneinfo}
install -dv /usr/share/man/man{1,2,3,4,5,6,7,8}
install -dv /usr/local/{bin,etc,include,lib,sbin,share,src}
ln -sv share/{man,doc,info} /usr/local
install -dv /usr/local/share/{doc,info,locale,man}
install -dv /usr/local/share/{misc,terminfo,zoneinfo}
install -dv /usr/local/share/man/man{1,2,3,4,5,6,7,8}
install -dv /var/{lock,log,mail,run,spool}
install -dv /var/{opt,cache,lib/{misc,locate},local}
install -dv /opt/{bin,doc,include,info}
install -dv /opt/{lib,man/man{1,2,3,4,5,6,7,8}}
Создадим набор линков :
ln -sv /tools/bin/{bash,cat,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv bash /bin/sh
Создадим базовые конфиги в /etc
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
EOF
cat > /etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
EOF
Запустим новый шелл :
exec /tools/bin/bash --login +h
Проинициализируем логи
touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/run/utmp /var/log/lastlog
chmod -v 664 /var/run/utmp /var/log/lastlog
Создадим ноды устройств
mknod -m 600 /dev/console c 5 1
mknod -m 666 /dev/null c 1 3
mount -nvt tmpfs none /dev
mknod -m 622 /dev/console c 5 1
mknod -m 666 /dev/null c 1 3
mknod -m 666 /dev/zero c 1 5
mknod -m 666 /dev/ptmx c 5 2
mknod -m 666 /dev/tty c 5 0
mknod -m 444 /dev/random c 1 8
mknod -m 444 /dev/urandom c 1 9
chown -v root:tty /dev/{console,ptmx,tty}
ln -sv /proc/self/fd /dev/fd
ln -sv /proc/self/fd/0 /dev/stdin
ln -sv /proc/self/fd/1 /dev/stdout
ln -sv /proc/self/fd/2 /dev/stderr
ln -sv /proc/kcore /dev/core
mkdir -v /dev/pts
mkdir -v /dev/shm
mount -vt devpts -o gid=4,mode=620 none /dev/pts
mount -vt tmpfs none /dev/shm
Проинсталлируем хидеры :
cp -Rv include/asm-i386 /usr/include/asm
cp -Rv include/linux /usr/include
chown -Rv root:root /usr/include/{asm,linux}
find /usr/include/{asm,linux} -type d -exec chmod -v 755 {} \;
find /usr/include/{asm,linux} -type f -exec chmod -v 644 {} \;
Дальше идет установка длинной цепочки пакетов :
Man-pages-2.01
Glibc-2.3.4
Re-adjusting the Toolchain
Binutils-2.15.94.0.2.2
GCC-3.4.3
Coreutils-5.2.1
Zlib-1.2.3
Mktemp-1.5
Iana-Etc-1.04
Findutils-4.2.23
Gawk-3.1.4
Ncurses-5.4
Readline-5.0
Vim-6.3
M4-1.4.3
Bison-2.0
Less-382
Groff-1.19.1
Sed-4.1.4
Flex-2.5.31
Gettext-0.14.3
Inetutils-1.4.2
IPRoute2-2.6.11-050330
Perl-5.8.7
Texinfo-4.8
Autoconf-2.59
Automake-1.9.5
Bash-3.0
File-4.13
Libtool-1.5.14
Bzip2-1.0.3
Diffutils-2.8.1
Kbd-1.12
E2fsprogs-1.37
Grep-2.5.1a
GRUB-0.96
Gzip-1.3.5
Hotplug-2004_09_23
Man-1.5p
Make-3.80
Module-Init-Tools-3.1
Patch-2.5.4
Procps-3.2.5
Psmisc-21.6
Shadow-4.0.9
Sysklogd-1.4.1
Sysvinit-2.86
Tar-1.15.1
Udev-056
Util-linux-2.12q
About Debugging Symbols
Stripping Again
Cleaning Up
Я не буду подробно описывать этот процесс и отсылаю вас к англо-язычному руководству ,
которое вы можете закачать в начале статьи.
После этого нужно выполнить набор команд:
logout
chroot $LFS /tools/bin/env -i \
HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/tools/bin/bash --login
/tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
-exec /tools/bin/strip --strip-debug '{}' ';'
chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login
3. Сборка стартовых скриптов LFS
Мы будем использовать System-V.
Проинсталлируем пакет LFS-Bootscripts-3.2.1
make install
В каталог /etc установятся конфиги :
checkfs, cleanfs, console, functions, halt, hotplug,
ifdown, ifup, localnet, mountfs, mountkernfs, network,
rc, reboot, sendsignals, setclock, static, swap, sysklogd, template, and udev
Система загрузочных скриптов SysVinit построена на концепции run-levels.
Этих уровней семь - от 0 до 6. По дефаулту run-levels=3.
Вот их краткое описание 0: halt the computer
1: single-user mode
2: multi-user mode without networking
3: multi-user mode with networking
4: reserved for customization, otherwise does the same as 3
5: same as 4, it is usually used for GUI login (like X's xdm or KDE's kdm)
6: reboot the computer
Команда для изменения run-levels
init [runlevel]
В /etc есть каталог /etc/rc.d со вложенными подкаталогами вида rc?.d с набором ссылок.
Эта ссылка может начинаться либо на K , либо на S. K означает kill , S означает start какого-то сервиса.
Сам же скрипт на запуск этого сервиса лежит в каталоге /etc/rc.d/init.d.
Исторически сначала появилась файловая система devfs.
Устройства приаттачиваются к каталогу /dev. Инсталляцию устройств в этот каталог выполняет
скрипт MAKEDEV , в нем вызывается программа mknod.
Позже появилась файловая система sysfs. Она монтируется в каталог sys.
Скрипт S10udev создает ноды устройств в этом каталоге.
Другой скрипт udevstart синхронизирует каталоги /sys и /dev.
Файл /proc/sys/kernel/hotplug включает список пользовательских процессов ,
которые генерируют запросы к устройствам. Когда такое событие генерируется , ядро запускает
udev , который сканирует каталог /sys и создает соответственную ноду в /dev.
. Если драйвер встроен в ядро , он загружается с помощю bootscript S05modules .
Скрипт setclock читает системное время и конвертирует его в соответствии с /etc/localtime,
фактически вызывая программу hwclock.
Создадим новый файл /etc/sysconfig/clock :
cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock
UTC=1
# End /etc/sysconfig/clock
EOF
Настроим консоль , которая инсталлируется с помощью bootscript console.
Этот скрипт читает конфиг-файл /etc/sysconfig/console.
Создадим его :
cat >/etc/sysconfig/console <<"EOF"
KEYMAP="us"
FONT="lat1-16"
EOF
Скрипт sysklogd вызывает программу sysklogd , которая пишет в лог с периодичностью
в 20 минут по умолчанию. Этот время можно изменить в скрипте.
Конфиг /etc/inputrc управляет вводом с клавиатуры.
Создадим этот файл :
cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn
# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off
# Enable 8bit input
set meta-flag On
set input-meta On
# Turns off 8th bit stripping
set convert-meta Off
# Keep the 8th bit for display
set output-meta On
# none, visible or audible
set bell-style none
# All of the following map the escape sequence of the
# value contained inside the 1st argument to the
# readline specific functions
"\eOd": backward-word
"\eOc": forward-word
# for linux console
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
# for xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line
# End /etc/inputrc
EOF
Шелл-оболочка представлена файлом /bin/bash.
Он начинает работать при загрузке , запуская /bin/login и читая /etc/passwd.
Шелл может выступать в 2-х вариантах - интерактивном и неинтерактивном.
В качестве конфигов самого шелла выступают /etc/profile и ~/.bash_profile.
Список всех локалей в собранной вами LFS можно получить командой locale -a
Настройка :
LC_ALL=en_US locale charmap
LC_ALL=en_US locale country
LC_ALL=en_US locale language
LC_ALL=en_US locale charmap
LC_ALL=en_US locale int_curr_symbol
LC_ALL=en_US locale int_prefix
Создадим /etc/profile :
cat > /etc/profile << "EOF"
# Begin /etc/profile
export LANG=en_US
export INPUTRC=/etc/inputrc
# End /etc/profile
EOF
Создадим файл /etc/sysconfig/network :
echo "HOSTNAME=localhost" > /etc/sysconfig/network
Создадим файл /etc/hosts :
cat > /etc/hosts << "EOF"
# Begin /etc/hosts (network card version)
127.0.0.1 localhost
192.168.1.1 localhost.example.org localhost
# End /etc/hosts (network card version)
EOF
Если у вас есть сетевая карта , нужно выполнить настройку сетевых скриптов.
Конфиг ipv4 :
cd /etc/sysconfig/network-devices &&
mkdir -v ifconfig.eth0 &&
cat > ifconfig.eth0/ipv4 << "EOF"
ONBOOT=yes
SERVICE=ipv4-static
IP=192.168.1.1
GATEWAY=192.168.1.2
PREFIX=24
BROADCAST=192.168.1.255
EOF
Конфиг /etc/resolv.conf :
cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf
domain {[Your Domain Name]}
nameserver [IP address of your primary nameserver]
nameserver [IP address of your secondary nameserver]
# End /etc/resolv.conf
EOF
Здесь я показываю свой fstab :
cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck
# order
/dev/hdb8 / ext2 defaults 1 1
/dev/hdb5 swap swap pri=1 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
shm /dev/shm tmpfs defaults 0 0
# End /etc/fstab
EOF
Компиляция ядра :
make mrproper
loadkeys -m /usr/share/kbd/keymaps/i386/qwerty/us.map.gz > drivers/char/defkeymap.c
make menuconfig
make
4. Настройка загрузчика LFS
В файле /boot/grub/grub.conf я прописал :
title LFS
root (hd1,7)
kernel /boot/lfskernel-2.6.11.12 ro root=/dev/hdb8 rhgb quiet
Ну и вобщем , практически с первой загрузки оно у меня заработало.
Протокол вывода при загрузке примерно следующий :
Init version 2.8.6
Mounting kernel based file system /proc /sys
Populating /dev with devices nodes
Activating all swap files/partitions
Mounting root file system in read-only
Checking file system .....................................
Login:
Password:
|
sashapere | Класно! 2012-10-23 16:38:24 | |
|