Инструменты пользователя

Инструменты сайта


tmp

🔍 Шаг 1. смотрим диски

lsblk sdb

🔍 Шаг 2. вставить скрипт

builder.sh
  1. cat << 'MAIN_EOF' > builder.sh
  2. #!/bin/bash
  3. set -e
  4.  
  5. # ==============================================================================
  6. # 0. ГЛОБАЛЬНАЯ ТЕХНИЧЕСКАЯ КОНФИГУРАЦИЯ СЕРВЕРА И ССЫЛОК
  7. # ==============================================================================
  8. TARGET_FLASH="/dev/sdb" # Физический диск флешки, размечаемый в Ubuntu
  9. SERVER_NAME="arch-server" # Имя хоста (hostname) будущего ПК
  10. ADMIN_NAME="eva" # Логин администратора с доступом к sudo
  11. ADMIN_PASS="65421" # Пароль администратора
  12. ROOT_PASS="rootpassword" # Пароль суперпользователя (root)
  13. OFFLINE_MODE="YES" # Измените на "NO", если на целевом ПК есть интернет
  14.  
  15. # Базовый образ Arch Linux
  16. URL_BOOTSTRAP="https://mirror.yandex.ru/archlinux/iso/latest/archlinux-bootstrap-x86_64.tar.zst"
  17.  
  18. # Официальные репозитории и зеркала (используются для скачивания и прописываются на ПК)
  19. URL_YANDEX="https://mirror.yandex.ru/archlinux/\$repo/os/\$arch"
  20. URL_PKGS="https://archlinux.pkgs.org/archlinux/\$repo/os/\$arch"
  21. URL_RACKSPACE="http://mirror.rackspace.com/archlinux/\$repo/os/\$arch"
  22. URL_PKGBUILD="https://geo.mirror.pkgbuild.com/\$repo/os/\$arch"
  23.  
  24. # ==============================================================================
  25. # ШАГ 1: Верификация безопасности накопителей
  26. # ==============================================================================
  27. echo "=== ШАГ 1: Верификация безопасности накопителей ==="
  28. UBUNTU_ROOT_DISK=$(lsblk -no PKNAME $(findmnt -nvo SOURCE /) 2>/dev/null || true)
  29. if [ -z "$UBUNTU_ROOT_DISK" ]; then
  30. UBUNTU_ROOT_DISK=$(lsblk -dno NAME,MOUNTPOINTS | grep -E '/$' | awk '{print $1}')
  31. fi
  32.  
  33. if [ "/dev/$UBUNTU_ROOT_DISK" == "$TARGET_FLASH" ]; then
  34. echo "КРИТИЧЕСКАЯ ОШИБКА: Запрещено размечать диск запущенной Ubuntu ($TARGET_FLASH)!"
  35. exit 1
  36. fi
  37.  
  38. echo "Целевой диск определен как безопасный: $TARGET_FLASH"
  39. echo "ВНИМАНИЕ! Диск $TARGET_FLASH будет тотально очищен через 3 секунд..."
  40.  
  41. # ==============================================================================
  42. # ШАГ 2: Принудительное уничтожение метаданных и разметки
  43. # ==============================================================================
  44. echo "=== ШАГ 2: Принудительное уничтожение метаданных и разметки ==="
  45. # Принудительно отрываем все виртуальные ФС, которые могли остаться в памяти хоста
  46. sudo umount -l /mnt/arch/dev/pts 2>/dev/null || true
  47. sudo umount -l /mnt/arch/dev 2>/dev/null || true
  48. sudo umount -l /mnt/arch/proc 2>/dev/null || true
  49. sudo umount -l /mnt/arch/sys 2>/dev/null || true
  50. sudo umount -l /mnt/arch/boot 2>/dev/null || true
  51. sudo umount -l /mnt/arch 2>/dev/null || true
  52. sudo umount -l ${TARGET_FLASH}* 2>/dev/null || true
  53.  
  54. # Стираем сигнатуры файловых систем
  55. sudo wipefs -a --force "$TARGET_FLASH"
  56.  
  57. sudo dd if=/dev/zero of="$TARGET_FLASH" bs=1M count=20 status=none
  58. sudo partprobe "$TARGET_FLASH" || true
  59.  
  60. # ==============================================================================
  61. # ШАГ 3: Создание новой таблицы разделов GPT
  62. # ==============================================================================
  63. echo "=== ШАГ 3: Создание новой таблицы разделов GPT ==="
  64. printf "g\nn\n1\n\n+512M\nt\n1\nn\n2\n\n\nw\n" | sudo fdisk --wipe always --wipe-partitions always "$TARGET_FLASH"
  65. sudo partprobe "$TARGET_FLASH" || true
  66.  
  67. if [[ "$TARGET_FLASH" == *"nvme"* ]]; then
  68. PART1="${TARGET_FLASH}p1"
  69. PART2="${TARGET_FLASH}p2"
  70. else
  71. PART1="${TARGET_FLASH}1"
  72. PART2="${TARGET_FLASH}2"
  73. fi
  74.  
  75. echo "Ожидание инициализации разделов ядром..."
  76. sudo partprobe /dev/sdb || true
  77. sudo udevadm settle || true
  78.  
  79. # ==============================================================================
  80. # ШАГ 4: Безусловное форматирование файловых систем
  81. # ==============================================================================
  82. echo "=== ШАГ 4: Безусловное форматирование файловых систем ==="
  83. sudo mkfs.vfat -F 32 "$PART1"
  84. sudo mkfs.ext4 -F "$PART2"
  85.  
  86. # ==============================================================================
  87. # ШАГ 5: Развертывание структуры точек монтирования
  88. # ==============================================================================
  89. echo "=== ШАГ 5: Развертывание структуры точек монтирования ==="
  90. sudo mkdir -p /mnt/arch
  91. sudo mount "$PART2" /mnt/arch
  92. sudo mkdir -p /mnt/arch/boot
  93. sudo mount "$PART1" /mnt/arch/boot
  94.  
  95. # ==============================================================================
  96. # ШАГ 6: Скачивание официального образа Arch Linux
  97. # ==============================================================================
  98. echo "=== ШАГ 6: Скачивание официального образа Arch Linux ==="
  99. sudo apt update && sudo apt install -y zstd wget
  100. if [ ! -f archlinux-bootstrap-x86_64.tar.zst ]; then
  101. wget --timeout=15 --tries=3 "$URL_BOOTSTRAP"
  102. fi
  103. sudo tar -I zstd -xf archlinux-bootstrap-x86_64.tar.zst --strip-components=1 -C /mnt/arch
  104.  
  105. # ==============================================================================
  106. # ШАГ 7: Статическая генерация таблицы fstab флешки
  107. # ==============================================================================
  108. echo "=== ШАГ 7: Статическая генерация таблицы fstab флешки ==="
  109. EFI_UUID=$(sudo blkid -s UUID -o value "$PART1")
  110. ROOT_UUID=$(sudo blkid -s UUID -o value "$PART2")
  111. sudo mkdir -p /mnt/arch/etc
  112. printf "UUID=%s /boot vfat defaults 0 2\nUUID=%s / ext4 defaults 0 1\n" "$EFI_UUID" "$ROOT_UUID" | sudo tee /mnt/arch/etc/fstab
  113.  
  114. # ==============================================================================
  115. # ШАГ 8: Внедрение скрипта АВТОУСТАНОВКИ на флешку (ОФФЛАЙН МЕТОД)
  116. # ==============================================================================
  117. echo "=== ШАГ 8: Внедрение скрипта АВТОУСТАНОВКИ на флешку ==="
  118. sudo mkdir -p /mnt/arch/root
  119.  
  120. sudo cat << EOF | sudo tee /mnt/arch/root/forest-install.sh > /dev/null
  121. #!/bin/bash
  122. set -e
  123. echo "=== КОМБАЙН ЗАПУЩЁН ==="
  124.  
  125. MY_DISK=\$(lsblk -no PKNAME \$(findmnt -nvo SOURCE /) 2>/dev/null || true)
  126. if [ -z "\$MY_DISK" ]; then
  127. MY_DISK=\$(lsblk -no PKNAME /bootmnt 2>/dev/null || echo "sdb")
  128. fi
  129.  
  130. TARGET_DISK=\$(lsblk -dno NAME,TYPE | grep -v "loop" | grep -v "rom" | grep -v "\$MY_DISK" | head -n1 | awk '{print \$1}')
  131. TARGET="/dev/\$TARGET_DISK"
  132. if [ -z "\$TARGET_DISK" ]; then
  133. echo "КРИТИЧЕСКАЯ ОШИБКА: Жёсткий диск ПК не найден!"
  134. exit 1
  135. fi
  136.  
  137. echo "Целевой жёсткий диск ПК определён: \$TARGET. Уничтожаем старые данные..."
  138. umount -f \${TARGET}* 2>/dev/null || true
  139. wipefs -a --force "\$TARGET"
  140. dd if=/dev/zero of="\$TARGET" bs=1M count=20 status=none
  141. partprobe "\$TARGET" || true
  142.  
  143. echo "Разметка жёсткого диска ПК..."
  144. printf "g\nn\n1\n\n+512M\nt\n1\nn\n2\n\n\nw\n" | fdisk --wipe always --wipe-partitions always "\$TARGET"
  145. if [[ "\$TARGET" == *"nvme"* ]]; then
  146. TPART1="\${TARGET}p1"
  147. TPART2="\${TARGET}p2"
  148. else
  149. TPART1="\${TARGET}1"
  150. TPART2="\${TARGET}2"
  151. fi
  152.  
  153. echo "Форматирование жёсткого диска ПК..."
  154. mkfs.vfat -F 32 "\$TPART1"
  155. mkfs.ext4 -F "\$TPART2"
  156.  
  157. echo "Монтирование дисков ПК под установку..."
  158. mkdir -p /mnt/target && mount "\$TPART2" /mnt/target
  159. mkdir -p /mnt/target/boot && mount "\$TPART1" /mnt/target/boot
  160.  
  161. # ==============================================================================
  162. # ШАГ 8.1 ОФЛАЙН УСТАНОВКА С ОБНОВЛЕНИЕМ
  163. # ==============================================================================
  164. # ==============================================================================
  165. # НАСТОЯЩИЙ АВТОНОМНЫЙ ОФЛАЙН-МЕТОД 20.05.26 14:15
  166. # ==============================================================================
  167. echo "Создаем необходимые папки под локальный кэш на жестком диске ПК..."
  168. mkdir -p /mnt/target/var/cache/pacman/pkg
  169. mkdir -p /mnt/target/var/lib/pacman/sync
  170. mkdir -p /mnt/target/etc/pacman.d
  171.  
  172. echo "Копируем автономный кэш пакетов и базы прямо с флешки на диск ПК..."
  173. if [ -d "/var/cache/pacman/pkg" ]; then
  174. cp -R /var/cache/pacman/pkg/. /mnt/target/var/cache/pacman/pkg/
  175. fi
  176. if [ -d "/var/lib/pacman/sync" ]; then
  177. cp -R /var/lib/pacman/sync/. /mnt/target/var/lib/pacman/sync/
  178. fi
  179.  
  180.  
  181. cp /etc/pacman.conf /mnt/target/etc/pacman.conf
  182. touch /mnt/target/etc/pacman.d/mirrorlist
  183.  
  184. echo "Развертывание системы из локальных файлов без интернета..."
  185. # Подставляем имена файлов через find прямо на ПК, защищая строку от Ubuntu
  186. pacman -U --noconfirm --root /mnt/target --dbpath /mnt/target/var/lib/pacman \$(find /mnt/target/var/cache/pacman/pkg/ -name "*.pkg.tar.zst")
  187.  
  188. # ==============================================================================
  189. # КОНЕЦ НАСТОЯЩИЙ АВТОНОМНЫЙ ОФЛАЙН-МЕТОД 20.05.26 14:15
  190. # ==============================================================================
  191.  
  192. echo "Генерация таблицы fstab целевого ПК..."
  193. printf "UUID=\$(blkid -s UUID -o value \$TPART2) / ext4 defaults 0 1\nUUID=\$(blkid -s UUID -o value \$TPART1) /boot vfat defaults 0 2\n" > /mnt/target/etc/fstab
  194.  
  195. echo "Вход в chroot окружение ПК..."
  196. mount --types proc /proc /mnt/target/proc
  197. mount --rbind /sys /mnt/target/sys
  198. mount --make-rslave /mnt/target/sys
  199. mount --rbind /dev /mnt/target/dev
  200. mount --make-rslave /mnt/target/dev
  201. mount --rbind /dev/pts /mnt/target/dev/pts
  202.  
  203.  
  204.  
  205. arch-chroot /mnt/target /bin/bash << 'CHROOT_INNER_EOF'
  206. set -e
  207. # Отключите автоматическую синхронизацию
  208. # Автоматическая настройка времени без пользовательского ввода
  209. # Вариант 1: Использовать UTC (рекомендуется)
  210. #echo "UTC" > /etc/timezone
  211. #ln -sf /usr/share/zoneinfo/UTC /etc/localtime
  212. #timedatectl set-local-rtc 0
  213.  
  214. # Вариант 2: Использовать локальное время с материнки напрямую через конфиги
  215. hwclock --systohc --localtime
  216. mkdir -p /etc/systemd
  217. mkdir -p /run/systemd/system
  218. mkdir -p /run/systemd/catalog/
  219.  
  220. touch /etc/machine-id
  221.  
  222. echo -e "[Time]\nLocalRTC=yes" > /etc/adjtime
  223. echo "Конфигурация пользователей..."
  224. useradd -m -G wheel -s /bin/bash "${ADMIN_NAME}"
  225.  
  226. # ==============================================================================
  227. # ЖЕСТКОЕ ПОДАВЛЕНИЕ СИНЕГО ЭКРАНА НА ЦЕЛЕВОМ ПК
  228. # ==============================================================================
  229. echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
  230. locale-gen
  231. echo "LANG=en_US.UTF-8" > /etc/locale.conf
  232. echo "KEYMAP=us" > /etc/vconsole.conf
  233. echo "${SERVER_NAME}" > /etc/hostname
  234. systemd-machine-id-setup
  235. ln -sf /dev/null /etc/systemd/system/systemd-firstboot.service
  236.  
  237. # ==============================================================================
  238.  
  239. echo "Конфигурация пользователей..."
  240. echo "${ADMIN_NAME}:${ADMIN_PASS}" | chpasswd
  241. echo "root:${ROOT_PASS}" | chpasswd
  242. echo "%wheel ALL=(ALL:ALL) ALL" > /etc/sudoers.d/wheel
  243.  
  244. touch /etc/locale.conf
  245. touch /etc/vconsole.conf
  246. touch /etc/machine-id
  247.  
  248. echo "Активация служб..."
  249. sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config
  250. systemctl enable sshd NetworkManager
  251.  
  252. echo "Установка загрузчика GRUB..."
  253. grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=BOOT --removable --recheck
  254. grub-mkconfig -o /boot/grub/grub.cfg
  255. CHROOT_INNER_EOF
  256.  
  257. printf "## Russia\nServer = %s\nServer = %s\n## International\nServer = %s\nServer = %s\n" \
  258. "${URL_YANDEX}" "${URL_PKGS}" "${URL_RACKSPACE}" "${URL_PKGBUILD}" > /mnt/target/etc/pacman.d/mirrorlist
  259.  
  260. # Размонтируем за собой виртуальные ФС на флешке
  261. umount -l /mnt/target/dev/pts
  262. umount -l /mnt/target/dev
  263. umount -l /mnt/target/sys
  264. umount -l /mnt/target/proc
  265. umount -R /mnt/target
  266.  
  267. umount -R /mnt/target
  268. echo "Система успешно развёрнута автономно! Перезагрузка через 3 секунды..."
  269. reboot
  270. EOF
  271.  
  272. # Настройка прав доступа к файлу автоустановщика
  273. sudo chmod 755 /mnt/arch/root
  274. sudo chmod +x /mnt/arch/root/forest-install.sh
  275. sudo chmod 700 /mnt/arch/root
  276.  
  277. # ==============================================================================
  278. # ШАГ 9: Создание и регистрация фоновой службы systemd
  279. # ==============================================================================
  280. echo "=== ШАГ 9: Создание и регистрация фоновой службы systemd ==="
  281. sudo cat << 'SERVICE_EOF' | sudo tee /mnt/arch/etc/systemd/system/forest-autoinstall.service > /dev/null
  282. [Unit]
  283. Description=Автоустановщик Arch Linux без монитора
  284. After=multi-user.target
  285. [Service]
  286. Type=idle
  287. ExecStart=/root/forest-install.sh
  288. StandardOutput=tty
  289. StandardError=tty
  290. [Install]
  291. WantedBy=multi-user.target
  292. SERVICE_EOF
  293.  
  294. sudo mkdir -p /mnt/arch/etc/systemd/system/multi-user.target.wants
  295. sudo ln -sf /etc/systemd/system/forest-autoinstall.service /mnt/arch/etc/systemd/system/multi-user.target.wants/forest-autoinstall.service
  296.  
  297. # ==============================================================================
  298. # ШАГ 10: Формирование чистых репозиториев для флешки
  299. # ==============================================================================
  300. echo "=== ШАГ 10: Формирование чистых репозиториев для флешки ==="
  301. sudo mkdir -p /mnt/arch/etc/pacman.d
  302.  
  303. # Пишем зеркала через стандартный echo, полностью избегая капризных Here-Doc с пайпами
  304. echo "Server = ${URL_YANDEX}" | sudo tee /mnt/arch/etc/pacman.d/mirrorlist > /dev/null
  305. echo "Server = ${URL_PKGS}" | sudo tee -a /mnt/arch/etc/pacman.d/mirrorlist > /dev/null
  306.  
  307. # ==============================================================================
  308. # ШАГ 11: Подготовка локального репозитория на флешке (Выполняет Ubuntu)
  309. # ==============================================================================
  310. echo "=== ШАГ 11: Подготовка локального репозитория силами Ubuntu ==="
  311. sudo mkdir -p /mnt/arch/var/cache/pacman/pkg
  312. sudo mkdir -p /mnt/arch/var/lib/pacman
  313.  
  314. # Генерируем правильный pacman.conf для флешки (пока со стандартными зеркалами)
  315. cat << 'EOF' | sudo tee /mnt/arch/etc/pacman.conf > /dev/null
  316. [options]
  317. Architecture = auto
  318. SigLevel = Optional TrustAll
  319. LocalFileSigLevel = Optional
  320.  
  321. [core]
  322. Include = /etc/pacman.d/mirrorlist
  323.  
  324. [extra]
  325. Include = /etc/pacman.d/mirrorlist
  326. EOF
  327.  
  328. # Скачиваем базы данных и ВСЕ пакеты, зайдя в chroot флешки (тут есть библиотеки и интернет)
  329. sudo /mnt/arch/usr/bin/arch-chroot /mnt/arch /bin/bash << 'CHROOT_EOF'
  330.  
  331. set -e
  332.  
  333. echo "Инициализация ключей внутри окружения флешки..."
  334. pacman-key --init
  335. pacman-key --populate archlinux
  336.  
  337. echo "Скачиваем базы данных и ВСЕ пакеты в автономный кэш флешки..."
  338. pacman -Syw --noconfirm \
  339. iana-etc filesystem linux-api-headers tzdata licenses \
  340. glibc libgcc libstdc++ libasan libatomic libgfortran libgomp \
  341. liblsan libobjc libquadmath libtsan libubsan gcc-libs \
  342. ncurses readline bash acl attr gmp zlib sqlite \
  343. util-linux-libs e2fsprogs keyutils gdbm brotli xz \
  344. lz4 zstd openssl libsasl libldap libevent libverto lmdb \
  345. krb5 libcap-ng audit libxcrypt libtirpc libnsl pambase \
  346. libgpg-error libgcrypt systemd-libs pam libcap coreutils \
  347. bzip2 libseccomp file findutils mpfr gawk pcre2 grep \
  348. procps-ng sed tar libtasn1 libffi libp11-kit p11-kit \
  349. ca-certificates-utils ca-certificates-mozilla ca-certificates \
  350. libunistring libidn2 libnghttp2 libnghttp3 nettle leancrypto \
  351. gnutls libngtcp2 libpsl libssh2 curl json-c gnulib-l10n icu \
  352. libxml2 gettext hwdata kmod pciutils psmisc shadow util-linux \
  353. gzip licenses libksba libusb libassuan libsysprof-capture \
  354. glib2 tpm2-tss libsecret pinentry npth gnupg gpgme libarchive \
  355. pacman-mirrorlist device-mapper popt cryptsetup expat \
  356. dbus dbus-broker dbus-broker-units dbus-units kbd libelf \
  357. systemd jansson binutils libmakepkg-dropins pacman \
  358. archlinux-keyring systemd-sysvcompat iputils libmnl \
  359. libnfnetlink libnetfilter_conntrack libnftnl libnl libpcap \
  360. nftables iptables libbpf iproute2 base mkinitcpio-busybox \
  361. diffutils mkinitcpio \
  362. linux linux-firmware-whence linux-firmware-amdgpu \
  363. linux-firmware-atheros linux-firmware-broadcom \
  364. linux-firmware-cirrus linux-firmware-intel \
  365. linux-firmware-mediatek linux-firmware-nvidia \
  366. linux-firmware-other linux-firmware-radeon \
  367. linux-firmware-realtek linux-firmware libedit \
  368. openssh libmm-glib libndp gpm pcre slang libnewt nspr nss \
  369. libnm libdaemon libsodium libpgm zeromq libteam \
  370. mobile-broadband-provider-info duktape polkit \
  371. pcsclite wpa_supplicant networkmanager sudo \
  372. nano dosfstools mtools mailcap nginx libmd libbsd \
  373. talloc tevent tdb ldb avahi libcups liburing libwbclient \
  374. mpdecimal python cifs-utils smbclient samba grub efivar \
  375. efibootmgr libzip argon2 oniguruma php php-fpm
  376.  
  377.  
  378.  
  379.  
  380.  
  381. CHROOT_EOF
  382.  
  383. # Переводим pacman.conf флешки на полностью локальный оффлайн-режим file:///
  384. cat << 'EOF' | sudo tee /mnt/arch/etc/pacman.conf > /dev/null
  385. [options]
  386. Architecture = auto
  387. SigLevel = Optional TrustAll
  388. LocalFileSigLevel = Optional
  389.  
  390. [core]
  391. Server = file:///var/cache/pacman/pkg
  392.  
  393. [extra]
  394. Server = file:///var/cache/pacman/pkg
  395. EOF
  396.  
  397.  
  398. # ==============================================================================
  399. # ШАГ 12: Локальная автономная установка на флешку (БЕЗ ИНТЕРНЕТА)
  400. # ==============================================================================
  401. echo "=== ШАГ 12: Накатывание базовой системы на флешку из локального кэша ==="
  402.  
  403. # Генерируем базовые конфиги флешки до chroot, чтобы заблокировать синий экран
  404. echo "en_US.UTF-8 UTF-8" | sudo tee /mnt/arch/etc/locale.gen > /dev/null
  405. echo "LANG=en_US.UTF-8" | sudo tee /mnt/arch/etc/locale.conf > /dev/null
  406. echo "KEYMAP=us" | sudo tee /mnt/arch/etc/vconsole.conf > /dev/null
  407. echo "arch-flash" | sudo tee /mnt/arch/etc/hostname > /dev/null
  408.  
  409. # Принудительная инициализация идентификаторов системы
  410. sudo systemd-machine-id-setup --root=/mnt/arch
  411. sudo touch /mnt/arch/etc/machine-id
  412.  
  413. # ЖЕСТКОЕ ОФФЛАЙН ПОДАВЛЕНИЕ FIRSTBOOT (Записываем строго внутрь флешки с sudo)
  414. sudo mkdir -p /mnt/arch/etc/systemd/system
  415. sudo ln -sf /dev/null /mnt/arch/etc/systemd/system/systemd-firstboot.service
  416. sudo touch /mnt/arch/var/lib/systemd/clock
  417.  
  418. # РЕШЕНИЕ ПРОБЛЕМЫ 3/13 И 12/13: Создаем каталоги и монтируем виртуальные ФС ядра хоста
  419. sudo mkdir -p /mnt/arch/usr/lib/systemd/catalog
  420.  
  421. echo "Развертываем систему на флешке из автономного кэша..."
  422. # Используем встроенный chroot флешки, передавая команды через bash -c, чтобы не ломать /dev/stdin
  423. sudo /mnt/arch/usr/bin/arch-chroot /mnt/arch /bin/bash -c "
  424. set -e
  425. # Ставим напрямую по маске файлы пакетов
  426. pacman -U --noconfirm /var/cache/pacman/pkg/*.pkg.tar.zst
  427.  
  428. # Настраиваем GRUB на флешке как съемный диск
  429. grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Arch_Flash --removable --recheck
  430. grub-mkconfig -o /boot/grub/grub.cfg
  431. "
  432.  
  433. # ==============================================================================
  434. # ШАГ 13: финальная проверка
  435. # ==============================================================================
  436. echo "=== ШАГ 13: финальная проверка ==="
  437.  
  438. sudo umount -l /mnt/arch/boot 2>/dev/null || true
  439. sudo umount -l /mnt/arch 2>/dev/null || true
  440.  
  441.  
  442.  
  443. MAIN_EOF

🔍 Шаг 4. Очистите его от символов Windows

sed -i 's/\r$//' builder.sh

🔍 Шаг 5. Разрешите запуск

chmod +x builder.sh && ./builder.sh

🔍 Шаг 4. запустить скрипт

./builder.sh
Только авторизованные участники могут оставлять комментарии.
tmp.txt · Последнее изменение: 127.0.0.1

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki