Ссылки:
1 2 3 4 5 6 7 8 |
https://www.linuxfromscratch.org/lfs/downloads/stable/ https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/LFS-BOOK-11.1-NOCHUNKS.html https://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-11.2-NOCHUNKS.html https://www.linuxfromscratch.org/lfs/download.html https://www.linuxfromscratch.org/faq/ https://habr.com/ru/post/257663/ https://www.linuxfromscratch.org/livecd/download.html https://github.com/automate-lfs/jhalfs |
Скрипт проверки готовности системы для сборки lfs:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
cat > version-check.sh << "EOF" #!/bin/bash # Simple script to list version numbers of critical development tools export LC_ALL=C bash --version | head -n1 | cut -d" " -f2-4 MYSH=$(readlink -f /bin/sh) echo "/bin/sh -> $MYSH" echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash" unset MYSH echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3- bison --version | head -n1 if [ -h /usr/bin/yacc ]; then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`"; elif [ -x /usr/bin/yacc ]; then echo yacc is `/usr/bin/yacc --version | head -n1` else echo "yacc not found" fi echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2 diff --version | head -n1 find --version | head -n1 gawk --version | head -n1 if [ -h /usr/bin/awk ]; then echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`"; elif [ -x /usr/bin/awk ]; then echo awk is `/usr/bin/awk --version | head -n1` else echo "awk not found" fi gcc --version | head -n1 g++ --version | head -n1 grep --version | head -n1 gzip --version | head -n1 cat /proc/version m4 --version | head -n1 make --version | head -n1 patch --version | head -n1 echo Perl `perl -V:version` python3 --version sed --version | head -n1 tar --version | head -n1 makeinfo --version | head -n1 # texinfo version xz --version | head -n1 echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c if [ -x dummy ] then echo "g++ compilation OK"; else echo "g++ compilation failed"; fi rm -f dummy.c dummy EOF bash version-check.sh |
0. Подготовим linux для установкам LFS:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
!!! https://github.com/archlinux/archinstall 0. Накатил на виртуалку archlinux без графики использовал команду archinstall 1. после установки подключил еще одни диск /dev/vdb отформатировал его (fstab /dev/vdb) создал файловую систему с помощью ext4(mkfs.ext4 /dev/vdb1) добавил этот диск в (/etc/fstab) что бы пока не беспокоится о его подключении после перезагрузки системы проверил с помощью команды (mount -a) mkdir /mnt/lfs 2. установил софт на archlinux pacman -Sy core/openssh vim git wget python gcc 3. временно создал переменную LFS !!! В книге LFS предполагается что вы все делаете за одни раз !!! Поэтому, в случае отключения питания ПК, потребуется некоторые команды выполнять заново. export LFS=/mnt/lfs 4. Создал директории mkdir -v $LFS mkdir -v $LFS/sources mkdir -v $LFS/tools mkdir -v $LFS/usr 5. Создаем еще директории: mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin} 6. Создаем символьные ссылки для библиотеки: for i in bin lib sbin; do ln -sv usr/$i $LFS/$i done 7. Создаем символьные ссылки для библиотеки x64: case $(uname -m) in x86_64) mkdir -pv $LFS/lib64 ;; esac 8. Права chmod -v a+wt $LFS/sources 9. Загружаем файлы lfs Список скачиваемых пакетов wget-list и список контрольных сумм пакетов md5sums: wget https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/wget-list --directory-prefix=$LFS/sources wget https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/md5sums --directory-prefix=$LFS/sources После этого приступаем к закачке исходников всего и вся: wget --input-file=$LFS/sources/wget-list --continue --directory-prefix=$LFS/sources 10. Проверяем скаченное: !!! команды pushd/popd, делают следующие, !!! Команда pushd временно переводит вас в указанный в качестве параметра каталог. !!! Возврат назад происходит командой popd pushd $LFS/sources md5sum -c md5sums popd !!! Если чего-то не окажется, нужно пойти и скачать ручками !!! если все ок можем продолжать |
1.1 Книга:
1 2 |
cd /mnt/lfs/book git clone git://git.linuxfromscratch.org/jhalfs.git jhalfs |
2. подготовим окружение пользователя lfs для сборки:
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 |
!!! если вышли или закрыли консоль не забываем выполнить (export LFS=/mnt/lfs и проверить с помощью echo $LFS) 0. Настройка рабочего окружения !!! Создаем символьную ссыдку !!! Мы обеспечиваем возможность обращения к данному каталогу по пути /tools вне зависимости от текущего расположения корня системы !!! В противном случае сразу после перехода во временную систему нас ждет сбой при первой же компиляции. ln -sv $LFS/tools / 1. Создаем группу lfs groupadd lfs 2. Создаем пользователя lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs -s /bin/bash — используемая в сеансе пользователя командная оболочка -g lfs — группа, в которую входит пользователь -m — указывает, что необходимо создать домашний каталог пользователя /home/lfs -k /dev/null — пустой каталог шаблонов(создать пустую директорию /home/lfs). По-умолчанию при создании домашнего каталога в него помещаются файлы и папки, размещенные в /etc/skel. 3. Устанавливаем пароль пользователю lfs passwd lfs 4. Сделаем lfs его владельцем каталогов $LFS/sources и $LFS/tools chown -v lfs $LFS/sources chown -v lfs $LFS/tools chown -v lfs $LFS/book chown -v lfs $LFS/usr |
3. Продолжаем работу над рабочим окружением пользователя:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
0. Подключаемся от имени lfs: su - lfs 1. Создаем в домашней директории пользователя файл ~/.bash_profile: !!! Файл ~/.bash_profile определяет индивидуальную пользовательские настройку переменных среды. ------------------------------ cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:w\$ ' /bin/bash EOF ------------------------------ 2. Создаем в домашней директории пользователя файл ~/.bashrc: !!! Файл ~/.bashrc определяет какие настройки должны быть выполнены при логине в сессию данного пользователя ----------------------------------- cat > ~/.bashrc << "EOF" set +h umask 022 LFS=/mnt/lfs LC_ALL=POSIX LFS_TGT=$(uname -m)-lfs-linux-gnu PATH=/tools/bin:/bin:/usr/bin export LFS LC_ALL LFS_TGT PATH EOF ------------------------------------ set +h — отключает хеширование в bash. Командная оболочка запоминает пути к исполняемым файлам, запущенным ранее, что безусловно ускоряет работу системы. Однако мы будем вызывать разные версии одних и тех программ расположенных по разным путям, поэтому хеширование будет только вредить нам. umask 022 — устанавливает права доступа к новым файлам и каталогам, задаваемые по умолчанию. Значение 022 означает, что файлы будут создаваться с правами 644 (rw- r-- r--) а каталоги — с правами 755 (rwx r-x r-x). Каждый взведенный бит umask означает сброс соответсвующего бита в атрибутах прав LFS=/mnt/lfs — корень собираемой системы LC_ALL=POSIX — определяет локализацию запускаемых программ. POSIX задает стандарт отображения независимый от способа кодировки символов. LFS_TGT — задает описание целевой машины, используемое при построении временных иструментов сборки системы PATH — пути поиска исполняемых файлов export — присваивает указанным переменным заданные выше значения 3. Переключаемся на чистое окружение exec env -i HOME=$HOME TERM=$TERM PS1='\u:W\$ ' /bin/bash создает «чистое» пользовательское окружение (ключ -i указывает игнорировать предыдущие настройки), присваивая значения переменным среды HOME — домашний каталог, присваиваем текущее значение переменной, равное /home/lfs TERM — используемый тип терминала, так же оставляем текущий PS1 — формат приглашения командной строки. В данном случает задается формат вида имя пользователя: текущий рабочий каталог$, где спецсимвол \u — имя пользователя, \W — текущий рабочий каталог. /bin/bash — команда, запускающая новый экземпляр командной оболочки 4. Обновим пользовательское окружение командой source ~/.bash_profile 5. Убеждаемся, что необходимые переменные окружения установлены set |
4. Сборка временного набора инструментов (Temporary System)
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 |
!!! Начиная собирать систему, мы сталкиваемся с классической проблемой «курицы и яйца». !!! Для сборки системы нам необходимы компилятор, линковщик и библиотеки. !!! Но у нас нет ничего из перечисленного, только их исходники. У нас есть компилятор в хост-системе, и собирать необходимое ПО мы начнем именно им. !!! Однако если просто собрать тот же gcc с настройками по-умолчанию он не будет работать в LFS-системе !!! на начальном этапе её построения — он использует динамическую компоновку необходимых для работы библиотек. !!! Весь необходимый для работы код надо будет скомпоновать статически, то есть явным образом включить в исполняемый файл. !!! Таким образом первым делом мы выполним кросс-компиляцию некоторых частей будущей системы, чтобы иметь возможность воспользоваться ими при сборке окончательного её варианта. Переходим в каталог $LFS/sources: cd $LFS/sources !!! Для всех собираемых пакетов порядок сборки содержит следующую последовательность действий (если не оговорено иного!): !!! Распаковываем архив с пакетом !!! tar -pxf <package-archive-file-name> !!! Переходим в распакованный каталог !!! cd <package-dir-name> !!! Выполняем инструкции по сборке (у каждого пакета имеются ньюансы, подробно описанные в документации) !!! Переходим на каталог выше, назад в $LFS/source, и удаляем все созданные при распаковке и сборке директории !!! Время сборки пакетов различно — от практически мгновенной, до двух с половиной часов !!! Так как быстродействие компьютеров различается, в качестве единицы измерения времени сборки выбрана относительная единица, именуемая Standard Build Unit (SBU) !!! Один SBU равен времени сборки пакета binutils, который компилируется самым первым. !!! Рекомендация: не собирайте систему в несколько потоков. !!! Если у вас многоядерный процессор, то ключик -j ускорит работу, но позже это может обернуться непрохождением некоторых важных тестов и нестабильной работой собранного ПО. !!! Сборка в один поток не так уж и продолжительна — гораздо большее время будет затрачено на разгребание нажитых многопоточной сборкой проблем. |
5. Сборка Binutils — первый проход. Измерение SBU
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
!!! Binutils — пакет, содержащий вспомогательные утилиты для сборки ПО. В их число входят ассемблер (as) и компоновщик (ld). !!! Они необходимы glibc и gcc для прохождения некоторых тестов, поэтому данный пакет собирается в первую очередь. 0. распаковали и перешли в каталог tar -pxf binutils-2.38.tar.xz cd binutils-2.38 1. Для сборки этого пакета рекомендуется создать отдельный каталог, создаем его и переходим туда mkdir -v ../binutils-build cd ../binutils-build 2. Теперь надо выполнить конфигурирование пакета, чтобы сгенерировать правильный Makefile. ../binutils-2.38/configure --prefix=/tools --with-sysroot=$LFS --with-lib-path=/tools/lib --target=$LFS_TGT --disable-nls --disable-werror !!! --prefix=/tools — указывает на то, что собранные пакеты будут устанавливаться в директорию /tools, где будет размещаться временная система !!! --with-sysroot=$LFS — корневой каталог системы, относительно которого будет производится поиск библиотек и прочих ресурсов, необходимых для работы программ во временной системе !!! --with-lib-path=/tools/lib — путь поиска библиотек, указываемый для компоновщика ld !!! --target=$LFS_TGT — задаем описание целевой машины !!! --disable-nls — отключает интернационализацию собираемых пакетов. В данный момент она без надобности, а её наличие может вызвать ряд сбоев !!! --disable-werror — отключает остановку компиляции при получении предупреждений от компилятора хост-системы 3. После того как отработает конфигуратор, на выходе мы получим Makefile, предназначенный для сборки и установки пакета. Собираем пакет и измеряем SBU: time { make; } 4. Получили вывод: real 2m17.202s user 1m58.972s sys 0m15.231s 5. Из этого следует: Для моей системы — виртуальная машина на 2 - ядрах (Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz), 2Gb RAM, SBU составил 2m17.202s при сборке в один поток. 6. Зачем это SBU? Например запустить финальную сборку gcc вместе с тестами и уйти делать другие дела, ибо занимает это 63 SBU(2+ часа реального времени для машины в тесте) — нет смысла с надеждой пялится в экран. 7. После того как сборка окончена, создаем символические ссылки на каталоги библиотек. !!! Данная операция необходима, если ваша система 64-разрядная, так что нижеприведенная команда сначала проверяет разрядность системы, а уж потом при необходимости создает симлинки. case $(uname -m) in x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;; esac 8. Устанавливаем собранное make install 9. Выходим из каталога binutils-build и удаляем больше не нужные каталоги cd .. rm -r binutils-2.38 rm -r binutils-build |
Примечание
1 2 3 4 5 |
!!! https://www.linuxfromscratch.org/lfs/view/stable/partintro/generalinstructions.html#buildinstr В этой главе часто возникают недоразумения. Процедуры такие же, как и в любой другой главе, как объяснялось ранее ( Инструкции по сборке пакетов ). Сначала извлеките tar-архив gcc из исходного каталога, а затем перейдите в созданный каталог. Только после этого следует приступить к приведенным ниже инструкциям. |
10. Сборка GCC — первый проход
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
!!! https://www.linuxfromscratch.org/lfs/view/stable/chapter05/gcc-pass1.html !!! В процессе сборки системы компилятор придется собирать много раз. !!! Первые два прохода необходимы для получения компилятора, способного работать независимо от хост-системы. 0. распакуем и перейдем в каталог gcc tar -xpf gcc-11.2.0.tar.xz cd gcc-11.2.0 1. Для успешной компиляции нам потребуются исходники ещё трех пакетов: GMP, MPFR и MPC. Распакуем их в каталог исходников компилятора и переименуем каталоги так, как на них ссылаются в исходниках gcc tar -pxf ../gmp-6.2.1.tar.xz tar -xpf ../mpfr-4.1.0.tar.xz tar -xpf ../mpc-1.2.1.tar.gz mv -v gmp-6.2.1 gmp mv -v mpfr-4.1.0 mpfr mv -v mpc-1.2.1 mv -v mpc-1.2.1 mpc 2. На хостах x86_64 установите имя каталога по умолчанию для 64-битных библиотек на « lib » : case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac 3. Документация GCC рекомендует собирать GCC в выделенном каталоге сборки: mkdir -v build cd build 4. Готовим gcc к компиляции ../configure \ --target=$LFS_TGT \ --prefix=$LFS/tools \ --with-glibc-version=2.35 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --enable-initfini-array \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-decimal-float \ --disable-threads \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++ Значение параметров настройки: --with-glibc-version=2.35 - Эта опция указывает версию glibc, которая будет использоваться на цели. Это не относится к libc хост-дистрибутива, потому что все, скомпилированное с помощью pass1 gcc, будет работать в среде chroot, которая изолирована от libc хост-дистрибутива. --with-newlib - Поскольку работающая библиотека C еще недоступна, это гарантирует, что константаinhibit_libc будет определена при сборке libgcc. Это предотвращает компиляцию любого кода, требующего поддержки libc. --without-headers - При создании полного кросс-компилятора GCC требует стандартных заголовков, совместимых с целевой системой. Для наших целей эти заголовки не понадобятся. Этот переключатель предотвращает их поиск GCC. --enable-initfini-array - Этот переключатель заставляет использовать некоторые внутренние структуры данных, которые необходимы, но не могут быть обнаружены при построении кросс-компилятора. --disable-shared - Этот переключатель заставляет GCC статически связывать свои внутренние библиотеки. Нам это нужно, потому что общие библиотеки требуют glibc, который еще не установлен в целевой системе. --disable-multilib - В x86_64 LFS не поддерживает конфигурацию с несколькими библиотеками. Этот переключатель безвреден для x86. --disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx Эти переключатели отключают поддержку расширения десятичных чисел с плавающей запятой, многопоточности, libatomic, libgomp, libquadmath, libssp, libvtv и стандартной библиотеки C++ соответственно. Эти функции не будут компилироваться при сборке кросс-компилятора и не нужны для задачи кросс-компиляции временной libc. --enable-languages=c,c++ - Этот параметр обеспечивает сборку только компиляторов C и C++. Это единственные языки, которые нужны сейчас. Скомпилируйте GCC, выполнив: make Установите пакет: make install Эта сборка GCC установила пару внутренних системных заголовков. Обычно один из них, limits.h, в свою очередь, включает соответствующий системный limits.hзаголовок, в данном случае $LFS/usr/include/limits.h. Однако на момент создания этой сборки GCC $LFS/usr/include/limits.hне существует, поэтому только что установленный внутренний заголовок представляет собой частичный автономный файл и не включает расширенные функции системного заголовка. Этого достаточно для сборки glibc, но полный внутренний заголовок понадобится позже. Создайте полную версию внутреннего заголовка с помощью команды, идентичной тому, что система сборки GCC делает в обычных обстоятельствах: cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h Now that our cross-toolchain is complete, finalize the installation of the limits.h header. For doing so, run a utility provided by the GCC developers: $LFS/tools/libexec/gcc/$LFS_TGT/11.2.0/install-tools/mkheaders После успешной сборки можно удалить cd /mnt/lfs/sources rm -rf gcc-11.2.0 |
11. Заголовки API Linux-5.16.9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
0. Выполняем уже для нас стандартные действия (переходим каталог с исходниками, распаковываем нужный пакет, и переходим в папку) cd /mnt/lfs/sources tar -pxf linux-5.16.9.tar.xz cd linux-5.16.9 1. Убедитесь, что в пакете нет устаревших файлов: make mrproper 2. Теперь извлеките видимые пользователю заголовки ядра из исходного кода. !!! Рекомендуемую цель make « headers_install » использовать нельзя, так как для этого требуется rsync , который может быть недоступен. !!! Заголовки сначала помещаются в ./usr, а затем копируются в нужное место. !!! Команды выполняем последовательно make headers find usr/include -name '.*' -delete rm usr/include/Makefile cp -rv usr/include $LFS/usr |
Установка Glibc-2.35
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
0. Переходим в каталог sources и выполняем стандартные действия cd /mnt/lfs/sources tar -pxf glibc-2.35.tar.xz cd glibc-2.35 1. С помощью крипта создайте символическую ссылку для соответствия LSB. Кроме того, для x86_64 создайте символическую ссылку совместимости, необходимую для правильной работы загрузчика динамической библиотеки: !!! Приведенная выше команда верна. !!! У команды ln есть несколько синтаксических версий, поэтому обязательно проверьте информацию coreutils ln и ln(1)прежде чем сообщать о том, что вы можете принять за ошибку. case $(uname -m) in i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 ;; x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64 ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3 ;; esac 2. Некоторые программы Glibc используют /var/dbкаталог, не совместимый с FHS, для хранения своих данных времени выполнения. Примените следующий патч, чтобы такие программы хранили свои данные времени выполнения в местах, совместимых с FHS: patch -Np1 -i ../glibc-2.35-fhs-1.patch 3. Документация Glibc рекомендует собирать Glibc в выделенном каталоге сборки: mkdir -v build cd build 4. Убедитесь, что утилиты ldconfig и sln установлены в /usr/sbin: echo "rootsbindir=/usr/sbin" > configparms 5. Затем подготовьте Glibc к компиляции: ../configure \ --prefix=/usr \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --enable-kernel=3.2 \ --with-headers=$LFS/usr/include \ libc_cv_slibdir=/usr/lib Значение параметров настройки: --host=$LFS_TGT, --build=$(../scripts/config.guess) Комбинированный эффект этих переключателей заключается в том, что система сборки Glibc настраивается для кросс-компиляции с использованием кросс-линкера и кросс-компилятора в $LFS/tools. --enable-kernel=3.2 Это говорит Glibc скомпилировать библиотеку с поддержкой ядра Linux 3.2 и более поздних версий. Обходные пути для старых ядер не включены. --with-headers=$LFS/usr/include Это говорит Glibc скомпилировать себя с использованием заголовков, недавно установленных в каталог $LFS/usr/include, чтобы он точно знал, какие функции имеет ядро, и мог соответствующим образом оптимизировать себя. libc_cv_slibdir=/usr/lib Это гарантирует, что библиотека будет установлена в /usr/lib вместо стандартного /lib64 на 64-битных машинах. 6. Скомпилируйте пакет: make 7. Установите пакет: !!! Если LFSон не установлен должным образом, и, несмотря на рекомендации, вы собираете как root, следующая команда установит только что собранный glibc в вашу хост-систему, !!! что, скорее всего, сделает его непригодным для использования. Поэтому дважды проверьте, правильно ли настроена среда, прежде чем запускать следующую команду. make DESTDIR=$LFS install 8. Исправьте жестко заданный путь к исполняемому загрузчику в скрипте ldd : sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd 9. Осторожно. Важный момент. Нужно проверить работу сборщика. a)На этом этапе необходимо остановиться и убедиться, что основные функции (компиляция и компоновка) новой цепочки инструментов работают должным образом. Чтобы выполнить проверку работоспособности, выполните следующие команды: echo 'int main(){}' > dummy.c $LFS_TGT-gcc dummy.c readelf -l a.out | grep '/ld-linux' б)Если все работает правильно, ошибок быть не должно, а вывод последней команды будет иметь вид: [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] с)Если все работает, очистите тестовые файлы: rm -v dummy.c a.out 10. Теперь, когда наша кросс-инструментальная цепочка завершена, завершите установку заголовка limit.h. Для этого запустите утилиту, предоставленную разработчиками GCC: $LFS/tools/libexec/gcc/$LFS_TGT/11.2.0/install-tools/mkheaders |
12. Установка Libstdc++ from GCC-11.2.0, Pass 1
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 32 33 34 35 36 37 38 39 40 41 42 43 |
!!! Libstdc++ — это стандартная библиотека C++. Он нужен для компиляции кода C++ (часть GCC написана на C++), !!! но нам пришлось отложить его установку, когда мы собирали gcc-pass1, потому что он зависит от glibc, которого еще не было в целевом каталоге. !!! Примечание !!! Libstdc++ является частью исходников GCC. !!! Сначала вы должны распаковать архив GCC и перейти в gcc-11.2.0 каталог. 0. Выполняем стандартное: tar -pxf gcc-11.2.0.tar.xz cd gcc-11.2.0 mkdir -v build cd build 1. Подготовьте libstdc++ к компиляции: ../libstdc++-v3/configure \ --host=$LFS_TGT \ --build=$(../config.guess) \ --prefix=/usr \ --disable-multilib \ --disable-nls \ --disable-libstdcxx-pch \ --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/11.2.0 Значение параметров настройки: --host=... Указывает, что вместо компилятора в /usr/bin. --disable-libstdcxx-pch Этот переключатель предотвращает установку предварительно скомпилированных включаемых файлов, которые на данном этапе не нужны. --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/11.2.0 Указывает каталог установки для включаемых файлов. Поскольку libstdc++ является стандартной библиотекой C++ для LFS, этот каталог должен соответствовать местоположению, в котором компилятор C++ ( $LFS_TGT-g++ ) будет искать стандартные включаемые файлы C++. В обычной сборке эта информация автоматически передается параметрам конфигурации libstdc++ из каталога верхнего уровня. В нашем случае эта информация должна быть указана явно. Компилятор C++ добавит путь sysroot $LFS(указанный сборкой GCC pass 1) к пути поиска включаемого файла, поэтому он фактически будет искать в $LFS/tools/$LFS_TGT/include/c++/11.2.0. Комбинация DESTDIRпеременной (в приведенной ниже команде make install ) и этого переключателя обеспечивает установку заголовков. 2. Скомпилируйте libstdc++, запустив: make 3. Установите библиотеку: make DESTDIR=$LFS install |
13. Установка М4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
0. Выполняем стандартные действия: cd /mnt/lfs/sources/ tar -pxf m4-1.4.19.tar.xz cd m4-1.4.19 1. Подготовьте M4 к компиляции: ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) 2. Скомпилируйте пакет: make 3. Установите пакет: make DESTDIR=$LFS install |
14. Установка Ncurses-6.3
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
!!! https://www.linuxfromscratch.org/lfs/view/stable/chapter06/ncurses.html 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf ncurses-6.3.tar.gz cd ncurses-6.3 1. Во- первых, убедитесь, что во время настройки сначала найден gawk(выполнение не должно вернуть ошибку): sed -i s/mawk// configure 2. Затем выполните следующие команды, чтобы собрать программу « tic » на хосте сборки: mkdir build pushd build ../configure make -C include make -C progs tic popd 3. Подготовьте Ncurses к компиляции: ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./config.guess) \ --mandir=/usr/share/man \ --with-manpage-format=normal \ --with-shared \ --without-debug \ --without-ada \ --without-normal \ --disable-stripping \ --enable-widec Значение новых опций конфигурации: --with-manpage-format=normal Это предотвращает установку Ncurses сжатых справочных страниц, что может произойти, если сам дистрибутив хоста имеет сжатые справочные страницы. --without-ada Это гарантирует, что Ncurses не создаст поддержку компилятора Ada, который может присутствовать на хосте, но будет недоступен, как только мы войдем в среду chroot . --disable-stripping Этот переключатель не позволяет системе здания удалять программы с помощью программы удаления с хоста. Использование инструментов хоста в кросс-компилируемой программе может привести к сбою. --enable-widec Этот переключатель вызывает создание библиотек расширенных символов (например, libncursesw.so.6.3) вместо обычных (например, libncurses.so.6.3). Эти широкосимвольные библиотеки можно использовать как в многобайтовых, так и в традиционных 8-битных локалях, в то время как обычные библиотеки правильно работают только в 8-битных локалях. Библиотеки расширенных символов и обычные библиотеки совместимы с исходным кодом, но не совместимы с двоичным кодом. --without-normal Этот переключатель отключает сборку и установку большинства статических библиотек. 4. Скомпилируйте пакет: make 5. Установите пакет: make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install echo "INPUT(-lncursesw)" > $LFS/usr/lib/libncurses.so Значение параметров установки: TIC_PATH=$(pwd)/build/progs/tic Нам нужно передать путь только что построенного тика , способного работать на сборочной машине, чтобы база данных терминала могла быть создана без ошибок. echo "ВВОД(-lncursesw)" > $LFS/usr/lib/libncurses.so Библиотека libncurses.soнужна для нескольких пакетов, которые мы скоро создадим. |
15. Установка Bash-5.1.16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf bash-5.1.16.tar.gz cd bash-5.1.16 1. Подготовьте Bash к компиляции: ./configure --prefix=/usr \ --build=$(support/config.guess) \ --host=$LFS_TGT \ --without-bash-malloc --without-bash-malloc Этот параметр отключает использование функции распределения памяти ( malloc) Bash, которая, как известно, вызывает ошибки сегментации. Если отключить эту опцию, Bash будет использовать malloc более стабильные функции из Glibc. 2. Скомпилируйте пакет: make 3. Установите пакет: make DESTDIR=$LFS install 4. Сделайте ссылку на программы, которые используют sh для оболочки: mkdir $LFS/bin ln -sv bash $LFS/bin/sh |
16. Установка Coreutils-9.0
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 |
0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf coreutils-9.0.tar.xz cd coreutils-9.0 1. Готовим ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --enable-install-program=hostname \ --enable-no-install-program=kill,uptime Значение параметров настройки: --enable-install-program=hostname Это позволяет создать и установить двоичный файл имени хоста — по умолчанию он отключен, но требуется для набора тестов Perl. 2. Скомпилируйте пакет: make 3. Установите пакет: make DESTDIR=$LFS install 4. Переместите программы в их окончательные ожидаемые местоположения. Хотя в этой временной среде в этом нет необходимости, мы должны это сделать, потому что некоторые программы жестко кодируют исполняемые местоположения: mv -v $LFS/usr/bin/chroot $LFS/usr/sbin mkdir -pv $LFS/usr/share/man/man8 mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8 sed -i 's/"1"/"8"/' $LFS/usr/share/man/man8/chroot.8 |
17. Установка Diffutils-3.8
1 2 3 4 5 6 7 8 9 10 11 12 13 |
0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf diffutils-3.8.tar.xz cd diffutils-3.8 1. Готовим Diffutils для компиляции: ./configure --prefix=/usr --host=$LFS_TGT 2. Скомпилируйте пакет: make 3. Установите пакет: make DESTDIR=$LFS install |
18. Установка File-5.41
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 32 |
0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf file-5.41.tar.gz cd file-5.41 1. Приступаем к конфигурированию: !!! Команда file на хосте сборки должна быть той же версии, что и та, которую мы собираем, чтобы создать файл подписи. !!! Запустите следующие команды, чтобы построить его: mkdir build pushd build ../configure --disable-bzlib \ --disable-libseccomp \ --disable-xzlib \ --disable-zlib make popd Значение новой опции конфигурации: --disable-* Сценарий конфигурации пытается использовать некоторые пакеты из основного дистрибутива, если существуют соответствующие файлы библиотеки. Это может привести к сбою компиляции, если файл библиотеки существует, но отсутствуют соответствующие заголовочные файлы. Эти параметры предотвращают использование этих ненужных возможностей хоста. 2. Подготовьте файл для компиляции: ./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess) 3. Скомпилируйте пакет: make FILE_COMPILE=$(pwd)/build/src/file 4. Установите пакет: make DESTDIR=$LFS install |
19. Установка Findutils-4.9.0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
!!! Пакет Findutils содержит программы для поиска файлов. Эти программы предназначены для рекурсивного поиска в дереве каталогов, а также для создания, !!! обслуживания и поиска в базе данных (часто быстрее, чем рекурсивный поиск, но ненадежно, если база данных недавно не обновлялась). 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf findutils-4.9.0.tar.xz cd findutils-4.9.0 1. Подготовьте Findutils к компиляции: ./configure --prefix=/usr \ --localstatedir=/var/lib/locate \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) 2. Скомпилируйте пакет: make 3. Установите пакет: make DESTDIR=$LFS install |
20. Установка Gawk-5.1.1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
!!! Пакет Gawk содержит программы для работы с текстовыми файлами. 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf gawk-5.1.1.tar.xz cd gawk-5.1.1 1. Во-первых, убедитесь, что некоторые ненужные файлы не установлены: sed -i 's/extras//' Makefile.in 2. Подготовьте Gawk к компиляции: ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) 3. Скомпилируйте пакет: make 4. Установите пакет: make DESTDIR=$LFS install |
21. Установка Grep-3.7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
!!! Пакет Grep содержит программы для поиска по содержимому файлов. 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf grep-3.7.tar.xz cd grep-3.7 1. Подготовьте Grep к компиляции: ./configure --prefix=/usr \ --host=$LFS_TGT 2. Скомпилируйте пакет: make 3. Установите пакет: make DESTDIR=$LFS install |
22. Установка Gzip-1.11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
!!! Пакет Gzip содержит программы для сжатия и распаковки файлов. 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf gzip-1.11.tar.xz cd gzip-1.11 1. Подготовим Gzip к компиляции: ./configure --prefix=/usr --host=$LFS_TGT 2. Скомпилируем пакет: make 3. Устанавливаем пакет: make DESTDIR=$LFS install |
23. Установка Make-4.3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
!!! Пакет Make содержит программу для управления генерацией исполняемых файлов и других не исходных файлов пакета из исходных файлов. 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf make-4.3.tar.gz cd make-4.3 1. Подготовим Make к компиляции: ./configure --prefix=/usr \ --without-guile \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) Значение новой опции конфигурации: --without-guile Несмотря на то, что мы выполняем кросс-компиляцию, configure пытается использовать хитрость с хоста сборки, если находит его. Это приводит к сбою компиляции, поэтому этот переключатель предотвращает его использование. 2. Скомпилируем пакет: make 3. Установим пакет: make DESTDIR=$LFS install |
24. Установка Patch-2.7.6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
!!! Пакет Patch содержит программу для изменения или создания файлов путем применения файла « заплаты » , обычно создаваемого программой diff . 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf patch-2.7.6.tar.xz cd patch-2.7.6 1. Подготовка к компиляции: ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) 2. Компилируем пакет: make 3. Устанавливаем пакет: make DESTDIR=$LFS install |
25. Установка Sed-4.8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
!!! https://www.linuxfromscratch.org/lfs/view/stable/chapter06/sed.html 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf sed-4.8.tar.xz cd sed-4.8 1. Подготовьте Sed для компиляции: ./configure --prefix=/usr \ --host=$LFS_TGT 2. Скомпилируйте пакет: make 3. Установите пакет: make DESTDIR=$LFS install |
26. Установка Tar-1.34
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
!!! Пакет Tar предоставляет возможность создавать tar-архивы, а также выполнять различные другие операции с архивами. !!! Tar можно использовать в ранее созданных архивах для извлечения файлов, для хранения дополнительных файлов или для обновления или списка файлов, которые уже были сохранены. 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf tar-1.34.tar.xz cd tar-1.34 1. Подготовьте Tar для компиляции: ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) 2. Скомпилируйте пакет: make 3. Установите пакет: make DESTDIR=$LFS install |
27. Установка Xz-5.2.5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
!!! Пакет Xz содержит программы для сжатия и распаковки файлов. Он предоставляет возможности для lzma и более новых форматов сжатия xz. !!! Сжатие текстовых файлов с помощью xz дает лучший процент сжатия, чем с традиционными командами gzip или bzip2 . 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf xz-5.2.5.tar.xz cd xz-5.2.5 1. Подготовьте Xz к компиляции: ./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --disable-static \ --docdir=/usr/share/doc/xz-5.2.5 2. Скомпилируйте пакет: make 3. Установите пакет: make DESTDIR=$LFS install |
28. Установка Binutils-2.38 — Прохождение 2
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 32 33 34 35 36 37 38 39 40 |
!!! Пакет Binutils содержит компоновщик, ассемблер и другие инструменты для работы с объектными файлами. 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf binutils-2.38.tar.xz cd binutils-2.38 1. Binutils поставляет устаревшую копию libtool в архиве. В нем отсутствует поддержка sysroot, поэтому созданные двоичные файлы будут ошибочно связаны с библиотеками из основного дистрибутива. Решение этой проблемы: sed '6009s/$add_dir//' -i ltmain.sh 2. Снова создайте отдельный каталог сборки: mkdir -v build cd build 3. Подготовьте Binutils к компиляции: ../configure \ --prefix=/usr \ --build=$(../config.guess) \ --host=$LFS_TGT \ --disable-nls \ --enable-shared \ --disable-werror \ --enable-64-bit-bfd Значение новых опций конфигурации: --enable-shared Создается libbfdкак общая библиотека. --enable-64-bit-bfd Включает 64-битную поддержку (на хостах с более узкими размерами слов). Может и не понадобится на 64-битных системах, но не навредит. 4. Скомпилируйте пакет: make 5. Установите пакет: make DESTDIR=$LFS install |
29. Установка GCC-11.2.0 — Pass 2
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
!!! Пакет GCC содержит коллекцию компиляторов GNU, в которую входят компиляторы C и C++. 0. Выполняем стандартные действия cd /mnt/lfs/sources/ tar -pxf gcc-11.2.0.tar.xz cd gcc-11.2.0 1. Как и в первой сборке GCC, требуются пакеты GMP, MPFR и MPC. Распакуйте архивы и переместите их в каталоги с нужными именами: tar -xf ../mpfr-4.1.0.tar.xz mv -v mpfr-4.1.0 mpfr tar -xf ../gmp-6.2.1.tar.xz mv -v gmp-6.2.1 gmp tar -xf ../mpc-1.2.1.tar.gz mv -v mpc-1.2.1 mpc 2. При сборке на x86_64 измените имя каталога по умолчанию для 64-битных библиотек на « lib » : case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64 ;; esac 3. Снова создайте отдельный каталог сборки: mkdir -v build cd build 4. Создайте символическую ссылку, позволяющую собирать libgcc с поддержкой потоков posix: mkdir -pv $LFS_TGT/libgcc ln -s ../../../libgcc/gthr-posix.h $LFS_TGT/libgcc/gthr-default.h 5. Теперь подготовьте GCC к компиляции: ../configure \ --build=$(../config.guess) \ --host=$LFS_TGT \ --prefix=/usr \ CC_FOR_TARGET=$LFS_TGT-gcc \ --with-build-sysroot=$LFS \ --enable-initfini-array \ --disable-nls \ --disable-multilib \ --disable-decimal-float \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++ Значение новых опций конфигурации: -with-build-sysroot=$LFS Обычно использование --hostгарантирует, что для сборки GCC используется кросс-компилятор, и этот компилятор знает, что он должен искать заголовки и библиотеки в файлах $LFS. Но система сборки GCC использует другие инструменты, которые не знают об этом местоположении. Этот переключатель нужен для того, чтобы они находили нужные файлы в $LFS, а не на хосте. --enable-initfini-array Этот параметр автоматически включается при сборке собственного компилятора с помощью собственного компилятора на платформе x86. Но здесь мы собираем с помощью кросс-компилятора, поэтому нам нужно явно установить эту опцию. 6. Скомпилируйте пакет: make 7. Установите пакет: make DESTDIR=$LFS install 8. В качестве последнего штриха создайте символическую ссылку на утилиту. Многие программы и сценарии запускают cc вместо gcc , который используется для того, чтобы программы оставались универсальными и, следовательно, могли использоваться во всех типах систем UNIX, где компилятор GNU C не всегда установлен. Запуск cc оставляет системному администратору свободу решать, какой компилятор C установить: ln -sv gcc $LFS/usr/bin/cc |
30. Смена владельца на каталоги
1 2 3 4 5 6 |
!!! https://www.linuxfromscratch.org/lfs/view/stable/chapter07/changingowner.html chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown -R root:root $LFS/lib64 ;; esac |
31. Подготовка к chroot
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 32 33 34 35 36 |
!!!На некоторые действия потребуется права root !!! https://www.linuxfromscratch.org/lfs/view/stable/chapter07/kernfs.html 0. Экспортируем переменную: export LFS=/mnt/lfs 1. Создаем каталоги в которые будут смонтированы файловые системы: mkdir -pv $LFS/{dev,proc,sys,run} 2. Создание начальных узлов устройств !!! Когда ядро загружает систему, ему требуется наличие нескольких узлов устройств, в частности устройств consoleи null. !!! Узлы устройств должны быть созданы на жестком диске, чтобы они были доступны до того, как заполнится ядро /dev), и, кроме того, когда Linux запускается с init=/bin/bash. mknod -m 600 $LFS/dev/console c 5 1 mknod -m 666 $LFS/dev/null c 1 3 3. Установка и заполнение /dev !!! Рекомендуемый метод заполнения /dev каталога устройствами — смонтировать виртуальную файловую систему (такую как tmpfs) !!! в /dev каталоге и разрешить динамическое создание устройств в этой виртуальной файловой системе по мере их обнаружения или доступа к ним. !!! Создание устройства обычно выполняется Udev в процессе загрузки. !!! Поскольку эта новая система еще не имеет Udev и еще не загружена, ее необходимо смонтировать и заполнить /dev вручную. !!! Это достигается путем привязки монтирования хост-системы./devкаталог. !!! Связное монтирование — это особый тип монтирования, который позволяет создать зеркало каталога или точки монтирования в другом месте. mount -v --bind /dev $LFS/dev 4. Монтирование файловых систем виртуального ядра mount -v --bind /dev/pts $LFS/dev/pts mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run !!! В некоторых хост-системах /dev/shm это символическая ссылка на /run/shm. !!! /run tmpfs был смонтирован выше, поэтому в этом случае нужно создать только каталог. if [ -h $LFS/dev/shm ]; then mkdir -pv $LFS/$(readlink $LFS/dev/shm) fi |
32. chroot
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 |
!!! Теперь, когда все пакеты, необходимые для сборки остальных необходимых инструментов, находятся в системе, пришло время войти в среду chroot, !!! чтобы завершить установку оставшихся временных инструментов. !!! Эта среда будет использоваться также для установки конечной системы. !!! От имени пользователя root выполните следующую команду, чтобы войти в среду: su - root export LFS=/mnt/lfs chown -R root:root $LFS/tools chroot "$LFS" /usr/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='(lfs chroot) \u:\w\$ ' \ PATH=/usr/bin:/usr/sbin \ /bin/bash --login !!! Опции: !!! -i, заданная команде env , очистит все переменные среды chroot. После этого снова задаются только переменные HOME, TERM, PS1 и .PATH !!! Конструкция TERM=$TERM установит для TERM переменной внутри chroot то же значение, что и вне chroot. !!! Эта переменная необходима для правильной работы таких программ, как vim и меньше. !!! Если желательны другие переменные, такие как CFLAGS или CXXFLAGS, это хорошее место, чтобы установить их снова. !!! С этого момента больше нет необходимости использовать эту LFS переменную, поскольку вся работа будет ограничена файловой системой LFS. !!! Это связано с тем, что оболочке Bash сообщается, что $LFS теперь это корневой ( /) каталог. !!! Обратите внимание, что /tools/binэто не в PATH. Это означает, что кросс-тулчейн больше не будет использоваться в среде chroot. !!! Обратите внимание, что в командной строке bash "I have no name!" будет указано, Это нормально, поскольку /etc/passwd файл еще не создан. |
34. Создание каталогов для LFS
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 |
!!! после удачного приглашения в систему !!! Пришло время создать полную структуру в файловой системе LFS. !!! Создайте несколько каталогов корневого уровня, которых нет в ограниченном наборе, требуемом в предыдущих главах, с помощью следующей команды: mkdir -pv /{boot,home,mnt,opt,srv} !!! Создайте необходимый набор подкаталогов ниже корневого уровня, выполнив следующие команды: mkdir -pv /etc/{opt,sysconfig} mkdir -pv /lib/firmware mkdir -pv /media/{floppy,cdrom} mkdir -pv /usr/{,local/}{include,src} mkdir -pv /usr/local/{bin,lib,sbin} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -pv /usr/{,local/}share/man/man{1..8} mkdir -pv /var/{cache,local,log,mail,opt,spool} mkdir -pv /var/lib/{color,misc,locate} ln -sfv /run /var/run ln -sfv /run/lock /var/lock install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp !!! Каталоги по умолчанию создаются с режимом разрешений 755, но это нежелательно для всех каталогов. !!! В приведенных выше командах вносятся два изменения: одно в домашний каталог пользователя root, а другое в каталоги для временных файлов. !!! Первое изменение режима гарантирует, что никто не сможет войти в /root каталог — так же, как обычный пользователь сделал бы со своим домашним каталогом. !!! Второе изменение режима гарантирует, что любой пользователь может записывать в каталоги /tmpи /var/tmp, но не может удалять из них файлы другого пользователя. !!! Последнее запрещено так называемым « липким битом » , старшим битом (1) в битовой маске 1777. !!! Подробнее про структуру каталогов https://refspecs.linuxfoundation.org/fhs.shtml |
35. Создание основных файлов и символических ссылок:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
0. Исторически сложилось так, что Linux поддерживает список смонтированных файловых систем в файле /etc/mtab. Современные ядра поддерживают этот список внутри себя и предоставляют его пользователю через /proc файловую систему. Чтобы удовлетворить утилиты, которые ожидают наличия /etc/mtab, создайте следующую символическую ссылку: ln -sv /proc/self/mounts /etc/mtab 1. Создайте базовый /etc/host sфайл, на который будут ссылаться некоторые наборы тестов, а также один из файлов конфигурации Perl: cat > /etc/hosts << EOF 127.0.0.1 localhost $(hostname) ::1 localhost EOF 2. Чтобы пользователь rootмог войти в систему и чтобы имя « root » было распознано, в файлах /etc/passwdи должны быть соответствующие записи./etc/group !!! Фактический пароль для root будет установлен позже. 2.1 Создайте /etc/passwdфайл, выполнив следующую команду: cat > /etc/passwd << "EOF" root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/dev/null:/usr/bin/false daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/usr/bin/false systemd-journal-remote:x:74:74:systemd Journal Remote:/:/usr/bin/false systemd-journal-upload:x:75:75:systemd Journal Upload:/:/usr/bin/false systemd-network:x:76:76:systemd Network Management:/:/usr/bin/false systemd-resolve:x:77:77:systemd Resolver:/:/usr/bin/false systemd-timesync:x:78:78:systemd Time Synchronization:/:/usr/bin/false systemd-coredump:x:79:79:systemd Core Dumper:/:/usr/bin/false uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false systemd-oom:x:81:81:systemd Out Of Memory Daemon:/:/usr/bin/false nobody:x:99:99:Unprivileged User:/dev/null:/usr/bin/false EOF 2.2 Создайте /etc/groupфайл, выполнив следующую команду: cat > /etc/group << "EOF" root:x:0: bin:x:1:daemon sys:x:2: kmem:x:3: tape:x:4: tty: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: adm:x:16: messagebus:x:18: systemd-journal:x:23: input:x:24: mail:x:34: kvm:x:61: systemd-journal-gateway:x:73: systemd-journal-remote:x:74: systemd-journal-upload:x:75: systemd-network:x:76: systemd-resolve:x:77: systemd-timesync:x:78: systemd-coredump:x:79: uuidd:x:80: systemd-oom:x:81: wheel:x:97: nogroup:x:99: users:x:999: EOF 3. Для некоторых тестов нам потребуется обычный пользователь, добавляем этого пользователяы. echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd echo "tester:x:101:" >> /etc/group install -o tester -d /home/tester 4. Чтобы удалить « У меня нет имени! » , запустите новую оболочку. Поскольку файлы /etc/passwdи /etc/groupбыли созданы, разрешение имен пользователей и групп теперь будет работать: exec /usr/bin/bash --login 5. Программы login , agetty и init (и другие) используют ряд файлов журналов для записи информации, такой как кто и когда входил в систему. Однако эти программы не будут записывать файлы журналов, если они еще не существуют. Инициализируйте файлы журнала и предоставьте им соответствующие разрешения: touch /var/log/{btmp,lastlog,faillog,wtmp} chgrp -v utmp /var/log/lastlog chmod -v 664 /var/log/lastlog chmod -v 600 /var/log/btmp !!! Файл /var/log/wtmp записывает все входы и выходы. !!! Файл /var/log/lastlog записывает, когда каждый пользователь в последний раз входил в систему. !!! Файл /var/log/faillog записывает неудачные попытки входа в систему. !!! Файл /var/log/btmp записывает неудачные попытки входа в систему. !!! В файле /run/utmp записываются пользователи, которые в данный момент вошли в систему. !!! Этот файл создается динамически в сценариях загрузки. |
36. LibstdС++ из GCC-11.2.0, проход 2
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 32 33 34 35 |
!!! Libstdc++ является частью исходников GCC. Сначала вы должны распаковать архив GCC и перейти в gcc-11.2.0 каталог. 0. Создайте ссылку, которая существует при сборке libstdc++ в дереве gcc: ln -s gthr-posix.h libgcc/gthr-default.h 1. Создайте отдельный каталог сборки для libstdc++ и введите его: mkdir -v build cd build 2. Подготовьте libstdc++ к компиляции: ../libstdc++-v3/configure \ CXXFLAGS="-g -O2 -D_GNU_SOURCE" \ --prefix=/usr \ --disable-multilib \ --disable-nls \ --host=$(uname -m)-lfs-linux-gnu \ --disable-libstdcxx-pch Значение параметров настройки: CXXFLAGS="-g -O2 -D_GNU_SOURCE" Эти флаги передаются Makefile верхнего уровня при полной сборке GCC. --host=$(uname -m)-lfs-linux-gnu Мы должны имитировать то, что произошло бы, если бы этот пакет был собран как часть полной сборки компилятора. Этот переключатель будет передан для настройки механизмом сборки GCC. --disable-libstdcxx-pch Этот переключатель предотвращает установку предварительно скомпилированных включаемых файлов, которые на данном этапе не нужны. 3. Скомпилируйте libstdc++, запустив: make 4. Установите библиотеку: make install |
37. Установка Gettext-0.21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
!!! Пакет Gettext содержит утилиты для интернационализации и локализации. !!! Это позволяет компилировать программы с помощью NLS (поддержка родного языка), что позволяет им выводить сообщения на родном языке пользователя. 0. Подготовьте Gettext для компиляции: ./configure --disable-shared Значение опции конфигурации: --disable-shared В настоящее время нам не нужно устанавливать какую-либо из общих библиотек Gettext, поэтому нет необходимости их создавать. 1. Скомпилируйте пакет: make 2. Установим программы msgfmt, msgmerge и xgettext: cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin |
38. Установка Bison-3.8.2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
!!! Пакет Bison содержит генератор парсеров. 0. Подготовьте Bison для компиляции: ./configure --prefix=/usr \ --docdir=/usr/share/doc/bison-3.8.2 Значение новой опции конфигурации: --docdir=/usr/share/doc/bison-3.8.2 Это говорит системе сборки установить документацию bison в версионный каталог. 1. Скомпилируйте пакет: make 2. Установите пакет: make install |
39. Установка Perl-5.34.0
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 |
!!! https://www.linuxfromscratch.org/lfs/downloads/stable-systemd/LFS-BOOK-11.1-NOCHUNKS.html#ch-tools-binutils-pass1 0. Подготовьте Perl к компиляции: sh Configure -des \ -Dprefix=/usr \ -Dvendorprefix=/usr \ -Dprivlib=/usr/lib/perl5/5.34/core_perl \ -Darchlib=/usr/lib/perl5/5.34/core_perl \ -Dsitelib=/usr/lib/perl5/5.34/site_perl \ -Dsitearch=/usr/lib/perl5/5.34/site_perl \ -Dvendorlib=/usr/lib/perl5/5.34/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.34/vendor_perl Значение новых опций Configure: -des Это комбинация трех параметров: -d использует значения по умолчанию для всех элементов; -e обеспечивает выполнение всех задач; -s отключает несущественный вывод. 1. Скомпилируйте пакет: make 2. Установите пакет: make install |
40. Установка Python-3.10.2
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 |
!!! Пакет Python 3 содержит среду разработки Python. !!! Он полезен для объектно-ориентированного программирования, написания сценариев, прототипирования больших программ или разработки целых приложений. !!! Есть два файла пакета, имя которых начинается с « python » . Тот, из которого нужно извлечь Python-3.10.2.tar.xz (обратите внимание на первую букву в верхнем регистре). 0. Подготовьте Python к компиляции: ./configure --prefix=/usr \ --enable-shared \ --without-ensurepip Значение опции конфигурации: --enable-shared Этот переключатель предотвращает установку статических библиотек. --without-ensurepip Этот переключатель отключает установщик пакета Python, который на данном этапе не нужен. 1. Скомпилируйте пакет: make !!! Некоторые модули Python 3 сейчас не могут быть собраны, потому что зависимости еще не установлены. !!! Однако система сборки по-прежнему пытается их собрать, поэтому компиляция некоторых файлов завершится ошибкой, и может показаться, что сообщение компилятора указывает на «фатальную ошибку». !!! Сообщение следует игнорировать. !!! Просто убедитесь, что команда make верхнего уровня не завершилась ошибкой. 2. Установите пакет: make install |
41. Установка Texinfo-6.8
1 2 3 4 5 6 7 8 9 10 11 12 |
0. Во-первых, устраните проблему со сборкой пакета с помощью Glibc-2.34 или более поздней версии: sed -e 's/__attribute_nonnull__/__nonnull/' \ -i gnulib/lib/malloc/dynarray-skeleton.c 1. Подготовьте Texinfo к компиляции: ./configure --prefix=/usr 2. Скомпилируйте пакет: make 3. Установите пакет: make install |
42. Установка Util-linux-2.37.4:
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 32 33 34 35 36 37 38 39 |
!!! Пакет Util-linux содержит различные утилиты. 0. FHS рекомендует использовать /var/lib/hwclock каталог вместо обычного /etc каталога в качестве места для adjti meфайла. Создайте этот каталог с помощью: mkdir -pv /var/lib/hwclock Подготовьте Util-linux к компиляции: ./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \ --libdir=/usr/lib \ --docdir=/usr/share/doc/util-linux-2.37.4 \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --without-python \ runstatedir=/run Значение параметров настройки: ADJTIME_PATH=/var/lib/hwclock/adjtime Это устанавливает расположение файла записи информации об аппаратных часах в соответствии с FHS. Это не обязательно для этого временного инструмента, но предотвращает создание файла в другом месте, который не будет перезаписан или удален при сборке окончательного пакета util-linux. --libdir=/usr/lib Этот переключатель гарантирует, что .soсимволические ссылки будут напрямую указывать на файл общей библиотеки в том же каталоге ( /usr/lib). --disable-* Эти переключатели предотвращают появление предупреждений о сборке компонентов, для которых требуются пакеты, отсутствующие в LFS или еще не установленные. --without-python Этот переключатель отключает использование Python . Это позволяет избежать попыток создания ненужных привязок. runstatedir=/run Этот переключатель правильно устанавливает местоположение сокета, используемого uuiddlibuuid. 1. Скомпилируйте пакет: make 2. Установите пакет: make install |
42. Очистка и сохранение временной системы:
1 2 3 4 5 6 7 8 9 10 11 12 |
0. Во-первых, удалите текущую установленную документацию, чтобы предотвратить их попадание в окончательную систему и сэкономить около 35 МБ: rm -rf /usr/share/{info,man,doc}/* 1. Во-вторых, файлы libtool .la полезны только при компоновке статических библиотек. Они не нужны и потенциально опасны при использовании динамических разделяемых библиотек, особенно при использовании систем сборки, отличных от autotools. Пока еще в chroot, удалите эти файлы сейчас: find /usr/{lib,libexec} -name \*.la -delete 2. Текущий размер системы составляет около 3 ГБ, однако каталог /tools больше не нужен. Он использует около 1 ГБ дискового пространства. Удалите его сейчас: rm -rf /tools |
43. Резервное копирование
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
!!! На данный момент основные программы и библиотеки созданы, и ваша текущая система LFS находится в хорошем состоянии. !!! В случае фатальных сбоев в последующих главах часто оказывается, что удалить все и начать заново (более осторожно) — лучший вариант восстановления. 0. Мы решили сделать резервную копию, покинем среду chroot: exit 1. Перед созданием резервной копии размонтируйте виртуальные файловые системы: umount $LFS/dev/pts umount $LFS/{sys,proc,run,dev} 2. Убедитесь, что у вас есть как минимум 1 ГБ свободного места на диске (исходные tar-архивы будут включены в архив резервной копии) в файловой системе, содержащей каталог, в котором вы создаете архив резервной копии. df -h 3. Выполняем резервирование: export LFS=/mnt/lfs cd $LFS tar -cJpf $HOME/lfs-temp-tools-11.1-systemd.tar.xz . 4. В каталоге /root должен появится архив |
43. Пример восстановления из резервной копии:
1 2 3 4 5 6 7 |
!!! Предупреждение !!! Следующие команды чрезвычайно опасны. !!! Если вы запустите rm -rf ./* от имени пользователя root и не перейдете в каталог $LFS или LFS не установите переменную среды для пользователя root, это разрушит всю вашу хост-систему. !!! ВЫ ПРЕДУПРЕЖДЕНЫ. cd $LFS rm -rf ./* tar -xpf $HOME/lfs-temp-tools-11.1-systemd.tar.xz |
44. Для продолжения работы с LFS нам снова требуется выполнить chroot:
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 |
!!! это шаги 31 и 32 0. Установка и заполнение /dev !!! Рекомендуемый метод заполнения /dev каталога устройствами — смонтировать виртуальную файловую систему (такую как tmpfs) !!! в /dev каталоге и разрешить динамическое создание устройств в этой виртуальной файловой системе по мере их обнаружения или доступа к ним. !!! Создание устройства обычно выполняется Udev в процессе загрузки. !!! Поскольку эта новая система еще не имеет Udev и еще не загружена, ее необходимо смонтировать и заполнить /dev вручную. !!! Это достигается путем привязки монтирования хост-системы./devкаталог. !!! Связное монтирование — это особый тип монтирования, который позволяет создать зеркало каталога или точки монтирования в другом месте. mount -v --bind /dev $LFS/dev 1. Монтирование файловых систем виртуального ядра mount -v --bind /dev/pts $LFS/dev/pts mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run !!! В некоторых хост-системах /dev/shm это символическая ссылка на /run/shm. !!! /run tmpfs был смонтирован выше, поэтому в этом случае нужно создать только каталог. if [ -h $LFS/dev/shm ]; then mkdir -pv $LFS/$(readlink $LFS/dev/shm) fi 2. Выполняем chroot chroot "$LFS" /usr/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='(lfs chroot) \u:\w\$ ' \ PATH=/usr/bin:/usr/sbin \ /bin/bash --login |
45. Установим Man-pages-5.13:
1 2 |
!!! Пакет Man-pages содержит более 2200 справочных страниц. make prefix=/usr install |
46. Установка Iana-etc-20220207:
1 2 3 4 5 6 7 8 |
!!! Пакет Iana-Etc предоставляет данные для сетевых служб и протоколов. cp services protocols /etc Краткие описания: /etc/protocols Описывает различные интернет-протоколы DARPA, доступные из подсистемы TCP/IP. /etc/services Обеспечивает сопоставление между понятными текстовыми именами для интернет-сервисов и их базовыми назначенными номерами портов и типами протоколов. |
47. Установка Glibc-2.35
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
!!! Некоторые программы Glibc используют /var/dbкаталог, не совместимый с FHS, для хранения своих данных времени выполнения. 0. Примените следующий патч, чтобы такие программы хранили свои данные времени выполнения в местах, совместимых с FHS: patch -Np1 -i ../glibc-2.35-fhs-1.patch 1. Документация Glibc рекомендует собирать Glibc в выделенном каталоге сборки: mkdir -v build cd build 2. Убедитесь, что утилиты ldconfig и sln будут установлены в /usr/sbin: echo "rootsbindir=/usr/sbin" > configparms 3. Подготовьте Glibc к компиляции: ../configure --prefix=/usr \ --disable-werror \ --enable-kernel=3.2 \ --enable-stack-protector=strong \ --with-headers=/usr/include \ libc_cv_slibdir=/usr/lib Значение параметров настройки: --disable-werror Этот параметр отключает параметр -Werror, передаваемый в GCC. Это необходимо для запуска набора тестов. --enable-kernel=3.2 Эта опция сообщает системе сборки, что этот glibc может использоваться с ядрами версии 3.2. Это означает создание обходных путей на случай, если системный вызов, представленный в более поздней версии, нельзя будет использовать. --enable-stack-protector=strong Этот параметр повышает безопасность системы за счет добавления дополнительного кода для проверки переполнения буфера, например атак, разрушающих стек. --with-headers=/usr/include Эта опция сообщает системе сборки, где найти заголовки API ядра. libc_cv_slibdir=/usr/lib Эта переменная устанавливает правильную библиотеку для всех систем. Мы не хотим, чтобы использовалась lib64. 4. Скомпилируйте пакет: !!! Важный !!! В этом разделе набор тестов для Glibc считается критически важным. Ни в коем случае не пропускайте его. make 5. Вообще несколько тестов не проходят. Ошибки тестирования, перечисленные ниже, обычно можно безопасно игнорировать. make check Вы можете увидеть некоторые неудачные тесты. Набор тестов Glibc в некоторой степени зависит от хост-системы. Несколько отказов из более чем 4200 тестов вообще можно игнорировать. Это список наиболее распространенных проблем последних версий LFS: Известно, что io/tst-lchmod не работает в среде chroot LFS. Известно, что misc/tst-ttyname не работает в среде chroot LFS. Известно , что тест nss/tst-nss-files-hosts-multi завершается неудачно, если в системе нет IP-адресов без замыкания на себя. 6. Хотя это безобидное сообщение, на этапе установки Glibc будет жаловаться на отсутствие /etc/ld.so.conf. Предотвратите это предупреждение с помощью: touch /etc/ld.so.conf 7. Исправьте Makefile, чтобы пропустить ненужную проверку работоспособности, которая не работает в частичной среде LFS: sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile 8. Установите пакет: make install 9. Исправьте жестко заданный путь к исполняемому загрузчику в скрипте ldd: sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd 10. Установите файл конфигурации и каталог времени выполнения для nscd: cp -v ../nscd/nscd.conf /etc/nscd.conf mkdir -pv /var/cache/nscd 11. Установите файлы поддержки systemd для nscd: install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf install -v -Dm644 ../nscd/nscd.service /usr/lib/systemd/system/nscd.service 12. Затем установите локали, которые могут заставить систему отвечать на другом языке. mkdir -pv /usr/lib/locale localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8 localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i de_DE -f UTF-8 de_DE.UTF-8 localedef -i el_GR -f ISO-8859-7 el_GR localedef -i en_GB -f ISO-8859-1 en_GB localedef -i en_GB -f UTF-8 en_GB.UTF-8 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 en_US -f UTF-8 en_US.UTF-8 localedef -i es_ES -f ISO-8859-15 es_ES@euro 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 fr_FR -f UTF-8 fr_FR.UTF-8 localedef -i is_IS -f ISO-8859-1 is_IS localedef -i is_IS -f UTF-8 is_IS.UTF-8 localedef -i it_IT -f ISO-8859-1 it_IT localedef -i it_IT -f ISO-8859-15 it_IT@euro localedef -i it_IT -f UTF-8 it_IT.UTF-8 localedef -i ja_JP -f EUC-JP ja_JP localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true localedef -i ja_JP -f UTF-8 ja_JP.UTF-8 localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 localedef -i se_NO -f UTF-8 se_NO.UTF-8 localedef -i ta_IN -f UTF-8 ta_IN.UTF-8 localedef -i tr_TR -f UTF-8 tr_TR.UTF-8 localedef -i zh_CN -f GB18030 zh_CN.GB18030 localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS localedef -i zh_TW -f UTF-8 zh_TW.UTF-8 13. В качестве альтернативы можно установить glibc-2.35/localedata/SUPPORTEDсразу все локали, перечисленные в файле (включая все перечисленные выше локали и многие другие), с помощью следующей трудоемкой команды: make localedata/install-locales 14. Затем используйте команду localedef для создания и установки локалей, не перечисленных в glibc-2.35/localedata/SUPPORTEDфайле, когда они вам понадобятся. Например, для некоторых тестов далее в этой главе потребуются следующие две локали: localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true |
48. Configuring Glibc adding nsswitch.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
cat > /etc/nsswitch.conf << "EOF" # Begin /etc/nsswitch.conf passwd: files group: files shadow: files hosts: files dns networks: files protocols: files services: files ethers: files rpc: files # End /etc/nsswitch.conf EOF |
49. Configuring Glibc adding time zone data:
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 32 33 34 35 |
0. Установите и настройте данные часового пояса со следующим: tar -xf ../../tzdata2021e.tar.gz ZONEINFO=/usr/share/zoneinfo mkdir -pv $ZONEINFO/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica \ asia australasia backward; do zic -L /dev/null -d $ZONEINFO ${tz} zic -L /dev/null -d $ZONEINFO/posix ${tz} zic -L leapseconds -d $ZONEINFO/right ${tz} done cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p America/New_York unset ZONEINFO Значение команд zic: zic -L /dev/null ... Это создает часовые пояса posix без дополнительных секунд. Обычно их помещают в оба zoneinfoи zoneinfo/posix. Необходимо поставить часовые пояса POSIX в zoneinfo, иначе различные тестовые наборы будут сообщать об ошибках. Во встроенной системе, где места мало и вы не собираетесь когда-либо обновлять часовые пояса, вы можете сэкономить 1,9 МБ, не используя posix каталог, но некоторые приложения или наборы тестов могут привести к некоторым сбоям. zic -L leapseconds ... Это создает правильные часовые пояса, включая дополнительные секунды. Во встроенной системе, где места мало и вы не собираетесь когда-либо обновлять часовые пояса или заботиться о правильном времени, вы можете сэкономить 1,9 МБ, исключив right каталог. zic ... -p ... Это создает posixrulesфайл. Мы используем Нью-Йорк, потому что POSIX требует, чтобы правила перехода на летнее время соответствовали правилам США. 1. Один из способов определить местный часовой пояс — запустить следующий скрипт: tzselect 2. Затем создайте /etc/localtimeфайл, запустив: ln -sfv /usr/share/zoneinfo/<xxx> /etc/localtime |
50. Настройка динамического загрузчика
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
!!! По умолчанию динамический загрузчик ( ) выполняет /lib/ld-linux.so.2 поиск динамических библиотек, которые необходимы программам по мере их запуска. !!! Однако, если есть библиотеки в каталогах, отличных от и , их необходимо добавить в файл, чтобы динамический загрузчик мог их найти. !!! Два каталога, которые, как известно, содержат дополнительные библиотеки, это и , поэтому добавьте эти каталоги в путь поиска динамического загрузчика. !!! /lib/usr/lib/lib/usr/lib/etc/ld.so.conf/usr/local/lib/opt/lib 0. Создайте новый файл /etc/ld.so.conf, выполнив следующее: cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib EOF 1. При желании динамический загрузчик также может искать каталог и включать содержимое найденных там файлов. Обычно файлы в этом каталоге include представляют собой одну строку, указывающую путь к нужной библиотеке. Чтобы добавить эту возможность, выполните следующие команды: cat >> /etc/ld.so.conf << "EOF" # Add an include directory include /etc/ld.so.conf.d/*.conf EOF mkdir -pv /etc/ld.so.conf.d |
Промежуточный этап про сеть
1 2 |
wget http://roy.marples.name/downloads/dhcpcd/dhcpcd-9.4.1.tar.xz --directory-prefix=$LFS/sources wget https://www.linuxfromscratch.org/blfs/downloads/11.1/blfs-bootscripts-20210826.tar.xz --directory-prefix=$LFS/sources/ |
51. Содержимое Glibc
|