☰ Оглавление

Как подготовить полноценную инсталляцию ArchLinux на USB Flash

В этой заметке рассказано, как, имея работающий ArchLinux, поставить полноценный ArchLinux на USB-Flash. Затем, аналогично, можно поставить ArchLinux на жёсткий диск, загрузившись с USB-носителя. Собственно, для этих целей я и делал такую флешку: чтобы поставить ArchLinux ни netbook и на embedded-систему, где загрузиться можно было только с флешки, а BIOSы обладали странными особенностями.

Внимание! Первая версия этой статьи был написана году в 2010. Потом она долго не правилась и в 2012 в неё были внесены существенные коррективы. С тех пор в Arch Linux произошли большие изменения. Например, переход на systemd. Поэтому текст может содержать противоречия.

А чтобы противоречий стало ещё больше, в конце я дописал дополнение от 2014 года.

Подготовка

Определяемся с именами

Советую создать переменные с ключевыми именами и путями:

export key_dev=/dev/sdb # устройство на которое ставим
export key=/dev/sdb1 # партиция
export key_label=ArchUSB-2011x07 # метка файловой системы
export key_path=/mnt/new_arch # путь, куда будем монтировать

Создаём файловую систему на флешке

mkfs.ext2 "$key"

Можно и ext3/4, но в нашем случае нет надобности в журнале, он даже мешает. Да и старые версии GRUB не очень любили ext4. Зато для старых систем есть драйвера под Windows и прочие приятности.

Для нормальной работы GRUB так же очень важно изменить тип партиции на 0x83.

cfdisk "$key_dev"

Устанавливаем систему

Ставим pacman и пакеты

# монтируем
mkdir "$key_path"
mount "$key $key_path"
# устанавливаем базу данных пакетов и ставим базовую систему
mkdir -p "$key_path/var/lib/pacman"
pacman -Sy -r "$key_path"
mkdir -p "$key_path/var/cache/pacman/pkg"
pacman -Su base --cachedir "$key_path/var/cache/pacman/pkg" -r "$key_path"
# займёт около 600M
# вносим коррективы
chmod 666 $key_path/dev/null $key_path/dev/zero
# аккуратно переходим в chroot
cp /etc/resolv.conf $key_path/etc/
cp /etc/pacman.d/mirrorlist $key_path/etc/pacman.d
mount -t proc proc $key_path/proc
mount -t sysfs sys $key_path/sys
mount -o bind /dev $key_path/dev
mount -o bind /dev/pts "$key_path/dev/pts"
chroot $key_path /bin/bash
# PGP
pacman-key --init
# ставим всё, что хотим, как-то так
# (этот набор пакетов приведён исключительно для примера)
pacman -Ss ssh
pacman -S openssh
pacman -S mc
pacman -S extra/python
pacman -S xorg-server
pacman -S xorg-xinit
pacman -S xterm
pacman -S xorg-twm
pacman -S fvwm
pacman -S xf86-input-synaptics
pacman -S xf86-video-intel
pacman -S firefox
pacman -S sudo
pacman -S screen
pacman -S tkabber
pacman -S community/tls
pacman -S extra/ispell
pacman -S base-devel
pacman -S core/grub-bios
# добавить в /etc/pacman.conf
# [archlinuxfr]
# Server = http://repo.archlinux.fr/$arch
pacman -Syu yaourt
yaourt -S aur/vnc
yaourt -S aur/ispell-ru-koi8-r-io
# и так далее, что кому нужно
# производим настройки системы
# правим /etc/rc.conf
# правим /etc/hosts
# правим /etc/mkinitcpio.conf
# HOOKS="base udev usb autodetect pata scsi sata filesystems usbinput"
#                  ^___ добавить именно в это место
#                       чтобы была возможность загрузки с USB
# ,_ это надо сделать, даже если вы не правили mkinitcpio.conf
# |
# v
mkinitcpio -p linux
# /etc/locale.gen
cat /etc/locale.gen | grep -v '#'
ru_RU.KOI8-R KOI8-R
ru_RU.UTF-8 UTF-8
locale-gen
# готовим почву для GRUB
grub-install "$key_dev"
# можно сделать ещё что-нибудь косметическое
/usr/bin/mandb --quiet
passwd
adduser
# выходим из chroot
exit
umount "$key_path/dev/pts"
umount "$key_path/dev"
umount "$key_path/proc"
umount "$key_path/sys"

Теперь можно попробовать загрузиться, заодно, посмотреть, что надо подправить в GRUB. Вполне вероятно, что умолчальные настройки не позволят загрузиться сразу.

Настраиваем систему

Узнаём UUID файловой системы

blkid $key
f1df0c45-b003-4bf1-b87c-6916ff15b880

Далее используем его.

Хотя эти фокусы прокатывают далеко не всегда. Возможно, в вашем случае единственный рабочий вариант — /dev/sda1

GRUB

Для старой версии

# /boot/menu.lst
title  Arch Linux  [(hd0,0)/boot/vmlinuz-linux UUID]
root   (hd0,0)
kernel /boot/vmlinuz-linux root=UUID=f1df0c45-b003-4bf1-b87c-6916ff15b880 ro
initrd /boot/initramfs-linux.img

Во второй версии всё создастся автоматически, но имеет смысл подправить строчки

set root='hd0,1'

и

linux /boot/...

В search надо заменить UUID.

/etc/fstab

devpts                 /dev/pts   devpts  defaults      0      0
shm                    /dev/shm   tmpfs   nodev,nosuid  0      0
UUID=f1df0c45-b003-4bf1-b87c-6916ff15b880  /  ext2  noatime,nodiratime  0 0
tmpfs                  /tmp       tmpfs   nodev,nosuid  0      0

Можно ещё создать swap-файл, если есть острая необходимость, хотя, надо отдавать себе отчёт в том, что флешка долго такого издевательства не выдержит.

/etc/inittab

Чтобы видеть сообщения системы во время загрузки, полезно внести вот такие изменения:

c1:2345:respawn:/sbin/agetty --noissue --noclear -8 -s 38400 tty1 linux

/etc/sudoers

Создаём пользователя и добавляем его в sudoers (опции по вкусу):

user ALL=(ALL) NOPASSWD: ALL

Отключаем флешку

umount $key_path

Установка загрузчика (для старого GRUB)

grub
grub> find /boot/grub/stage1
grub> root (hd1,0)
grub> setup (hd1)
grub> quit

Обратите внимание, что root в конфигурации GRUB не равен root в момент установки. Это связано с переименованием устройств в момент загрузки с флешки. Строго говоря, это дело зависит от вашего BIOS, на на современных системах всё должно работать именно в такой конфигурации.

Полезные ссылки

Подробный рассказ про то, как изменить размер NTFS-раздела без потери данных. Рассказ очень подробный и качественный. И хот он довольно старый, но у меня всё тоже самое сработал на ntfsresize 3.x.

Если кто-то поковырялся и всё сломал

Такое бывает, если вашу флешку берёт какой-нибудь приятель для восстановления древней системы. Он там наваливает доисторических библиотек и вообще всё портит.

Переустановить все пакеты можно так:

#!/bin/bash
pacman -Q | awk '{ print $1 }' | sort > /tmp/pacman-installed.tmp
pacman -Qm | awk '{ print $1 }' | sort | comm -3 /tmp/pacman-installed.tmp - > /tmp/pacman-to-reinstall.tmp
pacman -S --noconfirm $(cat /tmp/pacman-to-reinstall.tmp)
rm /tmp/pacman-{to-reinstall,installed}.tmp

Простая установка (2014)

За годы существования этой статьи, Arch Linux сильно изменился, многие действия упростились (появились скрипты, которые их автоматизируют). Поэтому здесь я приведу простую инструкцию, актуальную на 2014 год.

Я не буду вдаваться в детали, многие приёмы, описанные выше, не потеряли своей актуальности. Некоторые действия вы, возможно, не доверите скриптам и захотите выполнить по шагам со своими коррективами. Одним словом, я бы советовал иметь ввиду и старую и новую процедуру установки.

Установка Arch Liunx на USB и начальная настройка

Форматирвоать лучше как-то так:

mkfs.ext4 -O ^has_journal /dev/sdXX

Загрузитесь с установочного CD (это можно сделать в виртуальной машине). Смонтируйте флешку в /mnt и поставьте необходимые пакеты (важно установить grub, если вы его будете использовать):

pacstrap /mnt base openssh mc sudo screen base-devel grub

Если вы (резонно) планируете на новой системе сразу воспользоваться Wi-Fi, то обязательно поставьте wpa_supplicant именно сейчас. Сам он не встанет, и netctl не сможет поднять Wi-Fi.

Так же, часто бывают полезны пакет ntfs-3g (ntfsresize именно в нём) и lshw.

Создаём fstab:

genfstab -Up /mnt >> /mnt/etc/fstab

И уходим в новую систему:

arch-chroot /mnt

Тут важно уменьшить влияние базовой системы. Не забудьте удалить переменные типа LANG и LC_ALL. env -i может пригодиться.

Там у вас уже есть bash, mc… чувствуйте себя как дома. Обживаемся:

echo USBArch >/etc/hostname

По желанию можно настроить локаль (/etc/locale.gen, locale-gen, /etc/locale.conf), консоль (/etc/vconsole.conf)… мне это всё на флешке не нужно.

Полезно настроить часовой пояс:

ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

И обязательно(!) надо пересобрать init-образ (хук usb больше не нужен):

mkinitcpio -p linux

и установить загрузчик (осторожно!):

grub-install --target=i386-pc --recheck --debug /dev/sdx # sda? проверьте!
grub-mkconfig -o /boot/grub/grub.cfg

(процедура отличается от вышеописанной, так как версия grub изменилась)

На этом этапе можно создать пользователя:

useradd -m -g users -s /bin/bash a
passwd a
visudo # a ALL=(ALL) ALL

Всё. Можно выходить из chroot и размонтировать флешку:

umount /mnt

Настройка после установки

К сожалению, пока вы в chroot, systemctl работать не будет. Поэтому загружаемся с флешки. Это можно сделать в эмуляторе. Например так:

qemu-system-i386 -hda /dev/sdb

Настраиваем демонов и сеть. Допустим так:

vi /etc/ssh/sshd_config # PermitRootLogin no
# если у вас паранойя: AllowUsers и AllowGroups
systemctl enable sshd
netctl enable profile

Кажется, всё готово.