Установка Debian на физически доступную систему без монитора и клавиатуры

в 15:46, , рубрики: linux, администрирование linux-систем, Серверное администрирование, метки:

Я долгое время имел на руках только ноутбук и вот недавно разжился системным блоком. Без монитора и клавиатуры, иначе говоря, headless-системой. Таким образом возникла задача:

Установить на физически доступную машину Debian, не обладая возможностью подключить к ней монитор или клавиатуру, но имея некоторый набор программно-аппаратных ресурсов.

А именно:

  1. целевая машина с уже выставленным в BIOS Setup «NO ERROR» или «ALL, NO KEYBOARD» порядком POST (иначе процедура упрется в невозможность даже начать загрузку хотя бы чего-нибудь*) и выставленной загрузкой сначала с одного sata-устройства, затем с другого (остальные детали порядка загрузки оказались не важны)
  2. ноутбук
  3. локальная сеть (в моем случае wi-fi-роутер с проводным соединением с целевой машиной и беспроводным — с ноутбуком. Но детали не принципиальны)
  4. доступ в интернет (недорогой и желательно быстрый)
  5. Полудохлый разборный внешний жесткий диск 2.5" с внутренним sata-интерфейсом и внешним usb

Задачу можно считать выполненной, если Debian будет установлен на внутренний жесткий диск целевой машины, и последняя с включением питания будет без вмешательств со стороны пользователя выходить на доступность по SSH.

Схема решения

Оптимальным решением этой задачи стала следующая последовательность действий:

  1. оживить часть объма внешнего жесткого диска, достаточную для установки туда Debian
  2. на ноутбуке выполнить привязку подключенного по usb внешнего жесткого диска к vmdk-файлу средствами VBoxManage из пакета виртуализации Oracle VirtualBox, установить на внешний жесткий диск Debian и скофигурировать его
  3. разобрать внешний жесткий диск и подключить его к целевой машине по интерфейсу sata первым в очереди на загрузку, загрузить машину и подключиться к ней с ноутбука по SSH
  4. выполнить клонирование системы с 2.5" диска на родной для целевой машины 3.5" и переконфигурировать grub2, управляя целевой машиной с ноутбука по SSH

Альтернативные варианты

Вообще говоря, эта задача имеет множество решений. Вместо предложенной схемы на моем месте другой пользователь, в большинстве случаев более опытный и подготовленный, мог бы выбрать один из следующих способов решения:

  1. Изменить существующий дистрибутив Debian так, чтобы он осуществлял автоматическую установку и конфигурацию системы без единого вопроса к пользователю при загрузке с CD/DVD, в том числе необходимым образом разбивал жесткий диск целевой машины на разделы. Для этого нужно будет написать специальный preseed-файл с ответами на все запросы инсталлятора и уповать, что вы все безупречно учли. Подробнее в официальной документации.
  2. Поднять на ноутбуке DHCP-сервер (или воспользоваться услугами роутера), какой-нибудь веб-сервер для публикации preseed-файла и tftp-сервер для передачи начального загрузочного кода pxelinux.0 по сети на целевую машину — то есть, использовать PXE-загрузку (для чего в BIOS Setup должна быть включена поддержка загрузки по сети). Это наиболее мощный подход, никак не использующий важное стратегическое преимущество моей ситуации — физический доступ к целевой машине
  3. Найти подходящий live-cd дистрибутив Linux или изменить существующий (например, с помощью утилиты simple-cdd или других) так, чтобы он загружался без единого вопроса и автоматически поднимал сервер SSH, а затем осуществить ручную установку дистрибутива Debian (этот процесс тоже хорошо описан в документации)
  4. Воспользоваться каким-нибудь другим способом, впрочем, в большинстве случаев он окажется либо комбинацией описанных, либо будет выходить за рамки имеющихся ресурсов: например, мне сильно упростило бы жизнь наличие адаптера usb-sata для 3.5" диска или хотя бы такая мелочь, как переходник «папа-папа» для sata (3.5" диск можно было бы запитать от БП целевой машины и использовать контроллер из 2.5" внешнего диска для подключения его по usb к ноутбуку или вовсе напрямую подключить 3.5" диск к ноутбуку, например, вместо Slim-DVD-привода. При нехитрой сноровке это возможно — но только при наличии подобного переходника)

Немного подробнее

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

Первый этап

Для начала подключим внешний диск (емкость 160 Гб, один раздел на весь диск, файловая система ext3) к ноутбуку с установленной системой Linux и проверим его на ошибки с автоматическим исправлением последних (здесь и далее будем считать команды с префиксом # выполняемые от имени root. Также будем считать, что внешний жесткий диск определяется ноутбуком как устройство sdc):

# fsck -f -y -c /dev/sdc1

-f — проверять диск даже если он помечен как несодержащий ошибок
-y — отвечать «да» на все вопросы автоматически. То есть, просто исправлять все ошибки
-c — искать и помечать битые блоки диска. Для этих целей существует специальная утилита badblocks, но с помощью этой опции вы автоматически пересылаете ее отчет fsck.
Обратите внимание, что вы указываете не диск, а конкретный раздел на нем.
В моем случае проверка «умерла» на 20% выполнения из-за огромного числа ошибок, почему я и принял нехитрое решение создать в начале диска раздел объемом гигабайт 20 (этого более, чем достаточно для установки Debian). Для переразбивки диска удобно пользоваться утилитой cfdisk:

# cfdisk /dev/sdc

В интерактивном режиме вы просто нужным образом конфигурируете диск: я создал в начале диска primary-раздел размером 20 Гб, остальное место оставил пустым (а также заранее пометил его как bootable. Не забудьте перед выходом из программы записать изменения на диск). Затем создаем на нем файловую систему:

# mkfs.ext3 /dev/sdc1

И снова проверяем, что все хорошо:

# fsck -f -y -c /dev/sdc1
Второй этап

Предположим, VirtualBox у вас уже установлен. Тогда создадим vmdk-образ диска, в действительности отображающий все операции с ним на физический диск (предполагаем, что вы находитесь в удобной вам директории, например, ~/VirtualBox VMsdesktop):

# vboxmanage internalcommands createrawvmdk -filename usb-hdd160.vmdk -rawdisk /dev/sdc

Теперь создадим новую виртуальную машину с именем «desktop»:

# vboxmanage createvm --name desktop --ostype Debian --register

Выделим ей подходящий объем оперативной памяти:

# vboxmanage modifyvm desktop --memory 512

Оборудуем контроллером для подлючения жестких дисков и CD/DVD-приводов:

# vboxmanage storagectl desktop --name "sata" --add sata

И подключим наш внешний жесткий диск:

# vboxmanage storageattach desktop --storagectl "sata" --port 0 --type hdd --medium ./usb-hdd160.vmdk

Для того, чтобы отключить диск (нам это еще не раз пригодится), нужно выбрать в качестве medium «ничто»:

# vboxmanage storageattach desktop --storagectl "sata"--port 0 --type hdd --medium none

Теперь пора задуматься, с чего мы будем ставить Debian. Я, при наличии нормального интернет-канала, выбрал «small installation image», вы, при желании, можете выкачать полноразмерный CD или даже DVD. Подробности здесь. Также из-за установки в виртуальной машине придется ограничиться i386-версией — 64-битные гости VirtualBox поддерживает только на хостах с поддержкой аппаратной виртуализации VT-x или AMD-V — этим могут похвастаться только не самые дешевые процессоры. Итак, пусть в текущем каталоге лежит iso-образ Debian, например, debian-6.0.5-i386-netinst.iso. Тогда по образу и подобию подключения жесткого диска подключим и его:

# vboxmanage storageattach desktop --storagectl "sata" --port 1 --type dvddrive --medium ./debian-6.0.5-i386-netinst.iso

Можно запускать машину:

# vboxmanage startvm desktop

(часть этих действий можно выполнить и из графической оболочки VirtualBox. Только при ее запуске не забудьте, что машины по умолчанию создаются только для одного пользователя, потому запускайте графическую оболочку также от имени root. Под обычным пользователем выполнить все эти манипуляции вам удастся едва ли, поскольку для работы с жестким диском нужен привилегированный к нему доступ. Используйте sudo)
Теперь вам нужно пройти через все этапы инсталляции, указать пароли для root и пользователя, а также, и это критически важно, выбрать среди шаблонов инсталляции SSH-сервер. Из-за весьма шаткого состояния диска я при его разбивке минимизировал свои действия — примонтировал существующий раздел как / и не выделял swap-раздел — его можно подключить уже на целевой машине. После завершения установки можете еще поработать в системе, что-то настроить по вкусу, пока к ней есть доступ с клавиатуры и монитора, проверить, что все действительно загружается, отключив iso-образ и т.д.

Третий этап

На третьем этапе все, что нужно — это подключить внешний диск к целевой машине и включить ее. Мне на этом этапе помог роутер, потому что ip машины я подсмотрел на его статус-странице и открыл по этому адресу SSH-сессию с ноутбука:

# ssh root@192.168.0.103

У вас адрес машины скорее всего будет иным.

Четвертый этап

Если все получилось, осталось перенести систему с внешнего диска на внутренний. По поводу этого этапа существует особенно много мнений (в том числе не совсем верных), как его осуществлять, я предложу один. Во-первых, учитывая работу вслепую, будет очень полезно все, описанное в этом разделе, сначала проделать на ноутбуке в виртуальной машине. Следуя этому замечательному руководству и уже сделанным мной замечаниям, вы можете подключить к виртуальной машине «desktop» еще один, действительно виртуальный жесткий диск и, считая, что это внутренний диск целевой машины, потренироваться на нем. В конечном счете вы должны суметь отключить внешний диск и тем не менее загрузить с виртуального ваш Debian. Чтобы еще более приблизить обстановку к «боевой», можете из хост-машины (ноутбука) работать с виртуальной машиной по SSH. Для этого, например, можно оставить настройки сети (NAT) виртуальной машины по умолчанию, но перебросить порты:

# vboxmanage modifyvm desktop --natpf1 "guestssh,tcp,,2222,,22"

(подробности здесь)
Теперь любое обращение к 2222 (номер произволен, но желательно, чтобы он превышал 1024 — по меньшим портам может обращаться только root) порту вашего ноутбука будет пересылаться на 22 порт (стандартный SSH) виртуальной машины. Можете открыть с хоста сессию:

# ssh -p 2222 root@localhost

(скорее всего, localhost ведет по адресу 127.0.0.1). Во-вторых, не стоит весь диск копировать с помощью dd, потому что это долго и не пройдет гладко в большинстве практически реализуемых случаев. Для копирования файловой системы вы можете использовать cp, rsync, но более всего подойдет специальная утилита dump/restore (работает крайне быстро и надежно), да и для восстановления порядка загрузки вы уж точно не отделаетесь копированием с помощью dd записи MBR — современный Debian использует grub2, который любит адресовать диски по уникальным номерам UUID — вы оставите в системе все ссылки на внешний жесткий диск.
Итак, необходимо проделать следующее (целевая машина загружена с внешнего диска, пусть он есть /dev/sda, внутренний диск — /dev/sdb, вы работаете с ноутбука по SSH):
Разбить с помощью cfdisk внутренний диск так же (или почти так же — раздел, в который будете копировать должен вместить предназначенные ему данные):

# cfdisk /dev/sdb

Создать на нем файловую систему:

# mkfs.ext3 /dev/sdb1

Смонтировать ее:

# mount /dev/sdb1 /mnt

И скопировать в нее файловую систему внешнего диска:

# (dump -0f - /) | ( cd /mnt; restore -rf - )

Теперь нужно сконфигурировать grub2. Сначала выполним chroot в скопированную файловую систему:

# mount --bind /dev /mnt/dev
# mount --bind /proc /mnt/proc
# chroot /mnt

Теперь мы фактически находимся в окружении Debian на внутреннем диске целевой машины. Обновим конфигурацию жестких дисков (сейчас там мусор, оставленный виртуальной машиной):

# grub-mkdevicemap

— она автоматически запишется в файл /boot/grub/device.map. Обновим конфигурацию grub2:

# update-grub

Выполним его инсталляцию на внутренний диск:

# grub-install /dev/sdb

(обратите внимание, вы указываете диск, а не раздел на нем)
И снова стоит обновить конфигурацию:

# update-grub

Теперь отменим chroot и выключим систему:

# exit
# halt

Теперь отключите внешний диск и запустите целевую машину снова. Вы должны вновь получить доступ к ней по SSH с ноутбука.
Теперь можно создать и подключить swap-раздел: выделите ему место с помощью cfdisk, затем выполните

# mkswap /dev/hda5
# sync; sync; sync
# swapon /dev/hda5

(sync сбрасывает системные буферы)
возможно, завести раздел home и пр. (можно посмотреть здесь).
Система готова к работе.

Ссылки по теме:

  1. www.linuxreport.org/content/view/67/36/
  2. wiki grub2 на русском

P.S. По поводу реанимации внешнего жесткого диска я задал вопросы на форумах cyberforum.ru и oszone.net. Буду благодарен за любые идеи, изложенные в любом удобном вам месте.

Автор: ramntry

* - обязательные к заполнению поля