В этой заметке рассказано, как, имея работающий 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"
# монтируем
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. Вполне вероятно, что умолчальные настройки не позволят загрузиться сразу.
blkid $key
f1df0c45-b003-4bf1-b87c-6916ff15b880
Далее используем его.
Хотя эти фокусы прокатывают далеко не всегда. Возможно, в вашем случае единственный рабочий вариант — /dev/sda1
Для старой версии
# /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
.
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-файл, если есть острая необходимость, хотя, надо отдавать себе отчёт в том, что флешка долго такого издевательства не выдержит.
Чтобы видеть сообщения системы во время загрузки, полезно внести вот такие изменения:
c1:2345:respawn:/sbin/agetty --noissue --noclear -8 -s 38400 tty1 linux
Создаём пользователя и добавляем его в sudoers (опции по вкусу):
user ALL=(ALL) NOPASSWD: ALL
umount $key_path
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
За годы существования этой статьи, Arch Linux сильно изменился, многие действия упростились (появились скрипты, которые их автоматизируют). Поэтому здесь я приведу простую инструкцию, актуальную на 2014 год.
Я не буду вдаваться в детали, многие приёмы, описанные выше, не потеряли своей актуальности. Некоторые действия вы, возможно, не доверите скриптам и захотите выполнить по шагам со своими коррективами. Одним словом, я бы советовал иметь ввиду и старую и новую процедуру установки.
Форматирвоать лучше как-то так:
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
Кажется, всё готово.