software:linux_server:iso_lfs_server:iso_lfs_server
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| software:linux_server:iso_lfs_server:iso_lfs_server [2026/05/13 19:04] – [Создание структуры папок /lfs-builder (packages, sources, logs, scripts).] VladPolskiy | software:linux_server:iso_lfs_server:iso_lfs_server [2026/05/14 20:18] (текущий) – [День 4: Кросс-компилятор (Глава 5 LFS).] VladPolskiy | ||
|---|---|---|---|
| Строка 387: | Строка 387: | ||
| ===== Создание структуры папок / | ===== Создание структуры папок / | ||
| Папки **lfs** и **lfs-builder** с подкаталогами **packages**, | Папки **lfs** и **lfs-builder** с подкаталогами **packages**, | ||
| + | ==== Каталог / | ||
| + | **%%/ | ||
| + | === Суть этой папки: === | ||
| + | * **Рабочее пространство**: | ||
| + | * **Изоляция: | ||
| + | * **Содержимое: | ||
| + | * **%%sources: | ||
| + | * **%%tools: | ||
| + | * **%%bin, etc, lib, usr и т.д.:%%** Корневая файловая система будущей новой ОС.В контексте сборки LFS, переменная окружения LFS указывает на эту папку, чтобы все команды выполнялись внутри нее, например: | ||
| === Назначение папок === | === Назначение папок === | ||
| * **%%sources/ | * **%%sources/ | ||
| Строка 392: | Строка 401: | ||
| * **%%packages/ | * **%%packages/ | ||
| * **%%logs/ | * **%%logs/ | ||
| - | ==== Создаем папку | + | ==== Создаем папку |
| Команда **%%mkdir -pv ~/ | Команда **%%mkdir -pv ~/ | ||
| <code bash #bash> | <code bash #bash> | ||
| Строка 437: | Строка 446: | ||
| {{: | {{: | ||
| </ | </ | ||
| + | ==== Создаем каталоги / | ||
| + | Флаг **%%-p%%** создаст всю цепочку папок, если родительский каталог **%%/ | ||
| + | <code bash #bash> | ||
| + | mkdir -p / | ||
| + | </ | ||
| + | В нашем случае Флаг **%%-p%%** опускаем | ||
| + | <code bash #bash> | ||
| + | mkdir / | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Установка полных прав для владельца (**не root**) (чтение, | ||
| + | <code bash #bash> | ||
| + | sudo chmod -R 755 / | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | === Проверка результата=== | ||
| + | Убедиться, | ||
| + | <code bash #bash> | ||
| + | ls -la / | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | В выводе вы должны увидеть, | ||
| + | Права вида **drwxwxrwx** означают максимальный (полный) уровень доступа к каталогу для абсолютно всех пользователей в системе.\\ | ||
| + | Для папок проекта **%%/ | ||
| + | * **Плюс: | ||
| + | * **Минус: | ||
| + | |||
| - | ===== config.conf ===== | + | ===== Файл |
| Файл **config.conf** — это текстовый файл **конфигурации (настроек)**, | Файл **config.conf** — это текстовый файл **конфигурации (настроек)**, | ||
| === Что обычно находится внутри config.conf === | === Что обычно находится внутри config.conf === | ||
| Строка 480: | Строка 522: | ||
| </ | </ | ||
| - | ===== download.sh ===== | + | ===== Файл |
| Файл **download.sh** — это скрипт автоматизации на языке Bash, предназначенный для скачивания пакетов исходного кода (тарболов **%%.tar.gz, | Файл **download.sh** — это скрипт автоматизации на языке Bash, предназначенный для скачивания пакетов исходного кода (тарболов **%%.tar.gz, | ||
| ===Что делает этот скрипт=== | ===Что делает этот скрипт=== | ||
| Строка 496: | Строка 538: | ||
| wget --input-file=wget-list --continue --directory-prefix=$LFS/ | wget --input-file=wget-list --continue --directory-prefix=$LFS/ | ||
| </ | </ | ||
| + | Ссылка на рабочий репозиторий **[[https:// | ||
| + | <code bash #bash> | ||
| + | wget https:// | ||
| + | </ | ||
| + | Чистый рабочий скрипт **download.sh** с правильным URL\\ | ||
| + | Скопируйте этот блок кода целиком и вставьте его правой кнопкой мыши в консоль PuTTy (находясь в папке **%%~/ | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | #!/bin/bash | ||
| + | source ./ | ||
| + | URL=" | ||
| + | |||
| + | PACKAGES=( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | mkdir -pv " | ||
| + | cd " | ||
| + | |||
| + | for pkg in " | ||
| + | wget --continue " | ||
| + | done | ||
| + | EOF | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | ==== Запуск конвейера ==== | ||
| + | Выполните команды очистки, | ||
| <code bash #bash> | <code bash #bash> | ||
| - | wget https://ftp.clfs.org/pub/ | + | # Переход в рабочую директорию |
| + | cd ~/lfs-builder | ||
| + | # | ||
| + | sed -i 's/\r$//' download.sh | ||
| + | # Выдача прав на выполнение | ||
| + | chmod +x download.sh | ||
| + | # Запуск скрипта загрузки | ||
| + | bash ./download.sh | ||
| </ | </ | ||
| - | ====== | + | <note shadow> |
| - | ===== Написание | + | {{: |
| - | ===== Создание скрипта download.sh | + | </ |
| - | ===== Проверка | + | Скрипт начнет массово скачивать из интернета архивы (например, |
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | ==== Анализ и зачистка папки источников | ||
| + | Запустим следубщую команду | ||
| + | <code bash #bash> | ||
| + | ls -lh / | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Выведем список всех файлов в вашей целевой директории с отображением их реальных размеров: | ||
| + | * Любые файлы с именем index.html* (это ошибочно | ||
| + | * Ошибочный файл списка wget-list, если он остался со старыми HTML-тегами. | ||
| + | * Другую версию binutils-2.44.tar.gz (мы строим систему строго | ||
| + | Команда для гарантированной зачистки мусора: | ||
| + | <code bash #bash> | ||
| + | rm -fv / | ||
| + | rm -fv / | ||
| + | </ | ||
| + | ====Проверка целостности базовой тройки | ||
| + | Убедитесь, что три главных кита нашей будущей системы скачались | ||
| + | * **binutils-2.42.tar.xz** — должен весить | ||
| + | * **gcc-13.2.0.tar.xz** — должен | ||
| + | * **glibc-2.39.tar.xz** — должен весить около **18 МБ**. | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | ====Запуск вашего эталонного скрипта==== | ||
| + | Теперь, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | # Запускаем конвейер | ||
| + | bash ./download.sh | ||
| + | </ | ||
| + | Благодаря флагу **%%--continue%%** | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | ====Финальная проверка количества файлов==== | ||
| + | Давайте убедимся, | ||
| + | <code bash #bash> | ||
| + | ls -1 / | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Цифра в терминале должна быть в районе 90 (91-93 файла вместе с системными патчами).\\ | ||
| + | //91 файл на скриншоте — это идеальный, | ||
| + | |||
| + | |||
| + | |||
| ====== День 3: Двигатель (Build Engine). ====== | ====== День 3: Двигатель (Build Engine). ====== | ||
| ===== Написание главного скрипта build.sh.Реализация логики логирования и обработки ошибок (чтобы сборка останавливалась при ошибке make). ===== | ===== Написание главного скрипта build.sh.Реализация логики логирования и обработки ошибок (чтобы сборка останавливалась при ошибке make). ===== | ||
| - | ====== День 4: Кросс-компилятор (Глава 5 LFS). ====== | + | Главный скрипт **build.sh** берет на себя автоматическую распаковку, |
| + | Выполните в консоли для создания движка: | ||
| + | <code bash build.sh> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | set -o pipefail | ||
| + | |||
| + | # Автоматически определяем корень проекта относительно самого скрипта | ||
| + | LFS_BUILDER_ROOT="$(cd " | ||
| + | |||
| + | # Загружаем конфигурацию из корня | ||
| + | if [ -f " | ||
| + | source " | ||
| + | else | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Проверка переданных аргументов | ||
| + | if [ -z " | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | ARCHIVE=" | ||
| + | PACK_SCRIPT=" | ||
| + | PKG_NAME=$(basename " | ||
| + | LOG_FILE=" | ||
| + | |||
| + | echo "=== Запуск сборки пакета: | ||
| + | echo " | ||
| + | |||
| + | # Переход в рабочую область исходников (из config.conf) | ||
| + | cd " | ||
| + | |||
| + | # Распаковка тарболла | ||
| + | echo " | ||
| + | case " | ||
| + | *.tar.gz|*.tgz) | ||
| + | *.tar.xz|*.txz) | ||
| + | *.tar.bz2|*.tbz2) tar -f " | ||
| + | *) echo " | ||
| + | esac | ||
| + | |||
| + | # Определение имени созданной папки | ||
| + | SRC_DIR=$(ls -td */ | head -n1) | ||
| + | cd " | ||
| + | echo " | ||
| + | |||
| + | # Выполнение скрипта сборки с логированием | ||
| + | set +e | ||
| + | bash " | ||
| + | EXIT_CODE=${PIPESTATUS[0]} | ||
| + | set -e | ||
| + | |||
| + | # Очистка рабочей папки | ||
| + | cd " | ||
| + | echo " | ||
| + | rm -rf " | ||
| + | |||
| + | if [ $EXIT_CODE -eq 0 ]; then | ||
| + | echo "=== [УСПЕХ] Пакет $PKG_NAME собран успешно! ===" | ||
| + | else | ||
| + | echo "=== [ОШИБКА] Сбой при сборке $PKG_NAME. См. лог: $LOG_FILE ===" | ||
| + | exit $EXIT_CODE | ||
| + | fi | ||
| + | EOF | ||
| + | |||
| + | # Делаем скрипт исполняемым | ||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Для наведения идеального порядка переместим все управляющие скрипты в предназначенную для них директорию **scripts**, | ||
| + | ===Исправление структуры и перенос файлов=== | ||
| + | Выполните эти команды последовательно, | ||
| + | <code bash #bash> | ||
| + | # Удаляем ошибочную циклическую ссылку | ||
| + | rm -f ~/ | ||
| + | |||
| + | # Переносим скрипт загрузки в правильное место | ||
| + | mv ~/ | ||
| + | |||
| + | # Переносим главный движок сборки в папку скриптов (если он уже был создан в корне) | ||
| + | [ -f ~/ | ||
| + | </ | ||
| + | файл **config.conf** обязательно оставляем в корне директории **%%~/ | ||
| + | Почему это правильно: | ||
| + | **Глобальная точка настройки: | ||
| + | **Доступность: | ||
| + | ==== Проверка содержимого config.conf ==== | ||
| + | Чтобы на Дне | ||
| + | |||
| + | <code bash #bash> | ||
| + | cat ~/ | ||
| + | </ | ||
| + | |||
| + | В вашем текущем файле config.conf на скриншоте есть критическая ошибка в путях, которая сломает сборку на первом же пакете.\\ | ||
| + | ⚠️ В чем заключается критическая ошибка: | ||
| + | У вас указано: | ||
| + | 🛠️ | ||
| + | Привести config.conf к реальной | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | export LFS=/ | ||
| + | export LFS_TGT=x86_64-lfs-linux-gnu | ||
| + | export MAKEFLAGS=" | ||
| + | |||
| + | # Исправленные пути | ||
| + | export LFS_BUILDER=/ | ||
| + | export SOURCES=$LFS_BUILDER/ | ||
| + | export LOGS=$LFS_BUILDER/ | ||
| + | |||
| + | mkdir -pv $LOGS | ||
| + | EOF | ||
| + | </ | ||
| + | 1. Применение | ||
| + | Запустите команду в терминале для перезаписи config.conf: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | # Путь к новой системе | ||
| + | export LFS=/ | ||
| + | |||
| + | # Параметры кросс-компиляции | ||
| + | export LFS_TGT=x86_64-lfs-linux-gnu | ||
| + | |||
| + | # Ускорение сборки | ||
| + | export MAKEFLAGS=" | ||
| + | |||
| + | # Пути к исходникам и логам в домашней папке eva | ||
| + | export LFS_BUILDER=/ | ||
| + | export SOURCES=$LFS_BUILDER/ | ||
| + | export LOGS=$LFS_BUILDER/ | ||
| + | |||
| + | # Создаем папку для логов, если её нет | ||
| + | mkdir -pv $LOGS | ||
| + | EOF | ||
| + | </ | ||
| + | |||
| + | 1. Скачивание точного файла MD5-суммВыполните команду для принудительного скачивания оригинального файла сумм от LFS 12.1: | ||
| + | <code bash #bash> | ||
| + | curl -s linuxfromscratch.org > ~/ | ||
| + | </ | ||
| + | |||
| + | 1. Создание скрипта-валидатора | ||
| + | <code bash #bash> | ||
| + | |||
| + | </ | ||
| + | |||
| + | 2. Первая проверка структуры\\ | ||
| + | Убедитесь, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | |||
| + | Так как файлы у вас физически присутствуют на диске / | ||
| + | ===== Запуск компиляции (День 4) ===== | ||
| + | Выполните в терминале команду для старта сборки первого прохода Binutils: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | Что произойдет после нажатия Enter: | ||
| + | * Движок build.sh автоматически перейдет в / | ||
| + | * Распакует архив binutils-2.42.tar.xz. | ||
| + | * Создаст изолированную директорию build. | ||
| + | * Запустит конфигурацию и компиляцию в соответствии с флагами параллелизма -j$(nproc). | ||
| + | * Установит готовый кросс-компилятор в каталог / | ||
| + | * Полностью очистит за собой временные исходники и выведет статус [УСПЕХ] | ||
| + | ****************************************** | ||
| + | На скриншоте видна ошибка синтаксиса утилиты tar: tar: option requires an argument -- ' | ||
| + | ****************************************** | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | set -o pipefail | ||
| + | |||
| + | LFS_BUILDER_ROOT=" | ||
| + | |||
| + | if [ -f " | ||
| + | source " | ||
| + | else | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | if [ -z " | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | ARCHIVE=" | ||
| + | PACK_SCRIPT=" | ||
| + | PKG_NAME=$(basename " | ||
| + | LOG_FILE=" | ||
| + | |||
| + | echo "=== Запуск сборки пакета: | ||
| + | echo " | ||
| + | |||
| + | cd " | ||
| + | |||
| + | echo " | ||
| + | if [ ! -f " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Универсальная и безопасная распаковка tar | ||
| + | tar -xf " | ||
| + | |||
| + | # Фиксируем точное имя созданной папки | ||
| + | SRC_DIR=$(ls -td */ | grep -v " | ||
| + | |||
| + | cd " | ||
| + | echo " | ||
| + | |||
| + | set +e | ||
| + | bash " | ||
| + | EXIT_CODE=${PIPESTATUS} | ||
| + | set -e | ||
| + | |||
| + | cd " | ||
| + | echo " | ||
| + | rm -rf " | ||
| + | |||
| + | if [ $EXIT_CODE -eq 0 ]; then | ||
| + | echo "=== [УСПЕХ] Пакет $PKG_NAME собран успешно! ===" | ||
| + | else | ||
| + | echo "=== [ОШИБКА] Сбой при сборке $PKG_NAME. См. лог: $LOG_FILE ===" | ||
| + | exit $EXIT_CODE | ||
| + | fi | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | ********************************************************************** | ||
| + | 2. Повторный старт Дня 4Теперь синтаксис распаковщика полностью исправлен. Запускайте компиляцию: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | |||
| + | Отлично, | ||
| + | \\ | ||
| + | 1. Создание папки и запись скрипта Binutils (Pass 1)Выполните команду, | ||
| + | \\ | ||
| + | <code bash #bash> | ||
| + | mkdir -p ~/ | ||
| + | |||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | ../ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make install | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | 2. Запись скрипта GCC (Pass 1)Сразу подготовим и второй файл, чтобы он гарантированно был на месте: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | tar -xf ../ | ||
| + | tar -xf ../ | ||
| + | tar -xf ../ | ||
| + | |||
| + | case $(uname -m) in | ||
| + | x86_64) | ||
| + | sed -e '/ | ||
| + | -i.bak gcc/ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | ../ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make install | ||
| + | |||
| + | cd .. | ||
| + | cat gcc/ | ||
| + | $(dirname $($LFS/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | 3. Повторный запуск первой компиляцииТеперь, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | Сработало!!! все ввыше исправить! | ||
| + | *************************************************** | ||
| + | =====🚀 Шаг 2: Сборка GCC (Pass 1)===== | ||
| + | Скрипт сборки 002-gcc-p1.sh мы уже создали и сделали исполняемым на предыдущем этапе. Теперь запускаем компиляцию аналогичным образом через наш движок. | ||
| + | |||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | Важно: Сборка GCC — это самый длительный процесс первого этапа кросс-компиляции. Она займет значительно больше времени, | ||
| + | Вы можете открыть второе окно терминала и следить за ходом компиляции в реальном времени с помощью команды: | ||
| + | |||
| + | ===== 🚀 Шаг 3: Установка Linux API Headers ===== | ||
| + | 1. Физическое создание скрипта Linux API Headers (Пакет 003)\\ | ||
| + | Выполните команду в терминале, | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Гарантируем, | ||
| + | mkdir -pv $LFS/ | ||
| + | |||
| + | # Очищаем дерево исходников ядра | ||
| + | make mrproper | ||
| + | |||
| + | # Генерируем и переносим заголовочные файлы | ||
| + | make headers | ||
| + | find usr/include -type f ! -name ' | ||
| + | cp -rv usr/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | Этот этап выполняется очень быстро, | ||
| + | |||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | |||
| + | ====2. Физическое создание скрипта Glibc (Пакет 004)==== | ||
| + | Запишем сценарий для сборки системной библиотеки C: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Создаем необходимые ссылки для динамического линкера | ||
| + | mkdir -pv $LFS/lib $LFS/ | ||
| + | |||
| + | case $(uname -m) in | ||
| + | i?86) ln -sfv ld-linux.so.2 $LFS/ | ||
| + | ;; | ||
| + | x86_64) ln -sfv ../ | ||
| + | ln -sfv ../ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | # Применяем обязательный патч LHS/FHS | ||
| + | patch -Np1 -i ../ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | ../ | ||
| + | --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --enable-kernel=4.19 \ | ||
| + | --with-headers=$LFS/ | ||
| + | libc_cv_slibdir=/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | # Корректируем пути утилиты ldd | ||
| + | sed '/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | ====3. Повторный запуск шагов==== | ||
| + | Теперь файлы гарантированно находятся в папке packages/ [12.1]. | ||
| + | \\ Перезапустите конвейер: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | ====Запуск Glibc: | ||
| + | (Запускайте строго после успешного завершения предыдущего шага) | ||
| + | <code bash #bash> | ||
| + | ./ | ||
| + | </ | ||
| + | ====🔍 Чтение лога ошибок==== | ||
| + | Выполните команду поиска строки error: в лог-файле сборки Glibc, чтобы вывести контекст сбоя (5 строк до и после ошибки): | ||
| + | <code bash #bash> | ||
| + | grep -n -C 5 " | ||
| + | </ | ||
| + | ===🛠️ Как это обычно лечится в Glibc 2.39=== | ||
| + | Чаще всего в этой точке компилятор спотыкается на оптимизациях или проверках строк (-Werror=stringop-overflow).Пока вы проверяете лог, мы можем превентивно обновить скрипт packages/ | ||
| + | Диагноз подтвердился на 100%. Ошибка error: ' | ||
| + | ===🛠️ Перезапись исправленного скрипта packages/ | ||
| + | Выполните эту команду, | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | mkdir -pv $LFS/lib $LFS/ | ||
| + | |||
| + | case $(uname -m) in | ||
| + | i?86) ln -sfv ld-linux.so.2 $LFS/ | ||
| + | ;; | ||
| + | x86_64) ln -sfv ../ | ||
| + | ln -sfv ../ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | patch -Np1 -i ../ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | # Добавляем принудительное отключение ошибок атрибутов через CFLAGS и конфигуратор | ||
| + | ../ | ||
| + | --prefix=/usr \ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --enable-kernel=4.19 \ | ||
| + | --with-headers=$LFS/ | ||
| + | libc_cv_slibdir=/usr/lib \ | ||
| + | libc_cv_include_x86_isa_level=no | ||
| + | |||
| + | # Компилируем, | ||
| + | make $MAKEFLAGS CFLAGS=" | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | sed '/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | |||
| + | ===🚀 Повторный запуск сборки Glibc=== | ||
| + | Запустите сборку заново. Движок сам очистит старые неудачные исходники, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | Вторая ошибка еще более специфическая: | ||
| + | ==Почему это произошло== | ||
| + | Система сборки Glibc принудительно сбрасывает или переопределяет переменную CFLAGS, которую мы передали через make CFLAGS=" | ||
| + | ===🛠️ Окончательное исправление скрипта packages/ | ||
| + | Мы внесем флаги оптимизации -O2 и отключение жестких предупреждений прямо в тело вызова ../ | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | mkdir -pv $LFS/lib $LFS/ | ||
| + | |||
| + | case $(uname -m) in | ||
| + | i?86) ln -sfv ld-linux.so.2 $LFS/ | ||
| + | ;; | ||
| + | x86_64) ln -sfv ../ | ||
| + | ln -sfv ../ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | patch -Np1 -i ../ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | # Передаем правильные флаги компиляции как переменные для configure | ||
| + | CFLAGS=" | ||
| + | ../ | ||
| + | --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --enable-kernel=4.19 \ | ||
| + | --with-headers=$LFS/ | ||
| + | libc_cv_slibdir=/ | ||
| + | libc_cv_include_x86_isa_level=no | ||
| + | |||
| + | # Запускаем чистый make без переопределения CFLAGS вручную | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | sed '/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | ===🚀 Повторный запуск сборки Glibc=== | ||
| + | Запустите процесс компиляции заново: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | Мы действительно на самом пороге победы над базовым кросс-компилятором! Скрипт вернулся к первой ошибке в wctomb.c, потому что система конфигурации Glibc отбрасывает кастомные переменные CFLAGS, если они переданы перед вызовом ./ | ||
| + | ====🛠️ Финальное исправление скрипта packages/ | ||
| + | Выполните команду для перезаписи скрипта. Этот вариант использует официальный флаг конфигуратора LFS для отключения режима прерывания сборки из-за предупреждений: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | mkdir -pv $LFS/lib $LFS/ | ||
| + | |||
| + | case $(uname -m) in | ||
| + | i?86) ln -sfv ld-linux.so.2 $LFS/ | ||
| + | ;; | ||
| + | x86_64) ln -sfv ../ | ||
| + | ln -sfv ../ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | patch -Np1 -i ../ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | # --disable-werror отключает режим " | ||
| + | ../ | ||
| + | --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --enable-kernel=4.19 \ | ||
| + | --with-headers=$LFS/ | ||
| + | --disable-werror \ | ||
| + | libc_cv_slibdir=/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | sed '/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ===🚀 Запуск решающей компиляции=== | ||
| + | Запускаем сборку Glibc заново: | ||
| + | <code bash #bash> | ||
| + | |||
| + | </ | ||
| + | ==В чём точная причина сбоя== | ||
| + | Это известная ошибка сборки Glibc 2.39, специфичная для хост-систем на базе современных версий Ubuntu (включая 24.04). Модифицированный компилятор GCC в Ubuntu по умолчанию жестко внедряет макрос _FORTIFY_SOURCE прямо в препроцессор.Из-за этого в коде syslog.c возникает конфликт встраивания функций: | ||
| + | ====🛠️ Модификация скрипта packages/ | ||
| + | Мы внесем явное подавление макросов _FORTIFY_SOURCE в переменные CFLAGS, что заставит препроцессор хоста пропустить встраивание встроенных механизмов логирования и успешно скомпилировать syslog.o.Выполните команду в терминале, | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | mkdir -pv $LFS/lib $LFS/ | ||
| + | |||
| + | case $(uname -m) in | ||
| + | i?86) ln -sfv ld-linux.so.2 $LFS/ | ||
| + | ;; | ||
| + | x86_64) ln -sfv ../ | ||
| + | ln -sfv ../ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | patch -Np1 -i ../ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | # -U_FORTIFY_SOURCE нейтрализует жесткую встроенную фортификацию Ubuntu 24.04 | ||
| + | # -Wno-error=attributes и -O2 гарантируют совместимость со stdlib | ||
| + | export CFLAGS=" | ||
| + | export CXXFLAGS=" | ||
| + | |||
| + | ../ | ||
| + | --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --enable-kernel=4.19 \ | ||
| + | --with-headers=$LFS/ | ||
| + | --disable-werror \ | ||
| + | libc_cv_slibdir=/ | ||
| + | libc_cv_include_x86_isa_level=no | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | sed '/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ===🚀 Запуск финальной итерации сборки Glibc=== | ||
| + | Запустите конвейер сборки заново. Механизм движка build.sh очистит директорию от прошлых неудачных бинарников, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | |||
| + | </ | ||
| + | **Успех!** | ||
| + | ====🖥️ Модификация скрипта под Ubuntu 26.10==== | ||
| + | В дистрибутивах хост-систем уровня Ubuntu 26.10 компилятор GCC делает еще один серьезный шаг вперед в плане безопасности: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | mkdir -pv $LFS/lib $LFS/ | ||
| + | |||
| + | case $(uname -m) in | ||
| + | i?86) ln -sfv ld-linux.so.2 $LFS/ | ||
| + | ;; | ||
| + | x86_64) ln -sfv ../ | ||
| + | ln -sfv ../ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | patch -Np1 -i ../ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | # Специфические флаги для ультра-нового GCC в Ubuntu 26.10: | ||
| + | # -O2: Обязательная базовая оптимизация для макросов Glibc | ||
| + | # -U_FORTIFY_SOURCE: | ||
| + | # -Wno-error: Глобальный запрет падать на предупреждениях (включая stringop-overflow) | ||
| + | # -fno-strict-aliasing: | ||
| + | export CFLAGS=" | ||
| + | export CXXFLAGS=" | ||
| + | |||
| + | ../ | ||
| + | --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --enable-kernel=4.19 \ | ||
| + | --with-headers=$LFS/ | ||
| + | --disable-werror \ | ||
| + | libc_cv_slibdir=/ | ||
| + | libc_cv_include_x86_isa_level=no | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | sed '/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | Этот вариант полностью нейтрализует все новые " | ||
| + | --------------------------------------------------------------------------------------- | ||
| + | ====🏁 Что делать дальше на первой машине (Ubuntu 24.04)==== | ||
| + | Пока вторая машина готовится, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | ===На скриншоте виден финальный штрих: === | ||
| + | движок сборки выдал ошибку No such file or directory, потому что в имени созданного скрипта пакета допущена опечатка. Файл в вашей папке packages/ называется 005-libstdcxx.sh (через две x), а движок ищет 005-libstdcxx.sh (на скриншоте видно имя 005-libstdcxx.sh, | ||
| + | \\ перезапишем | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | ../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --prefix=/ | ||
| + | --disable-multilib \ | ||
| + | --disable-nls \ | ||
| + | --disable-libstdcxx-pch \ | ||
| + | --with-gxx-include-dir=/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ====2. Финальный старт сборки Libstdc++==== | ||
| + | Запускайте компиляцию: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | ==На скриншоте зафиксирована известная аппаратная/ | ||
| + | Почему это произошлоКогда вы собирали первый проход GCC (пакет 002), у вас еще не было системных потоков Glibc (флаг --disable-threads). Теперь, | ||
| + | ===🛠️ Исправление скрипта packages/ | ||
| + | Выполните команду для полной перезаписи сценария: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | # Добавлен флаг --disable-libstdcxx-time для обхода ошибки компиляции tzdb.cc | ||
| + | ../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --prefix=/ | ||
| + | --disable-multilib \ | ||
| + | --disable-nls \ | ||
| + | --disable-libstdcxx-pch \ | ||
| + | --disable-libstdcxx-time \ | ||
| + | --with-gxx-include-dir=/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ===🚀 Повторный старт финального пакета=== | ||
| + | Запускайте компиляцию заново: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | На новом скриншоте видно, что флаг --disable-libstdcxx-time в gcc-13.2.0 не отключил компиляцию файла tzdb.cc [12.1]. Ошибка error: ' | ||
| + | Так как мы строим систему в обход жестких рамок книги LFS, мы решим эту проблему радикально и гарантированно: | ||
| + | ====🛠️ Радикальное исправление скрипта packages/ | ||
| + | Мы добавим команду sed, которая затрет все содержимое проблемного файла tzdb.cc, оставив его пустым. Так как в кросс-компиляторе первого прохода база таймзон C++20 все равно не используется, | ||
| + | Выполните команду для полной перезаписи сценария: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Мы находимся внутри распакованной папки gcc-13.2.0 | ||
| + | # Обнуляем файл tzdb.cc, чтобы компилятор не спотыкался об отсутствующие потоки mutex | ||
| + | echo "" | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | ../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --prefix=/ | ||
| + | --disable-multilib \ | ||
| + | --disable-nls \ | ||
| + | --disable-libstdcxx-pch \ | ||
| + | --with-gxx-include-dir=/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ===🚀 Повторный запуск сборки Libstdc++=== | ||
| + | Запускайте финальную компиляцию: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | На скриншоте видно, что файл tzdb.cc всё ещё пытается компилироваться и выдаёт ту же самую ошибку. | ||
| + | ==Почему это произошло? | ||
| + | Наш главный управляющий движок build.sh работает по строгому алгоритму: | ||
| + | * Он распаковывает чистый архив gcc-13.2.0.tar.xz. | ||
| + | * Из-за этого создается абсолютно новая, чистая папка исходников. | ||
| + | * Команда echo "" | ||
| + | Давайте сделаем обнуление файла абсолютно надёжным, | ||
| + | ====🛠️ Сверхнадежное исправление скрипта packages/ | ||
| + | Выполните команду в терминале. Теперь мы принудительно очищаем файл tzdb.cc, используя $(pwd), чтобы команда выполнилась точно в корне распакованного GCC, прямо перед запуском configure: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Мы находимся внутри распакованной папки gcc-13.2.0 | ||
| + | # Вырезаем код tzdb.cc прямо в текущей рабочей директории | ||
| + | echo "/* Файл принудительно очищен для обхода отсутствия mutex */" > ./ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | ../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(../ | ||
| + | --prefix=/ | ||
| + | --disable-multilib \ | ||
| + | --disable-nls \ | ||
| + | --disable-libstdcxx-pch \ | ||
| + | --with-gxx-include-dir=/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ===🚀 Повторный запускЗапускаем компиляцию заново. === | ||
| + | Теперь файл tzdb.cc гарантированно окажется пустым в момент сборки, | ||
| + | |||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | ==Успех!!! Скрин 34== | ||
| + | |||
| + | ====1. Создание скрипта резервного копирования scripts/ | ||
| + | Убедимся, | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Подгружаем глобальную конфигурацию | ||
| + | LFS_BUILDER_ROOT=" | ||
| + | source " | ||
| + | |||
| + | BACKUP_DIR="/ | ||
| + | BACKUP_NAME=" | ||
| + | |||
| + | mkdir -p " | ||
| + | |||
| + | echo "=== Архивирование временного инструментария $LFS/tools ===" | ||
| + | echo " | ||
| + | |||
| + | # Создаем резервную копию каталога tools с сохранением прав доступа | ||
| + | tar -C " | ||
| + | |||
| + | echo "=== [УСПЕХ] Резервная копия успешно создана! ===" | ||
| + | echo " | ||
| + | echo " | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | ===2. Запуск архивации=== | ||
| + | Запустите процесс создания слепка: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | После завершения команды в вашей домашней директории появится папка lfs-backups с готовым архивом [12.1]. Вы официально зафиксировали свой прогресс и полностью защитили систему от случайных сбоев на следующем этапе [12.1]. | ||
| + | ===== Кросс-Компиляция временных инструментов ===== | ||
| + | мы можем автоматизировать сборку всех 17 пакетов Главы 6 (Временные инструменты) [12.1] с помощью одного общего управляющего скрипта. Наш движок build.sh уже идеально спроектирован под эту задачу: | ||
| + | ====1. Как будет работать автоматизация: | ||
| + | Диспетчер поочередно вызывает build.sh для каждого пакета. | ||
| + | * Если, например, | ||
| + | * Диспетчер перехватывает этот код благодаря инструкции set -e, немедленно останавливает всю сборку и оставляет систему в стабильном состоянии. Вы сможете спокойно изучить файл logs/ | ||
| + | ==== 2. Создание главного файла-диспетчера scripts/ | ||
| + | Этот скрипт содержит точную последовательность и имена архивов для Главы 6 книги LFS 12.1 [12.1]: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | # Останавливать скрипт при любой ошибке внутри цепочки | ||
| + | set -e | ||
| + | |||
| + | LFS_BUILDER_ROOT=" | ||
| + | cd " | ||
| + | |||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | |||
| + | # Поочередный запуск всех 17 пакетов Главы 6 LFS | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | ./ | ||
| + | |||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | |||
| + | ===3. Пример наполнения файлов пакетов=== | ||
| + | Чтобы этот диспетчер работал, | ||
| + | <code bash #bash> | ||
| + | # 006-m4.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ../ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 007-ncurses.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | # Нам нужно явно указать компилятору хоста не использовать системные библиотеки | ||
| + | mkdir build | ||
| + | cd build | ||
| + | ../ | ||
| + | make -C include | ||
| + | make -C progs tic | ||
| + | cd .. | ||
| + | |||
| + | ./configure --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(./ | ||
| + | --mandir=/ | ||
| + | --with-shared \ | ||
| + | --without-debug \ | ||
| + | --without-ada \ | ||
| + | --without-normal \ | ||
| + | --enable-widec | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS TIC_PATH=$(pwd)/ | ||
| + | ln -sv libncursesw.so $LFS/ | ||
| + | sed -e ' | ||
| + | EOF | ||
| + | |||
| + | # 008-bash.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(support/ | ||
| + | --without-bash-malloc | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | ln -sfv bash $LFS/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | Сценарии для остальных 14 пакетов пишутся аналогичным лаконичным образом строго по книге LFS Глава 6 [12.1]. | ||
| + | ================================================== | ||
| + | Ниже представлен готовый монолитный сценарий, | ||
| + | ====🛠️ Наполнение оставшихся 14 пакетов для Дня 5==== | ||
| + | Скопируйте и выполните этот блок команд в терминале. Он сгенерирует файлы с номерами от 009 до 022: | ||
| + | <code bash #bash> | ||
| + | # 009-coreutils.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(build-aux/ | ||
| + | --enable-install-program=hostname \ | ||
| + | --enable-no-install-program=kill, | ||
| + | gl_cv_macro_MB_CUR_MAX_good=y | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | mv -v $LFS/ | ||
| + | mkdir -pv $LFS/ | ||
| + | mv -v $LFS/ | ||
| + | sed -i ' | ||
| + | EOF | ||
| + | |||
| + | # 010-diffutils.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 011-file.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | mkdir build | ||
| + | cd build | ||
| + | ../ | ||
| + | make | ||
| + | cd .. | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS FILE_COMPILE=$(pwd)/ | ||
| + | make DESTDIR=$LFS install | ||
| + | rm -v $LFS/ | ||
| + | EOF | ||
| + | |||
| + | # 012-findutils.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 013-gawk.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | sed -i ' | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 014-grep.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 015-gzip.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 016-make.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 017-patch.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 018-sed.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 019-tar.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | # 020-xz.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | ./configure --prefix=/ | ||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | rm -v $LFS/ | ||
| + | EOF | ||
| + | |||
| + | # 021-binutils-p2.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | sed ' | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | ../ | ||
| + | --prefix=/ | ||
| + | --build=$(../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --disable-nls \ | ||
| + | --enable-shared \ | ||
| + | --enable-gprofng=no \ | ||
| + | --disable-werror \ | ||
| + | --enable-64-bit-bfd \ | ||
| + | --enable-default-hash-style=gnu | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | rm -v $LFS/ | ||
| + | EOF | ||
| + | |||
| + | # 022-gcc-p2.sh | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | tar -xf ../ | ||
| + | tar -xf ../ | ||
| + | tar -xf ../ | ||
| + | |||
| + | case $(uname -m) in | ||
| + | x86_64) | ||
| + | sed -e '/ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | sed '/ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | mkdir -pv $LFS_TGT/ | ||
| + | |||
| + | ../ | ||
| + | --build=$(../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --target=$LFS_TGT \ | ||
| + | --prefix=/ | ||
| + | --with-glibc-version=2.39 \ | ||
| + | --with-sysroot=$LFS \ | ||
| + | --enable-languages=c, | ||
| + | --enable-default-pie \ | ||
| + | --enable-default-ssp \ | ||
| + | --disable-nls \ | ||
| + | --disable-multilib | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | ln -sfv gcc $LFS/ | ||
| + | EOF | ||
| + | |||
| + | # Делаем всю пачку исполняемой | ||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ===🏁 Всё готово к тотальному запуску=== | ||
| + | Папка packages/ теперь полностью укомплектована всеми 17 пакетами (включая созданные на предыдущем шаге 006, 007, 008) [12.1].Запуск всего конвейера Дня 5 осуществляется одной командой из корня сборщика: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | На скриншоте зафиксирована ошибка: | ||
| + | ==В чем причина ошибки== | ||
| + | В отличие от первого прохода Binutils и GCC, утилита m4 (и большинство остальных 15 пакетов) настраивается прямо из корня своей распакованной папки, а не из изолированной директории build. Скрипт попытался прыгнуть на уровень выше через ../ | ||
| + | ====🛠️ Исправление и оптимизация скрипта packages/ | ||
| + | Так как вы компилируете на современном дистрибутиве Ubuntu 24.04 (и планируете на 26.10), в пакете m4 версии 1.4.19 также присутствует старый код, который вызовет сбой error: ' | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Исправление совместимости старого кода M4 с новой Glibc на Ubuntu 24.04/ | ||
| + | sed -i ' | ||
| + | |||
| + | # Вызываем configure прямо из текущего каталога исходников (./ вместо ../) | ||
| + | ./configure --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(build-aux/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===🚀 Повторный старт Дня 5=== | ||
| + | ==Конвейер остановился на пакете 008-bash из-за отсутствия целевой директории: | ||
| + | ===🔍 В чем причина ошибки=== | ||
| + | По книге LFS 12.1 в Главе 6 все утилиты этого этапа должны устанавливаться строго с префиксом --prefix=/ | ||
| + | ====🛠️ Исправление и оптимизация скрипта packages/ | ||
| + | Мы исправим пути символической ссылки, | ||
| + | ===🚀 Возобновление сборки=== | ||
| + | Так как пакеты 006-m4 и 007-ncurses уже успешно собрались ранее, нам не нужно пересобирать их заново. Мы можем временно скорректировать диспетчер или просто запустить исправившийся Bash вручную через build.sh, а затем вернуть управление общему диспетчеру.Выполните команды в терминале: | ||
| + | ===1.Ручной дозапуск исправившегося Bash:=== | ||
| + | Возврат в общий конвейер автоматизации: | ||
| + | <code bash #bash> | ||
| + | ./ | ||
| + | </ | ||
| + | ====1. Автоматическая корректировка диспетчера run_day5.sh==== | ||
| + | Выполните эту команду в терминале. Она закомментирует первые три успешно пройденных шага в вашем файле автоматизации: | ||
| + | <code bash #bash> | ||
| + | sed -i -e '/ | ||
| + | </ | ||
| + | ===🚀 Запуск продолжения конвейера Дня 5=== | ||
| + | После выполнения команды выше ваш диспетчер готов продолжить сборку с 9-го пакета (Coreutils). Нажмите на старт: | ||
| + | ==🔍 В чем причина ошибки== | ||
| + | В версии Gawk 5.3.0 (которая идет в LFS 12.1) файл dirfunc.c был перенесен разработчиками пакета в подкаталог extension/ | ||
| + | ====🛠️ Исправление скрипта packages/ | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Исправленный путь к файлу dirfunc.c в версии Gawk 5.3.0 | ||
| + | sed -i ' | ||
| + | |||
| + | ./configure --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(build-aux/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ====🏁 Перезапуск автоматической сборки==== | ||
| + | Запускайте конвейер заново, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | На новом скриншоте видно, что sed снова выдал ошибку No such file or directory, но уже для пути extension/ | ||
| + | ==🔍 В чем реальная причина== | ||
| + | В книге LFS версии 12.1 используется пакет gawk-5.3.0.tar.xz [12.1]. Однако команда sed для исправления dirfunc.c официально требуется только в более старых версиях книги LFS (например, | ||
| + | Для версии книги LFS 12.1 эта замена через sed больше вообще не требуется [12.1]. Мы можем просто удалить эту строку из сценария, | ||
| + | ====🛠️ Упрощение и исправление скрипта packages/ | ||
| + | Выполните команду для перезаписи сценария Gawk без лишних модификаций, | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Для gawk-5.3.0 в LFS 12.1 никакие предварительные патчи sed не нужны | ||
| + | |||
| + | ./configure --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(build-aux/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | ===🚀 Запуск конвейераПоскольку диспетчер run_day5.sh=== | ||
| + | не менялся, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | ================================================ | ||
| + | На скриншоте видно, что sed всё ещё пытается выполниться. Это значит, | ||
| + | ================================================= | ||
| + | ===1. Гарантированное исправление скрипта Gawk (Без sed)=== | ||
| + | Выполните команду удаления старого файла и записи чистого скрипта без каких-либо модификаций: | ||
| + | <code bash #bash> | ||
| + | rm -f ~/ | ||
| + | |||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | ./configure --prefix=/ | ||
| + | --host=$LFS_TGT \ | ||
| + | --build=$(build-aux/ | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | ===2. Принудительное отключение пакетов 006-012 в диспетчере=== | ||
| + | Эта команда гарантирует, | ||
| + | <code bash #bash> | ||
| + | sed -i -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | </ | ||
| + | ===3. Запуск общего конвейера с 13-го пакета и выше=== | ||
| + | Теперь запускайте общий диспетчер. Он пропустит первые шаги, мгновенно перейдет к обновленному 013-gawk.sh и в случае успеха автоматически погонит сборку дальше по цепочке (Grep, Gzip, Make и т.д.): | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | |||
| + | </ | ||
| + | На скриншоте зафиксирован сбой на пакете 021-binutils-p2 [12.1]. Это означает, | ||
| + | ==🔍 В чем причина ошибки== | ||
| + | Команда sed в начале скрипта 021-binutils-p2.sh выполняет патчинг файла bfd/bfd.c по жестко заданному номеру строки (6309s@...) [12.1]. Однако в версии Binutils 2.42 (из LFS 12.1) структура этого файла изменилась, | ||
| + | ====🛠️ Исправление скрипта packages/ | ||
| + | Мы полностью уберем ошибочную строку sed и перепишем скрипт строго по спецификации второго прохода книги LFS 12.1 [12.1].Выполните команду для перезаписи сценария: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Мы находимся в корне распакованного binutils-2.42 | ||
| + | # Патч по номеру строки удален во избежание повреждения исходного кода | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | ../ | ||
| + | --prefix=/ | ||
| + | --build=$(../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --disable-nls \ | ||
| + | --enable-shared \ | ||
| + | --enable-gprofng=no \ | ||
| + | --disable-werror \ | ||
| + | --enable-64-bit-bfd \ | ||
| + | --enable-default-hash-style=gnu | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | # Удаляем ненужные статические libtool-архивы, | ||
| + | rm -v $LFS/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===🚀 Отключение пройденных шагов и перезапуск=== | ||
| + | Чтобы диспетчер не тратил время на повторную проверку и сборку утилит с 013 по 020, закомментируем их одной командой sed: | ||
| + | <code bash #bash> | ||
| + | sed -i -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | -e '/ | ||
| + | |||
| + | </ | ||
| + | ====🏁 Запуск конвейера==== | ||
| + | Запускайте диспетчер заново. Он мгновенно начнет работу со строго исправленного пакета 021-binutils-p2 [12.1]: | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | На **скриншоте iso_lfs_server_x_44.png** видно, что 021-binutils-p2 снова упал с той же ошибкой Error 2 [12.1]. Это означает, | ||
| + | ====🛠️ 1. Гарантированное исправление скрипта пакета==== | ||
| + | Выполните команду удаления старого файла и записи нового: | ||
| + | <code bash #bash> | ||
| + | rm -f ~/ | ||
| + | |||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | ../ | ||
| + | --prefix=/ | ||
| + | --build=$(../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --disable-nls \ | ||
| + | --enable-shared \ | ||
| + | --enable-gprofng=no \ | ||
| + | --disable-werror \ | ||
| + | --enable-64-bit-bfd \ | ||
| + | --enable-default-hash-style=gnu | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | rm -v $LFS/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ====🚀 2. Точечный запуск Binutils Pass 2==== | ||
| + | Запустим пакет отдельно от общего скрипта, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | ==🔍 3. Что делать, | ||
| + | Если сборка опять мгновенно выдаст Error 2, значит, | ||
| + | <code bash #bash> | ||
| + | tail -n 20 ~/ | ||
| + | </ | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | Судя по выводу tail -n 20, ошибка Error 2 происходит на самом верхнем уровне Makefile сразу после завершения этапа конфигурирования (генерации файлов config.status, | ||
| + | При сборке Binutils (Pass 2) в Главе 6 книги LFS 12.1 на хостах с современным GCC (как в Ubuntu 24.04/ | ||
| + | Кроме того, по книге LFS 12.1, перед конфигурацией Binutils Pass 2 требуется применить важный сед-патч к файлу Makefile.in (а не к bfd.c, как было раньше), | ||
| + | ====🛠️ Исправление скрипта packages/ | ||
| + | |||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | Отличная работа с выводом grep! Вы вытащили корень проблемы. Ошибка на строке 384 лога: configure: error: could not determine x86_64-lfs-linux-gnu-ar interface [12.1]. | ||
| + | ==🔍 В чем реальная причина сбоя== | ||
| + | Вы собираете второй проход Binutils, используя созданный кросс-компилятор (--host=$LFS_TGT) [12.1]. Скрипт конфигурации пытается запустить кросс-архиватор x86_64-lfs-linux-gnu-ar, | ||
| + | Поскольку в PATH нет кросс-инструментов, | ||
| + | ====🛠️ Исправление и запуск==== | ||
| + | Чтобы решить эту проблему раз и навсегда, | ||
| + | <code bash #bash> | ||
| + | # 1. Экспортируем путь к кросс-компилятору Главы 5 в системное окружение | ||
| + | export PATH=$LFS/ | ||
| + | |||
| + | # 2. Проверяем, | ||
| + | which x86_64-lfs-linux-gnu-ar | ||
| + | |||
| + | # 3. Запускаем сборку пакета заново | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | |||
| + | </ | ||
| + | После добавления пути конфигуратор успешно определит интерфейс архиватора ar, и компиляция второго прохода Binutils прорвется к финалу [12.1]. | ||
| + | ==========Успех!!!!=============== | ||
| + | ====🛠️ Превентивная подготовка скрипта packages/ | ||
| + | Так как сборка второго прохода GCC очень чувствительна к окружению и путям, мы должны убедиться, | ||
| + | Давайте обновим файл 022-gcc-p2.sh эталонным кодом, который учитывает очистку флагов хоста (unset) и правильную сборку внутренних математических библиотек (mpfr, gmp, mpc) [12.1]: | ||
| + | |||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Очищаем переменные хоста, чтобы они не ломали кросс-компиляцию | ||
| + | unset CFLAGS | ||
| + | unset CXXFLAGS | ||
| + | |||
| + | # Распаковываем математические библиотеки внутрь корня GCC | ||
| + | tar -xf ../ | ||
| + | tar -xf ../ | ||
| + | tar -xf ../ | ||
| + | |||
| + | # Настройка динамического линкера под x86_64 | ||
| + | case $(uname -m) in | ||
| + | x86_64) | ||
| + | sed -e '/ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | # Отключаем устаревший макрос Dialogue, если он присутствует | ||
| + | sed '/ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | # Предотвращаем конфликты сборки лимитов libstdc++ | ||
| + | mkdir -pv $LFS_TGT/ | ||
| + | |||
| + | ../ | ||
| + | --build=$(../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --target=$LFS_TGT \ | ||
| + | --prefix=/ | ||
| + | --with-glibc-version=2.39 \ | ||
| + | --with-sysroot=$LFS \ | ||
| + | --enable-languages=c, | ||
| + | --enable-default-pie \ | ||
| + | --enable-default-ssp \ | ||
| + | --disable-nls \ | ||
| + | --disable-multilib | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | # Создаем критически важную ссылку на cc, чтобы chroot-среда видела компилятор по умолчанию | ||
| + | ln -sfv gcc $LFS/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | |||
| + | </ | ||
| + | ===🚀 Запуск финальной компиляции Дня 5=== | ||
| + | Поскольку нам критически важно сохранить измененный PATH (в котором находится x86_64-lfs-linux-gnu-ar), | ||
| + | |||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | ./ | ||
| + | </ | ||
| + | ==⏳ Внимание: | ||
| + | ===📉 Что происходит во время компиляции GCC Pass 2=== | ||
| + | * Сборка выполняет самый тяжелый объем работы в этой главе: | ||
| + | * Создаются чистые компиляторы cc1 и cc1plus, ориентированные на новые системные каталоги [12.1]. | ||
| + | * Собирается полноценная разделяемая библиотека libstdc++ [12.1]. | ||
| + | * Итоговые исполняемые файлы прописываются в каталог / | ||
| + | <note shadow> | ||
| + | {{: | ||
| + | </ | ||
| + | На скриншоте зафиксирована классическая ошибка компиляции GCC версии 13 на современных дистрибутивах хост-систем: | ||
| + | ==🔍 В чем причина ошибки== | ||
| + | Компилятор хоста Ubuntu задействует новые, более строгие правила статического анализа кода [12.1]. Он обнаружил потенциальную проблему, | ||
| + | \\ | ||
| + | Поскольку эта внутренняя библиотека отладки (libsanitizer) не критична для работы базового кросс-компилятора временной среды, а книга LFS 12.1 рекомендует полностью подавлять такие ошибки компилятора хоста [12.1], мы решим этот вопрос радикально и надежно. Мы передадим флаг отключения санитайзеров --disable-libsanitizer на этапе конфигурации GCC Pass 2 [12.1]. | ||
| + | ====🛠️ Модификация скрипта packages/ | ||
| + | Выполните команду в терминале хоста для полной перезаписи сценария. В конфигуратор добавлен официальный флаг обхода проблемных отладочных библиотек: | ||
| + | <code bash #bash> | ||
| + | cat << ' | ||
| + | # | ||
| + | set -e | ||
| + | |||
| + | # Очищаем переменные хоста, чтобы они не ломали кросс-компиляцию | ||
| + | unset CFLAGS | ||
| + | unset CXXFLAGS | ||
| + | |||
| + | # Распаковываем математические библиотеки внутрь корня GCC | ||
| + | tar -xf ../ | ||
| + | tar -xf ../ | ||
| + | tar -xf ../ | ||
| + | |||
| + | # Настройка динамического линкера под x86_64 | ||
| + | case $(uname -m) in | ||
| + | x86_64) | ||
| + | sed -e '/ | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | # Отключаем устаревший макрос Dialogue, если он присутствует | ||
| + | sed '/ | ||
| + | |||
| + | mkdir -v build | ||
| + | cd | ||
| + | |||
| + | # Предотвращаем конфликты сборки лимитов libstdc++ | ||
| + | mkdir -pv $LFS_TGT/ | ||
| + | |||
| + | # --disable-libsanitizer отключает проблемный модуль отладки памяти | ||
| + | # --disable-werror гарантирует, | ||
| + | ../ | ||
| + | --build=$(../ | ||
| + | --host=$LFS_TGT \ | ||
| + | --target=$LFS_TGT \ | ||
| + | --prefix=/ | ||
| + | --with-glibc-version=2.39 \ | ||
| + | --with-sysroot=$LFS \ | ||
| + | --enable-languages=c, | ||
| + | --enable-default-pie \ | ||
| + | --enable-default-ssp \ | ||
| + | --disable-nls \ | ||
| + | --disable-multilib \ | ||
| + | --disable-libsanitizer \ | ||
| + | --disable-werror | ||
| + | |||
| + | make $MAKEFLAGS | ||
| + | make DESTDIR=$LFS install | ||
| + | |||
| + | # Создаем критически важную ссылку на cc, чтобы chroot-среда видела компилятор по умолчанию | ||
| + | ln -sfv gcc $LFS/ | ||
| + | EOF | ||
| + | |||
| + | chmod +x ~/ | ||
| + | </ | ||
| + | ===🚀 Повторный запуск компиляции=== | ||
| + | Так как при падении важный экспорт переменной PATH мог сброситься в текущей сессии вашего терминала, | ||
| + | <code bash #bash> | ||
| + | cd ~/ | ||
| + | export PATH=$LFS/ | ||
| + | ./ | ||
| + | </ | ||
| + | Теперь компилятор хоста полностью пропустит сборку проблемной библиотеки libsanitizer, | ||
| + | \\ | ||
| + | |||
| + | ====== День 7 ====== | ||
| + | | ||
| + | ==================================================================== | ||
| + | =====🔑 ПЛАН НА ДЕНЬ 6: ИЗОЛЯЦИЯ И ПОДГОТОВКА CHROOT (Глава 7 LFS)===== | ||
| + | Сегодня мы полностью разрываем связь с хост-системой Ubuntu. Все дальнейшие действия происходят внутри изолированной chroot-среды, | ||
| + | |||
| + | ==== 🛠️ Создание и запуск скрипта scripts/ | ||
| + | Выполните эту команду в терминале от пользователя eva. Она запишет файл, выдаст права на исполнение и сразу запустит процесс входа: | ||
| + | Используйте код с осторожностью.Шаг 2. Вход в изолированную chroot-среду: | ||
| + | ./ | ||
| + | Используйте код с осторожностью.Ваш терминал изменит вид на: (lfs chroot) root:/#. С этого момента вы находитесь внутри своего собственного Linux-сервера [12.1].Шаг 3. Создание базовой структуры и конфигурации (Глава 7 LFS): | ||
| ===== Написание скриптов для Binutils (Pass 1) и GCC (Pass 1). ===== | ===== Написание скриптов для Binutils (Pass 1) и GCC (Pass 1). ===== | ||
| ===== Запуск и отладка. Это самые долгие компиляции. ===== | ===== Запуск и отладка. Это самые долгие компиляции. ===== | ||
| ====== День 5: Завершение временных инструментов (Глава 6). ====== | ====== День 5: Завершение временных инструментов (Глава 6). ====== | ||
| ===== Сборка оставшихся утилит (M4, Ncurses, Bash, Coreutils и др.), работающих во временной папке. ===== | ===== Сборка оставшихся утилит (M4, Ncurses, Bash, Coreutils и др.), работающих во временной папке. ===== | ||
software/linux_server/iso_lfs_server/iso_lfs_server.1778688288.txt.gz · Последнее изменение: — VladPolskiy
