LINUX.ORG.RU

Установка Arch Linux скриптами.

 , , , ,


1

5

Решил для освоения «скриптинга» накатать скрипт установки Arch Linux (под свою машину, под текущую конфигурацию).
Проблема в том, что не создаётся файл «/mnt/setup», система сразу перезагружается, без выполнения arch-chroot. В чём косяк?
Сам скрипт:

wifi-menu #автоматизировать
timedatectl set-ntp true
parted /dev/sda mklabel gpt
parted /dev/sda mkpart primary 1 128
parted /dev/sda mkpart primary 128 126gb
parted /dev/sda mkpart primary 126gb 128gb
parted /dev/sda align-check opt 1
parted /dev/sda align-check opt 2
parted /dev/sda align-check opt 3
parted /dev/sda set 1 boot on
mkfs.vfat -F32 /dev/sda1
mkfs.btrfs -f /dev/sda2
mkswap /dev/sda3
swapon /dev/sda3
mount -o rw,noatime,compress=lzo,ssd,space_cache,commit=120,discard,subvolid=5,subvol=/ /dev/sda2 /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
pacman -Sy --noconfirm reflector
reflector --sort rate --save /etc/pacman.d/mirrorlist
pacstrap /mnt base btrfs-tools #intel-ucode gdm networkmanager gnome-terminal sudo gnome-control-center chromium telegram transmission-gtk gnome-keyring xdg-user-dirs-gtk gnome-screenshoot gnome-tweaks
genfstab -U /mnt >> /mnt/etc/fstab
sed -i "s/0 2/0 0/" /mnt/etc/fstab #не уверен что там будет при каждой установке "0 2", но пока работает
#создаём файл настройки
echo "ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime" $cat > /mnt/setup
echo "hwclock --systohc" $cat >> /mnt/setup
echo -e "echo \042ru_RU.UTF-8 UTF-8\042 \044cat > /etc/locale.gen" $cat >> /mnt/setup
echo "locale-gen" $cat >> /mnt/setup
echo -e "echo \042LANG=ru_RU.UTF-8\042 \044cat > /etc/locale.conf" $cat >> /mnt/setup
echo -e "echo \042FONT=cyr-sun16\042 \044cat > /etc/vconsole.conf" $cat >> /mnt/setup
echo -e "echo \042vltsoy97\042 \044cat > /etc/hostname" $cat >> /mnt/setup
echo -e "echo -e \0042127.0.0.1\0134tlocalhost\0134n::1\0134tlocalhost\0134n127.0.1.1\0134tvltsoy97.localdomain vltsoy97\042 \044cat > /etc/hosts" $cat >> /mnt/setup
echo -e "echo -e \042типопароль\0134nтипопароль\0134n\042 | passwd" $cat >> /mnt/setup
echo "bootctl --path=/boot install" $cat >> /mnt/setup
echo -e "echo -e \042default\0134tarch\042 \044cat > /boot/loader/loader.conf" $cat >> /mnt/setup
echo -e "echo -e \042title\0134tArch Linux\0134nlinux\0134t/vmlinuz-linux\0134ninitrd\0134t/intel-ucode.img\0134ninitrd\0134t/initramfs-linux.img\0134noptions\0134troot=PARTUUID= rw\042 \044cat > /boot/loader/entries/arch.conf" $cat >> /mnt/setup
echo -e "PARTUUID=\044(blkid -s PARTUUID -o value /dev/sda2)" $cat >> /mnt/setup
echo -e "sed -i \042s/PARTUUID= /PARTUUID=\044PARTUUID /\042 /boot/loader/entries/arch.conf" $cat >> /mnt/setup
echo "useradd -m -g users -G whell,audio,lp,storage,video,network,power -s /bin/bash vltsoy97" $cat >> /mnt/setup
echo -e "echo -e \042типопароль\0134nтипопароль\0134n\042 | passwd vltsoy97" $cat >> /mnt/setup
#добавить загрузку-распаковку-cp в /usr/lib/firmware/intel-ucode/
#добавить  настройку visudo
#echo "systemctl enable gdm.service" $cat >> /mnt/setup
#echo "systemctl enable NetworkManager.service" $cat >> /mnt/setup
echo "exit" $cat >> /mnt/setup
#файл настройки создан, наверное...
arch-chroot /mnt /mnt/setup
umount -R /mnt
reboot
И какие ещё могут возникнуть проблемы?
Тестирую по хардкору, без виртуалки.



Последнее исправление: vltsoy97 (всего исправлений: 11)

Так закомментируй две последние строки и проверь.

P. S. Тренировать скриптинг на автоматизации установки системы - ты смел... Ты хоть данные забекапил - на всех дисках, которые физически подключены?

P. P. S. Что такое $cat?

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Есть 2 абсолютно одинаковых ноута - Acer Swift 1, на первом Fedora 29, второй под тесты, так что не жалко. «$cat» - записать в файл, проверил, работает как надо.

vltsoy97
() автор топика
Ответ на: комментарий от Kroz

Остальные тесты и проверки уже завтра, а пока спать и думать.

vltsoy97
() автор топика

/mnt/setup права на выполнение не забудь.

вобще вот это $cat это переменная? echo и без нее пишет вроде в файл.

irton ★★★★★
()
Ответ на: комментарий от anonymous

ну может оно и создается как надо, но нужно знать с какой целью это делается. В данном случае с толку сбивает, усложняет, и мешает отлаживать очевидно.

irton ★★★★★
()
Ответ на: комментарий от vltsoy97

«$cat» - записать в файл, проверил, работает как надо.

Судя по твоему коду, «$cat» заменяется на пустоту. Поэтому, если ты удалишь «$cat», то ничего не поменяется.

Kroz ★★★★★
()
Ответ на: комментарий от anonymous

Наверное не $cat, a '| cat'. Но у меня и такой вариант прокатывал, файл создавался как надо.

А в каких случаях нужен '| cat' ?

Kroz ★★★★★
()

Я бы на твоём месте использовал here document типа

cat > file.txt << EOF
abcd
efgh
EOF

Так бы содержимое файла было куда нагляднее. Вместо EOF можно любую строку взять какой точно нет в нужном документе, а может даже просто ^D (в текстовый файл можно вставить управляющий символ)

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

Спасибо за совет, не знал (=
Так действительно в разы удобнее, без мороки с ASCII.

vltsoy97
() автор топика
Ответ на: комментарий от Kroz

Как я понял cat'ом можно читать\пере"записывать файл, а echo | cat - передаст нужный текст в cat, который в свою очередь допишет(в моём случае) этот текст в нужный файл. Или я гоню? Вроде | cat так и работает...

vltsoy97
() автор топика
Ответ на: комментарий от irton

Точно... Возможно из-за отсутствия прав на выполнение, chroot и не работал, сразу reboot. Спасибо (=

vltsoy97
() автор топика
Ответ на: комментарий от RRR1993

Как закончу, скину(= Но я человек ленивый, так что не обещаю что это будет быстро=(

vltsoy97
() автор топика
Ответ на: комментарий от anonymous

По мере обучения появятся и проверки, и куча других удобств. Мне хотя бы текущий вариант сделать работоспособным.

vltsoy97
() автор топика
Ответ на: комментарий от vltsoy97

echo "text" >> file.txt. Этого достаточно чтобы записать в файл. Дописать в конец, если быть точным, так как echo "text" > file.txt обнулит файл и запишет туда text (обрати внимание на одинарный и двойной >).

Я видел конструкции вида cmd | cat , но ума не приложу зачем они могут понадобиться. (Опыт написания bash скриптов у меня значительный, если что). По идее какой-то анахронизм вроде этого. Коль ты начинающий, рекомендую забыть о конструкции cmd | cat .

А вообще, почитай Advanced Bash-Scripting Guide. Сейчас набегут хейтеры, с линками на Bash Hackers, но лично мне хороший трамплин в bash в свое время дал именно Advanced Bash-Scripting Guide.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Позволь повторно обратиться за помощью.
На текущий момент, концовка кода выглядит следующим образом:

cd /mnt
mount -t proc proc proc/
mount --rbind /sys sys/
mount --rbind /dev dev/
mount --rbind /run run/
cp /etc/resolv.conf etc/resolv.conf
chroot /mnt /bin/bash ./setup
cd /
umount --recursive /mnt
rm /mnt/setup
reboot
Этот кусок скрипта по задумке должен был примонтировать необходимые разделы, chroot"нуться в готовую систему, запустить скрипт настроек, выйти из системы, размонтировать всё, reboot.
Но он не может размонтировать, ругается мол, umount ... target is busy. Если размонтировать принудительно, при загрузке kernel panic. Я или что-то не так монтирую, или неправильно размонтирую, хотя всё по Arch Wiki.
Думешь наверное почему не arch-chroot? Он не может после chroot'а запустить скрипт, поэтому монтируем руками.

vltsoy97
() автор топика
Ответ на: комментарий от vltsoy97

Во-первых, не монтируй в /mnt; создай там поддиректорию, и монтируй туда. Это не ошибка, просто best practice; глаза режет.

Во-вторых, не может быть чтобы из-за форсированного unmount'а при загрузке был kernel panic. Это у тебя ошибка в ядре. Вкомпиль все монолитно (ничего не делай модулями), убедись что есть поддержка твоей файловой системы, убедись, что при форматировании рутовой файловой системы ты не задавал кастомных параметров, также кастомных параметров не должно быть в fstab. Это самые частые ошибки. Если всё еще фейлится - бросай скриншот (обычно фотоаппаратом телефоном делают).

Что до chroot, у меня в скриптах вот такое работает:

# Enter
cd /mnt/chroot
mount -t proc /proc ./proc
mount --rbind /sys  ./sys
mount --make-rslave ./sys
mount --rbind /dev  ./dev
mount --make-rslave ./dev
cp /etc/resolv.conf ./etc

# Exit
umount -l ./dev{/shm,/pts,}
umount -l ./{proc,sys}
Если всё еще не дает размаунтить, то посмотреть кто держит можно с помощью lsof | grep /mnt

Kroz ★★★★★
()

Для начала, замени мотню с echo -e на отдельный файл скрипта, или хотя бы HERE-документ

annulen ★★★★★
()
Ответ на: комментарий от annulen

Почему не имеет? Типичный happy-case-only programming, как у всех нубовновичков.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Прочитал что такое set -e. Спасибо за совет, полезная вещь(=

vltsoy97
() автор топика
Ответ на: комментарий от annulen

Хотелось бы всё иметь одним файлом. На текущий момент, «echo» уже заменен на HERE-документ, так в разы удобнее.

vltsoy97
() автор топика
Ответ на: комментарий от Kroz

Проблема решена, я неправильно использовал arch-chroot.
Вместо

arch-chroot /mnt /mnt/setup
Правильнее было использовать
chmod +x /mnt/setup
arch-chroot /mnt /setup

vltsoy97
() автор топика
Ответ на: комментарий от Kroz

Скрипт «почти» полностью работает, вывод терминала во время установки не вызывает подозрений, все конфигурационные файлы проверены, всё «почти» отлично. Кроме одной вещи.
«pacstrap» во время своей работы, в качестве зависимости одного из пакетов, устанавливает «perl».
Настройка этого пакета выводит следующее:

perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_MESSAGES = "",
	LANG = "en_US.UTF-8"
are supported and installed on your system.
Я так понимаю ничего страшного в этом нет? Ведь каким образом я до pacstrap'а настрою локали?

vltsoy97
() автор топика
Ответ на: комментарий от RRR1993

Интересовался, держи. Релиз 0.3beta =)) «На моей машине работает»®

set -e
wifi-menu
sleep 10
timedatectl set-ntp true
parted /dev/sda mklabel gpt y
parted /dev/sda mkpart primary 1 128
parted /dev/sda mkpart primary 128 126gb
parted /dev/sda mkpart primary 126gb 128gb
parted /dev/sda align-check opt 1
parted /dev/sda align-check opt 2
parted /dev/sda align-check opt 3
parted /dev/sda set 1 boot on
mkfs.vfat -F32 /dev/sda1
mkfs.btrfs -f /dev/sda2
mkswap /dev/sda3
swapon /dev/sda3
mount -o rw,noatime,compress=lzo,ssd,space_cache,commit=120,discard,subvolid=5,subvol=/ /dev/sda2 /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
pacman -Sy --noconfirm --quiet --noprogressbar reflector
reflector --sort rate --save /etc/pacman.d/mirrorlist
pacstrap /mnt base btrfs-progs gdm networkmanager gnome-terminal sudo gnome-control-center chromium telegram-desktop transmission-gtk gnome-keyring xdg-user-dirs-gtk gnome-screenshot gnome-tweaks intel-ucode gedit linux-headers virtualbox gnome-calculator ttf-dejavu sushi gvfs-google vlc
genfstab -U /mnt >> /mnt/etc/fstab
sed -i "s/0 2/0 0/" /mnt/etc/fstab
mkdir /mnt/setup
wget https://downloadmirror.intel.com/28087/eng/microcode-20180807a.tgz
mv microcode-20180807a.tgz /mnt/setup
cat > /mnt/setup/installation << 'EOF'
ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
hwclock --systohc
echo "ru_RU.UTF-8 UTF-8" > /etc/locale.gen
locale-gen
echo "LANG=ru_RU.UTF-8" > /etc/locale.conf
echo "FONT=cyr-sun16" > /etc/vconsole.conf
echo "vltsoy97" > /etc/hostname
echo -e "127.0.0.1\tlocalhost\n::1\tlocalhost\n127.0.1.1\tvltsoy97.localdomain vltsoy97" > /etc/hosts
echo -e "ЗДЕСЬТИПОПАРОЛЬ\nЗДЕСЬТИПОПАРОЛЬ\n" | passwd
bootctl --path=/boot install
echo -e "default\tarch" > /boot/loader/loader.conf
echo -e "title\tArch Linux\nlinux\t/vmlinuz-linux\ninitrd\t/intel-ucode.img\ninitrd\t/initramfs-linux.img\noptions\troot=PARTUUID= rw" > /boot/loader/entries/arch.conf
PARTUUID=$(blkid -s PARTUUID -o value /dev/sda2)
sed -i "s/PARTUUID= /PARTUUID=$PARTUUID /" /boot/loader/entries/arch.conf
useradd -m -g users -G wheel,audio,lp,storage,video,network,power -s /bin/bash vltsoy97
echo -e "ЗДЕСЬТИПОПАРОЛЬ\nЗДЕСЬТИПОПАРОЛЬ\n" | passwd vltsoy97
systemctl enable gdm.service
systemctl enable NetworkManager.service
tar -zxf /setup/microcode-20180807a.tgz -C /setup
mv /setup/intel-ucode /usr/lib/firmware
exit
EOF
chmod +x /mnt/setup/installation
arch-chroot /mnt /setup/installation
rm -r /mnt/setup
umount -R /mnt
reboot

vltsoy97
() автор топика
3 февраля 2019 г.
Ответ на: комментарий от vltsoy97

Можешь перед запуском pacstrap добавить: export LANG=ru_RU.UTF-8 Ее значение сохранится и в среде chroot

anonymous
()
Ответ на: комментарий от vltsoy97

И не понятно... зачем ты отдельно скачиваешь и распаковываешь микрокод, если он у тебя подгружается на этапе загрузки системы вместе с initramfs

anonymous
()
Ответ на: комментарий от anonymous

емнип, ранее и позднее обновление микрокода - это разные вещи.

vltsoy97
() автор топика
17 апреля 2019 г.
15 января 2020 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.