Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

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