Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
      Languages 
      Kernels 
      Packages 
      Books 
      Tests 
      OS 
      Forum 
      Математика 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...5200 
 Secure Programming for Li...3570 
 Trees...988 
 Максвелл 3...916 
 Go Web ...864 
 William Gropp...849 
 Ethreal 3...816 
 Gary V.Vaughan-> Libtool...808 
 Ethreal 4...805 
 Clickhouse...801 
 Rodriguez 6...792 
 Ext4 FS...787 
 Steve Pate 1...784 
 Ethreal 1...777 
 C++ Patterns 3...751 
 Assembler...731 
 Ulrich Drepper...728 
 DevFS...693 
 Стивенс 9...679 
 MySQL & PosgreSQL...672 
 
  01.01.2024 : 3621733 посещений 

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