понедельник, 30 марта 2015 г.

Headless Network Attached Storage Startup With Pre-Imaged Arch Linux Arm

Концепция "Headless system startup from pre-fabricated systsm image" 


NAS является "headless device" - устройством без монитора и клавиатуры. 
В нашем упражнении под  именем "headless device" выступает ZyXEL NSA 325 v2 
Установка отличной от заводской ОС в интерактивном режиме на "headless device" невозможна, поэтому необходимо программно модифицировать способ загрузки устройства [5] и воспользоваться специально подготовленным продуктом: HDD с полуфабрикатом - образом системы Linux.

В данном упражнении мы сделаем продукт, взяв сборку Arch Linux arm для Marvell Kirkwood. 
Продукт включает минимальный набор служб, необходимый и достаточный для запуска "чёрного ящика" и удалённого управления "чёрным ящиком" после загрузки системы:  

  • Драйверы HDD и сети; 
  • open ssh; 
  • nano (экранный редактор); 
  • systemd-networkd (служба, которая "подцепит" IP-адрес по протоколу DCHP) 
Условимся называть этот продукт: "Linux image HDD". 

Подготовка  Linux image HDD для запуска "headless device" 

Установка Linux image HDD в headless device требует выполнения следующего сценария.  Сценарий излагается с умолчаниями и допущениями. Он  включает в себя шаги (всего 13), необходимые и достаточные для подготовки  Linux HDD для запуска "headless device": 

1) Установить виртуальный  (virtual box) Arch Linux  на  host-систему (Windows 7, Mac Os X)  [2]; 

2) Выполнить минимальную подготовку guest Arch Linux 
  • настроить список зеркал pacman, освежить таблицы pacman 
  • установить sudo,   
  • добавить обычного (не root) пользователя,  
  • разрешить пользователям доступ к sudo  [2]; 
3) Скачать образ ArchLinuxARM-kirkwood-latest  [3]; 

4) Скопировать образ ArchLinuxARM-kirkwood-latest в виртуальную Arch Linux; 
В данном примере мы работаем  в /home/medv/make-NAS виртуальной Arch Linux 

5)  Переименовать ArchLinuxARM-kirkwood-latest в rootfs.tgz; 

6) Cоздать в /home/medv/make-NAS скрипт, который сделает за нас основную работу.  
В данном примере мы создадим fdisk-sd.sh (команды далее на экране оттестированы. Их можно скопировать в скрипт).   

#!/bin/sh 

### 
#  setup the partitions on the disk (sda) 
#  : 16M 1st partition, ext2/3 
echo "- parition sdb" 
fdisk /dev/sdb <<EOF 
o 
n 
p 
1 

+16M 

n 
p 
2 


p 
w 

EOF 
echo " * pause for ioctl to re-sync partitions" 
sleep 5 
### 
#  make filesystems 
echo "- make filesystems" 
#  ext2 makes u-boot happy. 
mkfs.ext2 -L "boot" /dev/sdb1 
#  stock does not know how to make ext4! 
mkfs.ext4 -L "rootfs" /dev/sdb2 

### 
#  make dirs & mount 
echo "- mount destination" 
#mkdir -p /tmp/boot 
mount -t ext2 /dev/sdb1 /mnt/boot 
#mkdir -p /tmp/rootfs 
mount -t ext4 /dev/sdb2 /mnt/rootfs 

### 
#  prepare the system 
#  extract the rootfs 
echo "- extract rootfs" 
tar xzf rootfs.tar.gz -C /mnt/rootfs/ 

#  copy the uImage to the boot partition 
echo "- prepare boot partition" 
cp -aR /mnt/rootfs/boot/* /mnt/boot/ 

#  always make sure you're sync'd! 
sync 
umount  /mnt/rootfs 
umount  /mnt/boot 


7)  Подключить к виртуальной Arch Linux HDD (120 GB is enough); 

8) Выполнить команду  

$sudo fdisk -l  

9) Запомнить имя HDD: /dev/sdb 



10) Открыть скрипт и убедиться, что в нём находится действительно имя подключенного HDD (/dev/sdb в данном примере)
При необходимости отредактировать имя и сохранить изменения; 

11) Выполнить скрипт. 
Скрипт разобьёт  Linux startup HDD на разделы, отформатирует их, распакует образ rootfs.tgz во второй  раздел. Затем скрипт скопирует загрузчик из второго раздела в первый раздел и демонтирует  Linux startup HDD; 


12) Подготовка образа системы на Linux startup HDD для headless system закончена.  Сценарий подготовки диска с образом выполнен.  Отключить Linux startup HDD от guest Arch Linux. 

 

Linux headless start up 

Перед установкой подготовленного диска в шасси "headless system" мы программно модифицируем (хакнем) метод загрузки устройства.  
ВНИМАНИЕ. Это псевдо-необратимая модификация. Она откатываема, но потребуется дополнительное оборудование и разборка - сборка NAS. 
После модификации будет у Вас другой NAS. С другими свойствами. 
Концепция подробно рассматривается в Приложении 2.  
Автоматизированная реализация (скрипт, использующий hook usb_key_func.sh [7]) доступна для скачивания на archlinuxarm.org в секции ZyXEL NSA 325.  
Продолжайте, если Вы понимаете, что и зачем делаете 
Проверьте, сделаны ли резервные копии данных.   
Если надо, сделайте резервные копии. 

Возможны успешный и неуспешный сценарии. 

В случае неуспеха: 
  • Снять Linux startup HDD, смонтировать в виртуальном Arch Linux  и проанализировать логи (см документацию arch linux: systemd, journalctl).  
  • Возможно, у Вас до загрузки не дойдёт, и Вам придётся отхаркнуть обратно загрузчик, подключаясь к модулю загрузчика консольным кабелем [4], [5]. 
Далее переходим к рассмотрению успешного сценария.  
1) Установить  Linux startup HDD к headless system и включить  систему

Примечание.  
LED-индикаторы Вашей системы и кнопка Выкл (за исключением случаев, когда поддержка LED и кнопки Вашего устройства встроена в ядро незаводской сборки Linux) в лучшем случае не заработают. В худшем - заработают не так, как Вы привыкли ожидать.  Пусть Вас это не смущает. Выполняйте сценарий до конца. 

2) Система запущена. Проверим, можете ли вы войти в неё по ssh 
   

Подключение к headless системе по ssh 

1) Определим IP-адрес, случайно назначенный системе (headless system with unknown IP) по протоколу DHCP. Для этого нам потребуется знание mac-адреса устройства. В данном примере адресок известен: 

5c:f4:ab:e7:d1:82 

Запишем его.
2) На компьютере, который подключён к IP-подсети (255.255.255.0), в которой работает headless system with unknown IP, выполняем команду "широковещательный пинг": 

ping -c 20 192.168.1.255 

В зависимости от системы, формат команды может быть:

ping -c -b 20 192.168.1.255 

Команда пропеленгует устройста, находящиеся в подсети /24. 
Выполняем команду   

medv-MBP-3:~ medv$ arp -a 
? (192.168.1.1) at 0:1f:c6:ef:68:5e on en1 ifscope [ethernet] 
? (192.168.1.3) at 5c:f4:ab:e7:d1:82 on en1 ifscope [ethernet] 
? (192.168.1.4) at 0:1f:f3:0:9f:d8 on en1 ifscope [ethernet] 
? (192.168.1.21) at e0:f8:47:39:f7:26 on en1 ifscope permanent [ethernet] 
? (192.168.1.28) at 8:0:27:d1:73:c6 on en1 ifscope [ethernet] 
? (192.168.1.255) at ff:ff:ff:ff:ff:ff on en1 ifscope [ethernet] 
? (224.0.0.251) at 1:0:5e:0:0:fb on en3 ifscope permanent [ethernet] 

Замечаем адресок 5c:f4:ab:e7:d1:8 и запоминаем ip-адрес 192.168.1.3 
Подключаемся к headless-системе (из документации мы знаем, что в образе есть пользователь root с паролем root):  
$ssh root@192.168.1.3 
Если мы подошли к данному пункту и увидели символ приглашения # (см строки ниже на экране),  
считаем что система доступна для управления 

The authenticity of host '192.168.1.3 (192.168.1.3)' can't be established. 
RSA key fingerprint is ~~~~~~~~~~~~~~~~~~. 
Are you sure you want to continue connecting (yes/no)? yes 
Warning: Permanently added '192.168.1.3' (RSA) to the list of known hosts. 
root@192.168.1.3's password:  
Last login: Fri Mar 27 23:19:08 2015 from 192.168.1.25 
[root@alarm ~]#  

Мы подняли NAS. Test passed 

Отключение DCHP и назначение статического IP-адреса 

1) Определим имя logical link channel - устройства (уровня "канала логического подключения к сети" - или попросту "ethernet").   

$ip link 



2) Запомним имя (eth0); 
3) Опционально.

Предположим, что нам известно, что в "образе" с сетью работает служба systemd-networkd. Поверяем, запущена ли служба: 



$systemctl  

Служба запущена: редактируем её конфигурацию.   

4) Редактируем  файл /etc/systemd/network/eth0.network  

$sudo nano /etc/systemd/network/eth0.network 

Имя eth0 запомнено нами два шага тому назад. Красным помечена закомментированная строка, синим - добавленные. 

[Match] 
Name=eth0 

[Network] 
#DHCP=BOTH 
DNS=62.58.153.220 

[Address] 
Address=192.168.1.3/24 

[Route] 
Gateway=192.168.1.1 

5) Перезагружаем устройство 

$ sudo reboot 

6) Тестируем подключения по  ssh с указанием статически назначенного адреса 192.168.1.3:  

7) Успешно войдя через ssh, пеленгуем какой-нибудь известный Интернет-ресурс 

$sudo ping delevendearchitectuur.blogspot.com -c 3 
PING blogspot.l.googleusercontent.com (74.125.136.132) 56(84) bytes of data. 
64 bytes from ea-in-f132.1e100.net (74.125.136.132): icmp_seq=1 ttl=47 time=35.2 ms 
64 bytes from ea-in-f132.1e100.net (74.125.136.132): icmp_seq=2 ttl=47 time=35.2 ms 
64 bytes from ea-in-f132.1e100.net (74.125.136.132): icmp_seq=3 ttl=47 time=35.9 ms 

8) Мы подняли NAS и настроили статический IP-адрес. 
Система работоспособна и готова к дальнейшим надругательствам - Test passed 


Публикации, ссылки (урл меняются, поэтому указаны заголовки и ключевые слова) 


  1. Arch Linux  Downloads 
  2. YouTube. MidFingr. Arch Linux VirtualBox Install (May 2013)  
  3. Arch Linux ZyXEL NSA325 
  4. http://trweb.cwsurf.de ZyXEL NSA325 v2 Arch Linux ARM (ALARM) auf interne SATA HDD installieren und booten 
  5. http://zyxel.nas-central.org Usb key func.sh (usb_key_func.sh) 

Спецификации 

ZyXEL NSA 325 V2 платформа Marvell Kirkwood 1.6GHz. см сайт ZyXEL 

Приложения 

Приложение 1 ZyXEL NSA325 v2 Default U-Boot Environment Firmware V4.61(AALS.0) 

~ # fw_printenv  bootargs=console=ttyS0,115200 mtdparts=nand_mtd:0x100000(uboot),0x80000(uboot_env),0x80000(key_store),0x80000(info),0xA00000(etc),0xA00000(kernel_1),0x2FC0000(rootfs1),0xA00000(kernel_2),0x2FC0000(rootfs2) root=/dev/nfs rw init=/init bootcmd=nand read.e 0x2000000 $(kernel_addr) 0xA00000; bootm 0x2000000  baudrate=115200  loads_echo=0  ipaddr=10.4.52.165  serverip=10.4.52.7  rootpath=/srv/ubuntu  netmask=255.255.255.0  nandEcc=1bit  kernel_addr=C80000  MODEL_ID=AE03  PRODUCT_NAME=NSA-325v2  FEATURE_BIT=00  CONTRY_TYPE=FF  VENDOR_NAME=MitraStar Technology Corp.  run_diag=yes  ethaddr=28:28:5D:1D:9D:28  bootdelay=2  ~ # 

Приложение 2 U-Boot Environment für das Booten von Arch Linux ARM von Festplatte vorbereiten 

Wir loggen uns via telnet (oder Serial) in das Zyxel NAS ein und führen exakt folgende Kommandos aus: 
fw_setenv arcNumber 4495 fw_setenv mainlineLinux yes fw_setenv bootargs_stock 'console=ttyS0,115200 mtdparts=nand_mtd:0x100000(uboot),0x80000(uboot_env),0x80000(key_store),0x80000(info),0xA00000(etc),0xA00000(kernel_1),0x2FC0000(rootfs1),0xA00000(kernel_2),0x2FC0000(rootfs2) root=/dev/nfs rw init=/init' fw_setenv bootargs_linux 'console=ttyS0,115200 mtdparts=nand_mtd:0x100000(uboot),0x80000(uboot_env),0x80000(key_store),0x80000(info),0xA00000(etc),0xA00000(kernel_1),0x2FC0000(rootfs1),0xA00000(kernel_2),0x2FC0000(rootfs2) root=/dev/sda2 rw rootwait loglevel=8' fw_setenv bootcmd_linux 'setenv bootargs $(bootargs_linux); ide reset; ext2load ide 0:1 $(loadaddr) /uImage; bootm $(loadaddr)' fw_setenv bootcmd_stock 'setenv bootargs $(bootargs_stock); nand read.e $(loadaddr) $(kernel_addr) 0xA00000; bootm $(loadadr)' fw_setenv to_stock "setenv mainlineLinux no; setenv bootcmd \'run bootcmd_stock\'; saveenv; reset" fw_setenv to_linux "setenv mainlineLinux yes; setenv bootcmd \'run bootcmd_linux\'; saveenv; reset" fw_setenv bootcmd 'run to_linux' 

Комментариев нет:

Отправить комментарий