Домашний роутер с PXE-Boot и сервисами.

Posted: 2015-12-13 in Hardware, Networks
Метки:,

Всем привет.
В прошлой заметке я немного описал базовые настройки своего нового домашнего роутера, рассказал, чем он хорош, чем полезен домашний DPI и что мне вообще надо от такой девайсины. Как выяснилось, я использую значительную часть возможностей прошивки, значительная часть возможностей в планах на использование в будущем (прежде всего возможности VPN и модуля DPI), но потребовались и расширенные возможности, которые ставятся и настраиваются вне веб-морды.
Если вам интересно — ssh admin@192.168.1.1 -p 22 и поехали.

Сперва немного лирики и общих слов про файловые системы и консольные команды. Merlin-Firmware — это Linux-based прошивка с открытыми исходниками, устанавливаемая на роутеры Asus среднего и старшего ценовых диапазонов, и способная как полноценно использовать аппаратную часть, так и обеспечивать работу дополнительных линуксовых средств — таких, как свои собственные скрипты, правила файервола, сетевые службы и прочие.

В роутере есть несколько областей встроенной постоянной памяти:

* NVRAM — небольшая микросхема памяти, хранящая произведённые в веб-морде настройки. Он очень небольшой, поэтому настройки там хранятся в бинарном виде, возможно дополнительно сжатом. Сохраняется между перепрошивками, но в силу своей бинарной сущности может потребоваться его переписать заново, если фирмварь сильно поменялась. Именно для этого делается сброс сразу после перепрошивки — бинарные данные от другой фирмвари могут очень неадекватно повлиять на поведение и настройки основной прошивки. Настройки, сохранённые там, убить можно только «сбросом до заводских», поэтому там стараются хранить максимум конфига системы. Именно из-за хранения в NVRAM у нас есть лимит на 30 PPTP-клиентов и размер ключей OpenVPN равный 4000 символов на каждый ключ.

* FLASH-раздел для собственно прошивки. Тут лежит бинарный образ основной прошивки. Меняется он только весь и сразу, при обновлении прошивки. Размер под 30 Мб — весьма и весьма крупная.

* JFFS-раздел. Часть флеша, отведённая для самописных скриптов и расширенных конфигов. Включается опцией в веб-морде.
Пересоздаётся каждый раз при перепрошивке роутера или если выбрать опцию в веб-морде «Format JFFS» и ребутнуться. Размер около 63 Мб.

Заходим на роутер по SSH и смотрим:


admin@router:/# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 28.9M 28.9M 0 100% /
devtmpfs 124.8M 0 124.8M 0% /dev
tmpfs 124.9M 1.6M 123.2M 1% /tmp
/dev/mtdblock4 62.8M 4.7M 58.0M 8% /jffs
/dev/sda1 56.9G 16.0G 38.0G 30% /tmp/mnt/San64Gb

admin@Dobrouter:/# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=127752k,nr_inodes=31938,mode=755)
proc on /proc type proc (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
/dev/mtdblock4 on /jffs type jffs2 (rw,noatime)
usbfs on /proc/bus/usb type usbfs (rw,relatime)
/dev/sda1 on /tmp/mnt/San64Gb type ext4 (rw,nodev,relatime,barrier=1,data=ordered)
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)

Видим файловую систему основной прошивки, рамдиск в половину памяти, JFFS-раздел и нашу флешку.
JFFS-раздел относится к устройству mtdblock4, а всего таких блоков 6 штук:

admin@router:/# ls /dev/mtdblock* -la
brw------- 1 admin root 31, 0 Jan 1 1970 /dev/mtdblock0
brw------- 1 admin root 31, 1 Jan 1 1970 /dev/mtdblock1
brw------- 1 admin root 31, 2 Jan 1 1970 /dev/mtdblock2
brw------- 1 admin root 31, 3 Jan 1 1970 /dev/mtdblock3
brw------- 1 admin root 31, 4 Jan 1 1970 /dev/mtdblock4
brw------- 1 admin root 31, 5 Jan 1 1970 /dev/mtdblock5

Трогать их не требуется, просто для справки.

Сперва софт. Качаем скрипт для развёртывания OptWare-NG:
https://www.hqt.ro/how-to-install-new-generation-entware/
и ставим по мануалу.
Я не стал делать раздел подкачки, поскольку ставить торрент-клиент и сервис видеонаблюдения на роутер не планирую.

После выполнения скрипта у нас появится такая конструкция из симлинков:
admin@router:/# ls -l /opt
lrwxrwxrwx 1 admin root 7 Nov 2 18:46 /opt -> tmp/opt
admin@router:/# ls -l /tmp/opt
lrwxrwxrwx 1 admin root 31 Aug 1 03:00 /tmp/opt -> /tmp/mnt/San64Gb/entware-ng.arm

Теперь у нас в /opt есть небольшое линукс-окружение с пакетным менеджером и репозитариями.
Ставим софт, пакетный менеджер называется opkg, встроенный ман по opkg —help.

Например, для поиска по фразе tftpd выдаёт такое:

# opkg find *tftpd*
iputils-tftpd - 20101006-1 - Program tftpd from iputils
Trivial File Transfer Protocol server.
tftpd-hpa - 5.2-1 - An enhanced version of the BSD TFTP server

Я поначалу пробовал использоавть TFTP-сервер, встроенный в DNSMASQ. Но то ли он туда не вкомпилен, то ли ещё чего. В итоге TFTP-сервер я поставил отдельным оптваре-пакетом tftpd-hpa.

В качестве дополнительного веб-сервера (нужен для установки по сети всяких федор и прочего) ищем Lighttpd:

# opkg find *lighttp*
lighttpd - 1.4.37-1 - A flexible and lightweight web server
lighttpd-mod-access - 1.4.37-1 - Access restrictions module
lighttpd-mod-accesslog - 1.4.37-1 - Access logging module
lighttpd-mod-alias - 1.4.37-1 - Directory alias module
lighttpd-mod-auth - 1.4.37-1 - Authentication module
lighttpd-mod-cgi - 1.4.37-1 - CGI module
lighttpd-mod-cml - 1.4.37-1 - Cache Meta Language module
lighttpd-mod-compress - 1.4.37-1 - Compress output module
lighttpd-mod-evasive - 1.4.37-1 - Evasive module
lighttpd-mod-evhost - 1.4.37-1 - Exnhanced Virtual-Hosting module
lighttpd-mod-expire - 1.4.37-1 - Expire module
lighttpd-mod-extforward - 1.4.37-1 - Extract client module
lighttpd-mod-fastcgi - 1.4.37-1 - FastCGI module
lighttpd-mod-flv_streaming - 1.4.37-1 - FLV streaming module
lighttpd-mod-magnet - 1.4.37-1 - Magnet module
lighttpd-mod-mysql_vhost - 1.4.37-1 - Mysql virtual hosting module
lighttpd-mod-proxy - 1.4.37-1 - Proxy module
lighttpd-mod-redirect - 1.4.37-1 - URL redirection module
lighttpd-mod-rewrite - 1.4.37-1 - URL rewriting module
lighttpd-mod-rrdtool - 1.4.37-1 - RRDtool module
lighttpd-mod-scgi - 1.4.37-1 - SCGI module
lighttpd-mod-secdownload - 1.4.37-1 - Secure and fast download module
lighttpd-mod-setenv - 1.4.37-1 - Environment variable setting module
lighttpd-mod-simple_vhost - 1.4.37-1 - Simple virtual hosting module
lighttpd-mod-ssi - 1.4.37-1 - SSI module
lighttpd-mod-status - 1.4.37-1 - Server status display module
lighttpd-mod-trigger_b4_dl - 1.4.37-1 - Trigger before download module
lighttpd-mod-userdir - 1.4.37-1 - User directory module
lighttpd-mod-usertrack - 1.4.37-1 - User tracking module
lighttpd-mod-webdav - 1.4.37-1 - WebDAV module
rtorrent-easy-install - 0.2-2 - This pakage helps to configure rtorrent with rutorrent web interface. Please
note, we assuming no lighttpd installed\configured on your system before!.
Just answer a few question to get torrent-client working.

Он гораздо легковеснее апача и нгинкса, а на роутере нам подойдёт минимальный веб-сервер, способный быстро отдавать файлы.
Хотя и к нему можно поставить модули с виртуальными хостами, Fast-CGI и FLV-стримингом =)
admin@router:/# opkg info lighttpd | grep Size
Size: 95948
admin@router:/# opkg info apache | grep Size
Size: 596729
admin@router:/# opkg info nginx | grep Size
Size: 292577

Теперь поставим наш любимый софт:
opkg install mc htop nmap tcpdump
okpg install tftpd-hpa lighttpd

и посмотрим как он выглядит:

Asus_RT-AC69U_UnixSoft-animated

Ну и немного стандартных команд перед тем, как перейти к настройке:


admin@router:/tmp/home/root# uname -a
Linux router 2.6.36.4brcmarm #1 SMP PREEMPT Mon Nov 2 10:07:03 EST 2015 armv7l GNU/Linux

admin@router:/tmp/home/root# cat /proc/cpuinfo
Processor : ARMv7 Processor rev 0 (v7l)
processor : 0
BogoMIPS : 1599.07

processor : 1
BogoMIPS : 1595.80

Features : swp half thumb fastmult edsp
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc09
CPU revision : 0

Hardware : Northstar Prototype
Revision : 0000
Serial : 0000000000000000

# cat /proc/mtd
dev: size erasesize name
mtd0: 00080000 00020000 "boot"
mtd1: 00180000 00020000 "nvram"
mtd2: 03e00000 00020000 "linux"
mtd3: 03c65718 00020000 "rootfs"
mtd4: 03ec0000 00020000 "brcmnand"
mtd5: 00140000 00020000 "asus

Вообщем, сплошная радость.

Бэкап настроек
Скачиваем с форума Мерлина готовый скрипт nvram-save и копируем на флешку в роутере по SSH:
http://www.snbforums.com/threads/user-nvram-save-restore-utility-r22.19521/
Даём скрипту nvram-save.sh атрибут +X, запускам. Он будет долго и печально вычитывать NVRAM и прочее,
в итоге создаст пачку файлов с датой создания бэкапа в имени:

# ls *2015*
nvram-all-20151207-50E8.txt nvram-restore-20151207-50E8.sh nvram-usr-20151207-50E8.txt

jffs-20151207-50E8:
configs scripts syslog.log traffic.db wrs_vp.txt
openvpn signature syslog.log-1 usericon

Что ценно — упакует он как все настройки из NVRAM и прочей памяти для настроек, так и наши скрипты с конфигами и ключами из JFFS. Данный бэкап — текстовый, и его можно переносить на роутеры с более новой прошивкой. Важно: некоторые секреты хранятся там в открытом виде (например, ключи VPN-сервисов и пароли), поэтому хранить его следует в сухом, тёмном и прохладном месте.
После перепрошивки и сброса просто запускам скрипт nvram-restore-20151207-50E8.sh , а в JFFS распаковываем архив — все настройки встанут как были.

Настройка PXE.

У меня уже был ранее настроенный PXE, поэтому я для начала просто скопировал с рабочей машины /var/lib/tftpboot на роутерную флешку в /tmp/mnt/San64Gb/tftpboot.

Работу c JFFS мы уже включили в веб-морде роутера, теперь добавим дополнительный конфиг для DNSMASQ, чтобы клиенты смогли воспользоваться PXE:

# cat /jffs/configs/dnsmasq.conf.add
dhcp-boot=pxelinux.0
dhcp-option=br0,66,192.168.1.1

Теперь настроим сам tftpd-hpa:

# cat /tmp/mnt/San64Gb/entware-ng.arm/etc/xinetd.d/tftp
service tftp
{
flags = REUSE
socket_type = dgram
protocol = udp
instances = 30
wait = yes
user = admin
server = /opt/sbin/tftpd-hpa
server_args = -s /tmp/mnt/San64Gb/tftpboot
cps = 100 2
log_on_success = HOST PID
log_on_failure = HOST
disable = no
}

Важный момент — расшаривать tftpboot по самбе или NFS не нужно — там обычно совершенно свои файлы, отдавать которые в сеть другим способом не требуется!

В конфиге /tmp/mnt/San64Gb/entware-ng.arm/etc/lighttpd/lighttpd.conf поставим server.port = 82, чтобы он не помешал никаким другим веб-серверам ни на роутере, ни при пробросе портов.

Пропишем в автозагрузку:

admin@router:/# service enable_lighttpd

Done.
admin@router:/# service enable_tftpd-hpa

Done.

Теперь пробуем загрузиться на виртуалке, сбридженной со смотрящим на роутер интерфейсом — после правки PXE-менюшек и прописывания правильного IP-адреса роутера загружаемые целиком по TFTP системы (дискетные образы и RiPLinux) должны запуститься сразу и без проблем.

Asus_RT-AC69U_NetBoot_main_Animated

Варианты загрузки и vesa-менюшки.
Теперь про каждый из вариантов и типов загрузки. Я убил изрядное количество времени на поиск и чтение мануалов, и мне есть чем поделиться =)

1). Самое простое — модули .c32 и сразу готовые к загрузке ядра.
Конструкция вида:

LABEL grub
MENU LABEL ^GRUB
KERNEL grub.exe

Добавляет пункт PXE-меню GRUB, загружает grub-шелл. Пути к tftp-образам указываются относительно корня tftp!
Аналогичным образом запускаются memtest и .c32-модули

LABEL m501
MENU LABEL ^Memtest86+ 5.01
KERNEL imgflop/lowlevelhard/memtest86+-5.01

LABEL PowerOFF
MENU LABEL ACPI PowerOFF
KERNEL poweroff.c32

LABEL R^eboot
MENU LABEL Reboot
KERNEL reboot.c32

Asus_RT-AC70U_NetBoot_memtest

2). Чуть посложнее — ядро + образ из параметра APPEND.
Таким образом делают многоуровневые меню — в качества ядра указывает бинарь, рисующий меню (vesamenu.c32 или menu.c32), параметрами — конфиги меню нижележащего уровня:

LABEL fedora
MENU LABEL ^Fedora Linux
KERNEL vesamenu.c32
APPEND pxelinux.cfg/graphics.conf pxelinux.cfg/fedora.menu

Таким же способом грузятся линукс-системы, где в initrd упакована вся система целиком. Например, так можно загрузить
RiPLinux, LiveCD от AVG и Касперыча, микросборки TinyCore, Акронис и ещё много чего :

LABEL RiP Linux (32-bit kernel)
KERNEL /livecd/riplinux/kernel32
APPEND initrd=/livecd/riplinux/rootfs.cgz vga=normal root=/dev/ram0 rw

label adds
menu label A^cronis Disk Director Server 10.0.2169 FULL RU
kernel /livecd/acronis/adds.krn
append initrd=/livecd/acronis/adds.fs vga=788 root=/dev/ram0 ramdisk_size=65535 init=acronis vga vesa mbrcrcs on quiet acpi=off noapic

LABEL Kaspersky Antivirus
MENU LABEL Kaspersky Rescue CD 10.0.32.17 [Gentoo, 3.4.24 i686]
KERNEL livecd/Kaspersky/rescue
APPEND initrd=livecd/Kaspersky/rescue.igz root=live rootfstype=auto vga=791 init=/init kav_lang=ru udev liveimg doscsi nomodeset

label AVG
menu label AVG 13.0.3115 Rescue CD 140716 [VirDB 3684/8645 2014-11-28]
kernel livecd/AVG_Antivirus/vmlinuz
append max_loop=255 vga=791 initrd=livecd/AVG_Antivirus/initrd.lzm init=linuxrc reboot=bios

LABEL tc
MENU LABEL TinyCore 6.4.1 Minimal
KERNEL livecd/TinyCore/vmlinuz
APPEND initrd=livecd/TinyCore/core.gz

Asus_RT-AC69U_NetBoot_KasperRescueCD_Animated

Ну и самое зверское и жестокое — модуль memdisk. Это такое ядрышко, которое грузит по tftp в память жертвы образ дискеты, CD-диска или HDD и передаёт туда загрузку. Идеальная штука для загрузки DOS-утилит — типа Ghost-Floppy, MHDD, Victoria, BIOS-флешеров, BIOS-патчеров, FFORMAT-а и прочего вечно живого DOS-софта. Из тяжелых образов нормально работает полновесный FreeDOS. Важно — memdisk размещает загружаемый образ в оперативке! Это же касается крупных образов initrd. И если памяти не хватит — всё сломается.

Asus_RT-AC69U_NetBoot_MemDisk_Fail

Поэтому сильно тяжелые образы — плохая идея для загрузки через мемдиск и применяться может только от печали и безысходности. И всегда для сетевой загрузки желательно иметь варианты легковесных образов.
Примеры конфигов:

label ntorepw
menu label ^NT Offline Registry Editor & Password Recovery
kernel memdisk
append initrd=imgflop/ntorepw.bin

label vcr352
menu label ^Victoria 3.5.2
kernel memdisk
append initrd=imgflop/lowlevelhard/vcr352.img

label ghost
menu label ^Ghost Floppy
kernel memdisk
append initrd=imgflop/Ghost_USB.ima

label fformat_flop
menu label FFORMAT - Floppy Image
kernel memdisk
append initrd=imgflop/FFORMAT.ima

label fformat_hdd
menu label FFORMAT - HDD Image
kernel memdisk
append harddisk initrd=imgflop/FFORMAT_hda.dd

label kolibri
menu label ^Kolibri
kernel memdisk
append initrd=imgflop/kolibri_0.7.7.0.img

label plan9
menu label Pl^an 9 0.o
kernel memdisk
append initrd=imgflop/plan9.flp

LABEL bios_288
MENU LABEL BIOS Upgrade Floppy (2.88 M)
kernel memdisk
append initrd=imgflop/BIOS_288.ima

LABEL freedosf
MENU LABEL FreeDOS 1.0 Full CD
kernel memdisk
append raw iso initrd=livecd/FreeDOS/fdfullcd.iso

Asus_RT-AC71U_NetBoot_MemDisk_FFORMAT-from_PXE_Animated

Параметр APPEND + iso / raw iso / floppy / harddisk позволяют грузить много чего необычного.

При наличии многа_памяти и везении можно даже загрузить тяжеловесные ISO-хи типа HirenBoot CD и содержащуюся там WinPE.

Asus_RT-AC69U_NetBoot_WinPE_HirenBootCD-PXE
Сборка не полная, многие пакеты отсутствуют. Удивительно, что виндовс вообще смогла запуститься таким необычным для неё способом =)

Но в этом случае никаких гарантий — Alkid CD, Infra CD и микросборки типа WinXP_75Мб от такой радостной вакханалии грузятся сразу в синий экран.
Asus_RT-AC71U_NetBoot_WinXP_BSOD
Линуксы таким варварским способом грузить обычно не требуется, там всё сделано гораздо более по-уму.

3). То же самое, но после загрузки ядра и инитрд-образа делается подгрузка остальной части системы уже вторым соединением и из другого ядра.
Так грузятся DSL Linux, GParted и Clonezilla, инсталляторы федоры и центоза, некоторые LiveCD. Протоколы — TFTP и HTTP. Просто дописываем ещё один параметр:


label dsl
menu label ^Damn Small Linux 4.4
kernel livecd/dsl/linux24
append initrd=livecd/dsl/minirt24.gz boot_image=livecd/dsl/KNOPPIX ramdisk_size=100000 init=/etc/init lang=us apm=power-off vga=791 nomce noapic quiet

LABEL clz-live
MENU LABEL Clonezilla 2.2.4 Live (RAM)
KERNEL livecd/clonezilla-2.2.4/vmlinuz
APPEND initrd=livecd/clonezilla-2.2.4/initrd.img boot=live config noswap nolocales edd=on nomodeset ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_keymap="" ocs_live_batch="no" ocs_lang="" vga=788 nosplash noprompt fetch=tftp://192.168.1.1/livecd/clonezilla-2.2.4/filesystem.squashfs

LABEL GParted
MENU LABEL G^Parted
KERNEL livecd/gparted/vmlinuz
APPEND initrd=livecd/gparted/initrd.img fetch=http://192.168.1.1:82/4tftp/gparted.squashfs boot=live union=aufs noswap noprompt vga=788

LABEL Debian 7 x64 LiveCD
KERNEL livecd/Debian7live/vmlinuz_x64
APPEND initrd=livecd/Debian7live/initrd_x64 boot=live fetch=tftp://192.168.1.1/livecd/Debian7live/filesystem.squashfs root=/dev/ram0 rw

Asus_RT-AC69U_NetBoot_GParted-PXE

Работает без проблем, но память кушает на величину размера SquashFS-образа.

Установщики дебиана и убунты оказались тривиальны в установке:
просто распоковываем готовые архивы в корень tftp и прописываем в менюшке:
LABEL debian
MENU LABEL ^Debian Linux
KERNEL vesamenu.c32
APPEND pxelinux.cfg/graphics.conf pxelinux.cfg/debian.menu

LABEL ubuntu
MENU LABEL ^Ubuntu Linux
KERNEL vesamenu.c32
APPEND pxelinux.cfg/graphics.conf pxelinux.cfg/ubuntu.menu

Файл менюшки для выбора платформы:

# cat debian.menu
PROMPT 0
MENU BACKGROUND pxelinux.cfg/debian.jpg
MENU TITLE PXE Linux [Debian 8.2] Asus RT-AC68U 192.168.1.1

LABEL deb82
MENU LABEL Debian Linux 8.2 [ i^386 ] Jessie
KERNEL menu.c32
APPEND debian-installer/i386/pxelinux.cfg/default

LABEL deb82x64
MENU LABEL Debian Linux 8.2 [ x^64 ] Jessie
KERNEL menu.c32
APPEND debian-installer/amd64/pxelinux.cfg/default

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

Федора, используемая у меня как основная система, грузится с роутера малость иначе. Тут я решил, что мне нужна возможность поставить полноценную ОС даже при отсутствии интернета. Поэтому сперва распаковываем ISO-файлы дистрибов на роутер:


admin@router:/# ls /opt/share/www/4tftp/f23_iso/*
/opt/share/www/4tftp/f23_iso/images:
TRANS.TBL install.img product.img pxeboot

/opt/share/www/4tftp/f23_iso/isolinux:
TRANS.TBL boot.msg initrd.img isolinux.cfg libcom32.c32 memtest vesamenu.c32
boot.cat grub.conf isolinux.bin ldlinux.c32 libutil.c32 splash.png vmlinuz

admin@router:/# ls /opt/share/www/4tftp/f23x64_iso/*
/opt/share/www/4tftp/f23x64_iso/EFI:
BOOT

/opt/share/www/4tftp/f23x64_iso/images:
TRANS.TBL efiboot.img install.img macboot.img product.img pxeboot

/opt/share/www/4tftp/f23x64_iso/isolinux:
TRANS.TBL boot.msg initrd.img isolinux.cfg libcom32.c32 memtest vesamenu.c32
boot.cat grub.conf isolinux.bin ldlinux.c32 libutil.c32 splash.png vmlinuz

Затем на tftp извлекаем файлы ядра и initrd и прописываем загрузочные параметры в PXE-меню:


# cat fedora.menu
PROMPT 0
MENU BACKGROUND pxelinux.cfg/fedora.jpg
MENU TITLE PXE Linux [Fedora] Asus RT-AC68U 192.168.1.1

label f23
menu label Fedora-23 ^Graphical Install
kernel /livecd/f23/vmlinuz
append initrd=/livecd/f23/initrd.img repo=http://192.168.1.1:82/4tftp/f23_iso selinux=0 lang=ru_RU.utf8 keymap=us

label f23pae
menu label Fedora-23-PAE ^Graphical Install
kernel /livecd/f23/vmlinuz-PAE
append initrd=/livecd/f23/initrd-PAE.img repo=http://192.168.1.1:82/4tftp/f23_iso selinux=0 lang=ru_RU.utf8 keymap=us

label f23x64
menu label Fedora-23-x^64 Graphical Install
kernel /livecd/f23/vmlinuz_x64
append initrd=/livecd/f23/initrd_x64.img repo=http://192.168.1.1:82/4tftp/f23x64_iso selinux=0 lang=ru_RU.utf8 keymap=us

label f23safe
menu label Fedora-23 ^Text Install (Safe Mode, VNC :5901)
kernel /livecd/f23/vmlinuz
append initrd=/livecd/f23/initrd.img repo=http://192.168.1.1:82/4tftp/f23_iso selinux=0 lang=us_US.utf8 keymap=us text noprobe xdriver=vesa acpi=off nomce numa-off noparport nopcmcia nodmraid nofirewire vncport=5901 sshd=1

label f23safePAE
menu label Fedora-23-PAE ^Text Install (Safe Mode, VNC :5901)
kernel /livecd/f23/vmlinuz-PAE
append initrd=/livecd/f23/initrd-PAE.img repo=http://192.168.1.1:82/4tftp/f23_iso selinux=0 lang=us_US.utf8 keymap=us text noprobe xdriver=vesa acpi=off nomce numa-off noparport nopcmcia nodmraid nofirewire vncport=5901 sshd=1

label f23safe-x64
menu label Fedora-23-x64 Text Install (Safe Mode, ^VNC :5901)
kernel /livecd/f23/vmlinuz_x64
append initrd=/livecd/f23/initrd_x64.img repo=http://192.168.1.1:82/4tftp/f23x64_iso selinux=0 lang=us_US.utf8 keymap=us text noprobe xdriver=vesa acpi=off nomce numa-off noparport nopcmcia nodmraid nofirewire vncport=5901 sshd=1

label f23vncback
menu label Fedora-23 Install over ^VNC-back-Connect to 192.168.1.2:5500
kernel /livecd/f23/vmlinuz
append initrd=/livecd/f23/initrd.img repo=http://192.168.1.1:82/4tftp/f23_iso selinux=0 lang=ru_RU.utf8 keymap=us vnc vncconnect=192.168.1.2:5500

label f23r
menu label Fedora-23 ^Rescue
kernel /livecd/f23/vmlinuz
append initrd=/livecd/f23/initrd.img repo=http://192.168.1.1:82/4tftp/f23_iso rescue

label f23rpae
menu label Fedora-23-PAE ^Rescue
kernel /livecd/f23/vmlinuz-PAE
append initrd=/livecd/f23/initrd-PAE.img repo=http://192.168.1.1:82/4tftp/f23_iso rescue

label f23rx64
menu label Fedora-23 x64 Rescue
kernel /livecd/f23/vmlinuz_x64
append initrd=/livecd/f23/initrd_x64.img repo=http://192.168.1.1:82/4tftp/f23x64_iso rescue

Asus_RT-AC69U_NetBoot_Fedora-Anaconda-Installer-PXE

У федоры и её инсталлера Anaconda масса загрузочных опций. Управление установкой удалённо через VNC, в том числе обратным коннектом через потусторонний NAT — давно уже норма жизни. И это позволяет переставлять систему по удалёнке, даже не отвлекаясь от текущих дел.

4). Самая крутая круть — загрузка ливки с монтированием основного образа по NFS без его полной предварительной загрузки в память. Тут нет лимита на размер образа. Я сделал таким образом загрузку по сети полновесного Live_DVD кноппикса последней версии. Это оказалось одной из самых сложных задач по переносу линукса в pxe-окружение (по сравнению с халявнейшим апом RiPLinux и прочего вышеперечисленного).
Первое — сперва надо загрузиться на виртуалке полновесным кноппиксом из ISO-файла. Там есть скрипт для запуска терминального сервера средствами самого кноппикса. Самый ценный ман, который я нашел по этой теме:

PXE-booting Knoppix 7.2

Ключевая идея — запустить в загруженном кноппиксе скрипт knoppix-terminalserver и при сборке образа указать все сетевые драйвера, которые он предложит. После чего по FTP/SSH/SMB/флешками/облачными_хранилищами вытащить из виртуалки самое ценное — подготовленный для сетевой загрузки образ initrd, ядра и сгенерированные скрипты для pxe-менюшки.

Потом кладём на tftp ядро и инитрд-образ, а на NFS — 4-х гиговый файл, вытащенный из ISO-образа.
В менюшке прописывается вот так:

LABEL knoppix76
MENU LABEL Knoppix 7.6 [x86, DVD]
KERNEL livecd/Knoppix/7.6/linux
APPEND initrd=livecd/Knoppix/7.6/miniroot.gz nfsdir=192.168.1.1:/mnt/San64Gb/nfs4tftp/Knoppix_76 init=/sbin/init apm=power-off nomce loglevel=1 libata.force=noncq tz=Europe/Moscow ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1 BOOT_IMAGE=knoppix

LABEL knoppix76safe
MENU LABEL Knoppix 7.6 Safe-Mode [x86, DVD]
KERNEL livecd/Knoppix/7.6/linux
APPEND initrd=livecd/Knoppix/7.6/miniroot.gz nfsdir=192.168.1.1:/mnt/San64Gb/nfs4tftp/Knoppix_76 init=/sbin/init apm=power-off nomce noapic noacpi noapm acpi=off noacpid no3d loglevel=1 libata.force=noncq tz=Europe/Moscow ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1 BOOT_IMAGE=knoppix

MENU SEPARATOR

LABEL knoppix76x64
MENU LABEL Knoppix 7.6 [x64, DVD]
KERNEL livecd/Knoppix/7.6/linux64
APPEND initrd=livecd/Knoppix/7.6/miniroot.gz nfsdir=192.168.1.1:/mnt/San64Gb/nfs4tftp/Knoppix_76 init=/sbin/init apm=power-off nomce loglevel=1 libata.force=noncq tz=Europe/Moscow ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1 BOOT_IMAGE=knoppix

LABEL knoppix76x64safe
MENU LABEL Knoppix 7.6 Safe-Mode [x64, DVD]
KERNEL livecd/Knoppix/7.6/linux64
APPEND initrd=livecd/Knoppix/7.6/miniroot.gz nfsdir=192.168.1.1:/mnt/San64Gb/nfs4tftp/Knoppix_76 init=/sbin/init apm=power-off nomce noapic noacpi noapm acpi=off noacpid no3d loglevel=1 libata.force=noncq tz=Europe/Moscow ramdisk_size=100000 lang=ru keyboard=us xkeyboard=us,ru vt.default_utf8=1 hpsa.hpsa_allow_any=1 BOOT_IMAGE=knoppix

LABEL Press F1 for Help, F2-F5 for cheat-codes
F1 livecd/Knoppix/Knoppix_Help-F1.txt
F2 livecd/Knoppix/knoppix-cheatcodes-F2.txt
F3 livecd/Knoppix/knoppix-cheatcodes-F3.txt
F4 livecd/Knoppix/knoppix-cheatcodes-F4.txt
F5 livecd/Knoppix/knoppix-cheatcodes-F5.txt
MENU DISABLE

Важный момент — в отличие от TFTP/SMB, путь в NFS-параметре указывается полный, от корня файловой системы на роутере! Иначе файловая система не включится и загрузка обломится.
Также для кноппикса полезно добавить строку Safe-Mode с опцией no3d — поскольку на машинках без GPU (виртуалки прежде всего) автоматом включающийся компиз с эффектами «эластичных окон» и прочими цацками зело лагает. На реальном железе компиз работает без малейших проблем, поэтому основную строку загрузки лучше оставить, если в кноппиксе вам вдруг приспичит запустить тяжелую игрушку в вайне.

Asus_RT-AC69U_NetBoot_Knoppix-DVD-PXE

Изнутри кноппикса файловые системы выглядят как-то так:


knoppix@Microknoppix:~$ df -h | grep -v tmpfs
Файловая система Размер Использовано Дост Использовано% Cмонтировано в
rootfs 498M 15M 483M 3% /
192.168.1.1:/mnt/San64Gb/nfs4tftp/Knoppix_76 57G 17G 39G 30% /mnt-system
/dev/cloop 9,7G 9,7G 0 100% /KNOPPIX
/dev/cloop1 352M 352M 0 100% /KNOPPIX1
unionfs 2,0G 65M 2,0G 4% /usr
udev 20M 0 20M 0% /dev

knoppix@Microknoppix:~$ mount | grep -v tmpfs
rootfs on / type rootfs (rw,size=509488k,nr_inodes=127372)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
192.168.1.1:/mnt/San64Gb/nfs4tftp/Knoppix_76 on /mnt-system type nfs (ro,relatime,vers=3,rsize=8192,wsize=8192,namlen=255,hard,nolock,proto=udp,port=2049,timeo=7,retrans=3,sec=sys,local_lock=all,addr=192.168.1.1)
/dev/cloop0 on /KNOPPIX type iso9660 (ro,relatime)
/dev/cloop1 on /KNOPPIX1 type iso9660 (ro,relatime)
unionfs on /UNIONFS type aufs (rw,relatime,si=ece10d88,noplink)
unionfs on /usr type aufs (rw,relatime,si=ece10d88,noplink)
unionfs on /home type aufs (rw,relatime,si=ece10d88,noplink)
devpts on /dev/pts type devpts (rw,relatime,mode=1777)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

Тут получается совсем ракетно: сперва грузится ядро и мини-образ совокупным весом мегабайт 10-15, затем они включают сеть (именно для её поднятия потребовалась сборка своего инитрд средствами knoppix-terminal-server), они делают монтирование NFS-шары с роутера в read-only, с этой шары 4-х гигабайтный файл монтируется через loopback-устройство, и всё это загружается. По гигабитной сети загружается оно совершенно заебись. Что ценно — в память подкачиваются только те части системы из крупного файла, которые надо грузить, и ничего более. Памяти ест немного, зато в полной боевой готовности у нас овер9000 готовых линуксовых пакетов — в DVD-сборке последнего кноппикса помимо не самого лёгкого LibreOffice 5.0 есть всевозможные векторные, графические и звуковые редаторы, среды разработки, компиляторы, ситсемные тулзы в безумном количестве, игрухи, клиенты ко всем протоколам удалённого доступа, средства для анализа сетей (wireshark, kismet), и ещё уйма софта, требующего отдельных объёмистых статей. В 4 Гб сжатого образа (в расжатом виде — под 10 Гб внутри виртуальной ФС) влезло много. На моей рабочей машине весь установленный софт с системой занимают совокупно гигов 6.

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

5). Прикола ради я решил прикрутить установщики/ливки NetBSD и OpenBSD, просто чтобы попробовать их в деле.
Первая мысль была сделать фряху — но там какой-то несколько непрямой путь сборки загрузочного PXE-инсталлера, требующий установленной фряхи и шаманств в отдельной виртуалке. Это оставим на будущее.
Из легко загружаемого — mfs-bsd (хитровывернутая фряха). Жестоко и брутально, мемдиском c опцией harddisk raw:

LABEL mfsbsd10x86
MENU LABEL ^MFS FreeBSD 10.0 x86 (root/mfsroot)
kernel memdisk
append initrd=livecd/FreeBSD/mfsbsd-10.0-RELEASE-i386.img harddisk raw

Грузиццо:

Asus_RT-AC69U_NetBoot_MFS-BSD-PXE

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


LABEL OpenBSD Setup Help. Press F2 - help for OpenBSD Loading !!
F2 livecd/OpenBSD/OpenBSD_Help.txt
MENU DISABLE

LABEL openbsd58
MENU LABEL ^OpenBSD 5.8 x86 [FS-Image]
kernel memdisk
append initrd=livecd/OpenBSD/openbsd-58-i386.fs

LABEL openbsd58f
MENU LABEL OpenBSD 5.8 x86 Floppy
kernel memdisk
append initrd=livecd/OpenBSD/openbsd-58-i386-floppy.fs

Жесть, не спорю. Но с передачей параметров в livecd/OpenBSD/pxeboot-5.8 я пока что до конца не разобрался.
На http-сервер лучше выкачать установочные пакеты на будущее, и написать справочку, поскольку штатные зеркала
у них очень медленные, а наш роутер гигабитный:


# cat livecd/OpenBSD/OpenBSD_Help.txt

[ *** OpenBSD Setup Help *** ]

1. For fast setup, use HTTP-Source.

Set option Location of sets: http
Set option HTTP Proxy: none
Set option HTTP Server: 192.168.1.1:82

for download packages directly from router.

В процессе выкачки образов я пропустил какой-то параметр в wget-е и получил ачивку:

Achieve_Random_download_100Gb

NetBSD тоже весёлая система.
Грузим так:

LABEL NetBSD Setup Help. Press F3 - help for NetBSD Loading !!
F3 livecd/NetBSD/NetBSD_Help.txt
MENU DISABLE

LABEL netbsd70
MENU LABEL ^NetBSD 7 PXE Loader
kernel livecd/NetBSD/pxeboot_ia32.bin

Справочка:

# cat NetBSD_Help.txt

[ *** NetBSD Setup Help *** ]

1. Start NetBSD PXE Loader and quick press [Space]
2. Enter boot options for install or another boot options:

boot tftp:livecd/NetBSD/install7-x86
boot tftp:livecd/NetBSD/install7-x64

3. For fast setup, use HTTP-Source.
Set option Host: 192.168.1.1:82
for download packages directly from router.

[ Press Enter for return to *BSD-Setup menu ]

Читал, что у NetBSD загрузчик ищет образы по NFS (в планах перенести туда файлы NetBSD), а для чистой tftp-загрузки требуется вводи ручками. Если разберусь, как сделать по уму — отпишусь.

Файлы на веб-сервере кладутся таким образом:

admin@router:/tmp/mnt/San64Gb/entware-ng.arm/share/www# ls pub/NetBSD/NetBSD-7.0/i386/binary/sets/
MD5 kern-GENERIC.tgz kern-XEN3_DOMU.tgz xbase.tgz
SHA512 kern-LEGACY.tgz man.tgz xcomp.tgz
base.tgz kern-MONOLITHIC.tgz misc.tgz xetc.tgz
comp.tgz kern-XEN3PAE_DOM0.tgz modules.tgz xfont.tgz
etc.tgz kern-XEN3PAE_DOMU.tgz tests.tgz xserver.tgz
games.tgz kern-XEN3_DOM0.tgz text.tgz

admin@router:/tmp/mnt/San64Gb/entware-ng.arm/share/www# ls pub/OpenBSD/5.8/i386/
SHA256 bsd cdboot floppy58.fs index.txt miniroot58.fs xfont58.tgz
SHA256.sig bsd.mp cdbr game58.tgz install58.fs pxeboot xserv58.tgz
base58.tgz bsd.rd comp58.tgz index.html man58.tgz xbase58.tgz xshare58.tgz

Просто чтобы не указывать пути ручками, ограничившись только указание хоста и порта 82 веб-сервера.

Asus_RT-AC69U_NetBoot_NetBSD-PXE-Install-Animated

Теперь с домашнего роутера можно гонять мемтесты и MHDD, ставить разные линуксы, грузиться кноппиксом и ставить на виртуалки всякие совсем уж демонические bsd-системы.

Ну и забавную ссылочку напоследок: http://habrahabr.ru/post/273023/

На этом я пока что закончу повествование.

Если вы читали прошлую заметку, то вы вспомните, что на роутере также включена самба. А вот зачем и что из этого вышло — в следующей части.

- комментарии
  1. […] Домашний роутер с PX… on Домашний роутер. Как выбрать х… […]

  2. […] немного порутать систему. Я использовал для этого сетевую загрузку RiP Linux — грузимся, монтируем: mount /dev/sda1 /mnt/sda1 и правим файлы […]

  3. Hurrah! After all I got a website from where I can actually
    get useful facts concerning my study and knowledge.