Бездисковая загрузка с использованием PXE и iSCSI на примере Ubuntu

от автора

Здравствуйте.

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

Что необходимо?

Для загрузки системы нужны три компонента: ядро, initramfs и корневая файловая система.
Ядро и initramfs мы передадим по PXE, а корневую файловую систему — по iSCSI.

iSCSI-таргеты

Небольшой ликбез по iSCSI

iSCSI — реализация протокола SCSI поверх TCP. Сам протокол SCSI весьма универсален, теоретически с его помощью можно подключить устройство любого типа. Тем не менее, в большинстве случаев SCSI используется для доступа к тем или иным устройствам хранения данных (жёсткие диски, дисководы компакт-дисков и DVD и т. п.). Для примера Mass Storage Device, использующийся в USB-устройствах, является реализацией SCSI поверх USB. Поэтому, кстати, флешки в Linux опознаются как /dev/sdX-устройства. Использующаяся на серверах шина SAS также является реализацией SCSI (собственно, это видно из названия — Serial Attached SCSI).
В iSCSI различаются понятия таргета (target, целевое устройство, осуществляет приём и выполнение запросов) и инициатора (initiator, порождает запросы). В более привычных терминах таргет — это сервер, а инициатор — клиент.
Таргеты и инициаторы бывают разных видов. iSCSI-таргетом может выступать обычный компьютер, сервер или система хранения данных. Инициаторами обычно выступают сетевые карты (в их ROM бывает прошит необходимый код) или software-реализации.

Для Ubuntu возможно использовать различные iSCSI-таргеты. Вот неполный их список:

  • ISCSI Enterprise Target — одна из самых старых реализаций iSCSI-таргета на Linux. Насколько мне известно, жива и здравствует, однако требует установки (в Ubuntu) через DKMS и совсем лёгкого дребезга бубнов. На opennet.ru есть рабочий HOWTO, применимый и к более поздним версиям ОС (Precise)
  • SCSI Target Framework (STGT/TGT) — реализация iSCSI-таргета, портированная из BSD-систем. В отличии от IET, позволяет использовать не только iSCSI, но и другие родственные технологии (такие, как, например, SRP). К сожалению, код STGT в части iSCSI в линуксе работает в userspace. Как следствие, производительность получается где-то в районе плинтуса.
  • SCST — новая реализация универсального таргета для Linux. По заявлениям разработчиков обладает массой преимуществ и фишек. В ядро не включена, для установки требует патчей исходников ядра и продолжительного зубодробительного секса. По слухам, мила, прекрасна и похожа на сакуру. Когда-то давно ее использовали, например, в Оверсан-Скалакси (их опыт вкратце описан на хабре). Пакеты для Ubuntu перестали поддерживаться около полутора лет назад, в SVN есть некоторая активность, то есть проект жив и здравствует. Кстати, разработчики — русские парни 🙂
  • LIO — Linux Unified Target, универсальная система, реализующая iSCSI, SRP, FCoE и несколько других вариантов экспорта устройств в сеть. Официально включена в ядро и является стандартным таргетом, начиная с версии 2.6.38. К ней есть определенные претензии в плане того, что на официальном сайте активно продвигается проприетарная сборка, обладающая большим функционалом, но оставим вопли RMS.


Я буду пользоваться LIO, но ничто не мешает реализовать аналогичный функционал на другом таргете или на проприетарной промышленной СХД, вроде NetApp или EMC.

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

На таргете желательно использовать LVM для нарезания томов, но можно использовать и обычные файлы.

1. Образ целевой системы

Создадим том размером 16 ГиБ, который будет отдаваться по iSCSI (моя VolumeGroup называется vg00, том будет называться client):

root@targe:~# lvcreate -L 16G -n client vg00   Logical volume "client" created 
1.1. Разделы и файловые системы

Я люблю и уважаю LVM за его гибкость и удобство в работе, поэтому использую сетап, не требующий таблицы разделов на образе client. Вместо этого сразу на client создаётся еще одна VolumeGroup, которая потом режется на lv-тома.

root@target:~# pvcreate /dev/mapper/vg00-client   Physical volume "/dev/mapper/vg00-client" successfully created root@target:~# vgcreate client /dev/mapper/vg00-client   Volume group "client" successfully created root@target:~# lvcreate -L 12G -n rootfs client   Logical volume "rootfs" created root@target:~# lvcreate -l 100%FREE swap client   Logical volume "swap" created 

Создадим файловую систему и разметим раздел под swap:

root@target:~# mkfs.ext4 /dev/mapper/client-rootfs root@target:~# mkswap /dev/mapper/client-swap
1.2 Сам образ системы

Примонтируем файловую систему и развернем туда с помощью debootstrap минимальный образ:

root@target:~# mount /dev/mapper/client-rootfs /mnt root@target:~# debootstrap --include=openssh-server,language-pack-ru,aptitude,nano,vim,bash-completion,wget,curl,open-iscsi,initramfs-tools precise /mnt/ http://mirror.yandex.ru/ubuntu/

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

root@target:~# echo "client" > /mnt/etc/hostname root@target:~# echo -e "\nauto eth0\niface eth0 inet manual" >> /mnt/etc/network/interfaces root@target:~# echo "iqn.2013-02.org.example.client:default" > /mnt/etc/iscsi/initiatorname.iscsi 

Обратите внимание, мы заменили initiatorname.iscsi. IQN — это iSCSI Qualified Name, он обязательно должен быть уникальным. IQN нашего инициатора — iqn.2013-02.org.example.client:default.

Приведем fstab к нужному виду:

root@target:~# editor /mnt/etc/fstab

proc                     /proc  proc  nodev,noexec,nosuid  0  0 /dev/mapper/client-rootfs  /      ext4  errors=remount-ro    0  1 /dev/mapper/client-swap    none   swap  sw                   0  0 

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

root@target:~# chroot /mnt/ /bin/bash root@target:~# passwd root@target:~# exit 

Отмонтируем rootfs и деактивируем группу томов, чтобы случайно ее не задеть:

root@target:~# umount /mnt/ root@target:~# vgchange -an client

Образ системы готов! Загрузчик ему не нужен, ядро будет запускаться с помощью pxelinux.

2. iSCSI-таргет

Установим userspace-утилиты для управления таргетом:

root@target:~# aptitude install -y targetcli python-urwid

И запустим утилиту управления таргетом — targetcli:

root@target:~# targetcli
2.1. Backstore

Находясь в консоли targetcli необходимо выполнить следующие команды:

set global auto_cd_after_create=false cd /backstores/iblock/ create dev=/dev/mapper/vg00-client name=client 

Таким образом будет создан backstore для нашего тома vg00-client.

2.2. iSCSI

Создадим таргет:

cd /iscsi create wwn=iqn.2013-02.org.example.target:client cd iqn.2013-02.org.example.target:client/tpgt1/ 

Назначим предварительно созданный backstore этому таргету:

luns/ create /backstores/iblock/client

Назначим таргету интерфейс для работы (без указания параметров назначатся все активные интерфейсы):

portals/ create

Настроим права доступа (документация по правам доступа доступна на официальном сайте:

cd acls create iqn.2013-02.org.example.client:default cd iqn.2013-02.org.example.client:default set userid=client password=secret 
2.3. Сохранение настроек

Несмотря на то, что действия в targetcli выполняются немедленно, они не сохраняются и после перезагрузки все таргеты не вернутся. В этом поведение LIO похоже на поведение любых других ядерных служб (iptables, ebtables, ipvsadm и т. п.). При сохранении настроек targetcli компилирует всю конфигурацию в shell-скрипт, который просто скармливает нужные данные в configFS.

Сохраним все настройки:

cd / saveconfig

Таргет готов! Перейдем к настройке DHCP + TFTP.

3. DHCP-сервер

Предполагаем следующую конфигурацию:
Серверы живут в сети 10.0.0.0/24, таргет живет на 10.0.0.2, клиент получает по DHCP адрес 10.0.0.5.

Мануалов в сети море, поэтому коротко:

root@target:~# aptitude install -y isc-dhcp-server

dhcpd.conf:

allow booting; allow bootp;  subnet 10.0.0.0 netmask 255.255.255.0 { 	range 10.0.0.10 10.0.0.254; 	option broadcast-address 10.0.0.255; 	option routers 10.0.0.1; 	option domain-name-servers 8.8.8.8; 	filename "/pxelinux.0"; }  host client { 	hardware ethernet XX:XX:XX:XX:XX:XX; # Тут должен быть MAC-адрес сетевой карты client'а 	fixed-address 10.0.0.5; } 

Стартуем демон:

root@target:~# /etc/init.d/isc-dhcp-server start

4. TFTP-сервер

Опять же, мануалов в сети море.

root@target:~# aptitude install -y tftpd-hpa root@target:~# /etc/init.d/tftpd-hpa start

5. Syslinux

Устанавливаем пакет:

root@target:~# aptitude install -y syslinux syslinux-common

Копируем pxelinux.0 в /var/lib/tftpboot:

root@target:~# cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftboot

Также нам необходим образ ядра (можно взять с хост-системы). Сейчас у меня используется ядро от Ubuntu версии 3.2.0.37:

root@target:~# cp /vmlinuz /var/lib/tftboot/vmlinuz-3.2.0-37-generic

Дальше нужно собрать правильный initramfs. Для этого нам нужен модуль iSCSI:

root@target:~# echo "iscsi" >> /etc/initramfs-tools/modules root@target:~# mkinitramfs -o /var/lib/tftpboot/initrd.img-3.2.0-37-generic

Pxelinux будет искать файл с конфигурацией в директории pxelinux.cfg относительно корня tftp-сервера. Создадим ему конфигурацию:

root@target:~# mkdir /var/lib/tftpboot/pxelinux.cfg root@target:~# editor /var/lib/tftpboot/pxelinux.cfg/01-XX-XX-XX-XX-XX-XX

Вместо XX необходимо подставить MAC-адрес сетевой карты client’а, записанный в нижнем регистре через минусы, а не через двоеточия.

Содержимое файла:

DEFAULT linux  label linux 	kernel vmlinuz-3.2.0-37-generic 	append initrd=initrd.img-3.2.0-37-generic root=/dev/mapper/client-rootfs ip=dhcp iscsi_initiator=iqn.2013-02.org.example.client:default iscsi_target_name=iqn.2013-02.org.example.target:client iscsi_target_ip=10.0.0.2 iscsi_target_port=3260 console=tty0 iscsi_username=client iscsi_password=secret 	ipappend 2

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

Настройка Syslinux закончена. Теперь можно насладиться загрузкой 🙂

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

meow

[    0.000000] Initializing cgroup subsys cpuset [    0.000000] Initializing cgroup subsys cpu [    0.000000] Linux version 3.2.0-37-generic (buildd@allspice) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 (Ubuntu 3.2.0-37.58-generic 3.2.35) [    0.000000] Command line: initrd=initrd.img-3.2.0-37-generic root=/dev/mapper/client-rootfs ip=dhcp iscsi_initiator=iqn.2013-02.org.example.client:default iscsi_target_name=iqn.2013-02.org.example.target:client iscsi_target_ip=10.0.0.5 iscsi_target_port=3260 console=ttyS0 iscsi_username=client iscsi_password=secret BOOT_IMAGE=vmlinuz-3.2.0-37-generic BOOTIF=01-XX-XX-XX-XX-XX-XX  [    0.000000] KERNEL supported cpus: [    0.000000]   Intel GenuineIntel [    0.000000]   AMD AuthenticAMD [    0.000000]   Centaur CentaurHauls [    0.000000] BIOS-provided physical RAM map: [    0.000000]  BIOS-e820: 0000000000000000 - 000000000009f400 (usable) [    0.000000]  BIOS-e820: 000000000009f400 - 00000000000a0000 (reserved) [    0.000000]  BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved) [    0.000000]  BIOS-e820: 0000000000100000 - 00000000dfffd000 (usable) [    0.000000]  BIOS-e820: 00000000dfffd000 - 00000000e0000000 (reserved) [    0.000000]  BIOS-e820: 00000000feffc000 - 00000000ff000000 (reserved) [    0.000000]  BIOS-e820: 00000000fffc0000 - 0000000100000000 (reserved) [    0.000000]  BIOS-e820: 0000000100000000 - 0000000120000000 (usable) [    0.000000] NX (Execute Disable) protection: active [    0.000000] DMI 2.4 present. [    0.000000] No AGP bridge found [    0.000000] last_pfn = 0x120000 max_arch_pfn = 0x400000000 [    0.000000] PAT not supported by CPU. [    0.000000] last_pfn = 0xdfffd max_arch_pfn = 0x400000000 [    0.000000] found SMP MP-table at [ffff8800000fdaf0] fdaf0 [    0.000000] init_memory_mapping: 0000000000000000-00000000dfffd000 [    0.000000] init_memory_mapping: 0000000100000000-0000000120000000 [    0.000000] RAMDISK: 7f16e000 - 7ffff000 [    0.000000] ACPI: RSDP 00000000000fd970 00014 (v00 BOCHS ) [    0.000000] ACPI: RSDT 00000000dfffd7b0 00034 (v01 BOCHS  BXPCRSDT 00000001 BXPC 00000001) [    0.000000] ACPI: FACP 00000000dfffff80 00074 (v01 BOCHS  BXPCFACP 00000001 BXPC 00000001) [    0.000000] ACPI: DSDT 00000000dfffd9b0 02589 (v01   BXPC   BXDSDT 00000001 INTL 20100528) [    0.000000] ACPI: FACS 00000000dfffff40 00040 [    0.000000] ACPI: SSDT 00000000dfffd910 0009E (v01 BOCHS  BXPCSSDT 00000001 BXPC 00000001) [    0.000000] ACPI: APIC 00000000dfffd830 00072 (v01 BOCHS  BXPCAPIC 00000001 BXPC 00000001) [    0.000000] ACPI: HPET 00000000dfffd7f0 00038 (v01 BOCHS  BXPCHPET 00000001 BXPC 00000001) [    0.000000] No NUMA configuration found [    0.000000] Faking a node at 0000000000000000-0000000120000000 [    0.000000] Initmem setup node 0 0000000000000000-0000000120000000 [    0.000000]   NODE_DATA [000000011fffb000 - 000000011fffffff] [    0.000000] kvm-clock: Using msrs 4b564d01 and 4b564d00 [    0.000000] kvm-clock: cpu 0, msr 0:1cfa741, boot clock [    0.000000] Zone PFN ranges: [    0.000000]   DMA      0x00000010 -> 0x00001000 [    0.000000]   DMA32    0x00001000 -> 0x00100000 [    0.000000]   Normal   0x00100000 -> 0x00120000 [    0.000000] Movable zone start PFN for each node [    0.000000] early_node_map[3] active PFN ranges [    0.000000]     0: 0x00000010 -> 0x0000009f [    0.000000]     0: 0x00000100 -> 0x000dfffd [    0.000000]     0: 0x00100000 -> 0x00120000 [    0.000000] ACPI: PM-Timer IO Port: 0xb008 [    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled) [    0.000000] ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0]) [    0.000000] IOAPIC[0]: apic_id 1, version 17, address 0xfec00000, GSI 0-23 [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl) [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 5 global_irq 5 high level) [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level) [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 high level) [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 high level) [    0.000000] Using ACPI (MADT) for SMP configuration information [    0.000000] ACPI: HPET id: 0x8086a201 base: 0xfed00000 [    0.000000] SMP: Allowing 1 CPUs, 0 hotplug CPUs [    0.000000] PM: Registered nosave memory: 000000000009f000 - 00000000000a0000 [    0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000f0000 [    0.000000] PM: Registered nosave memory: 00000000000f0000 - 0000000000100000 [    0.000000] PM: Registered nosave memory: 00000000dfffd000 - 00000000e0000000 [    0.000000] PM: Registered nosave memory: 00000000e0000000 - 00000000feffc000 [    0.000000] PM: Registered nosave memory: 00000000feffc000 - 00000000ff000000 [    0.000000] PM: Registered nosave memory: 00000000ff000000 - 00000000fffc0000 [    0.000000] PM: Registered nosave memory: 00000000fffc0000 - 0000000100000000 [    0.000000] Allocating PCI resources starting at e0000000 (gap: e0000000:1effc000) [    0.000000] Booting paravirtualized kernel on KVM [    0.000000] setup_percpu: NR_CPUS:256 nr_cpumask_bits:256 nr_cpu_ids:1 nr_node_ids:1 [    0.000000] PERCPU: Embedded 28 pages/cpu @ffff88011fc00000 s83136 r8192 d23360 u2097152 [    0.000000] kvm-clock: cpu 0, msr 1:1fc13741, primary cpu clock [    0.000000] KVM setup async PF for cpu 0 [    0.000000] kvm-stealtime: cpu 0, msr 11fc0ddc0 [    0.000000] Built 1 zonelists in Node order, mobility grouping on.  Total pages: 1030023 [    0.000000] Policy zone: Normal [    0.000000] Kernel command line: initrd=initrd.img-3.2.0-37-generic root=/dev/mapper/client-rootfs ip=dhcp iscsi_initiator=iqn.2013-02.org.example.client:default iscsi_target_name=iqn.2013.org.example.target:client iscsi_target_ip=10.0.0.2 iscsi_target_port=3260 console=ttyS0 iscsi_username=client iscsi_password=secret BOOT_IMAGE=vmlinuz-3.2.0-37-generic BOOTIF=01-52-54-00-f9-94-84  [    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes) [    0.000000] Checking aperture... [    0.000000] No AGP bridge found [    0.000000] Memory: 4031384k/4718592k available (6569k kernel code, 524752k absent, 162456k reserved, 6634k data, 924k init) [    0.000000] SLUB: Genslabs=15, HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [    0.000000] Hierarchical RCU implementation. [    0.000000] 	RCU dyntick-idle grace-period acceleration is enabled. [    0.000000] NR_IRQS:16640 nr_irqs:256 16 [    0.000000] Console: colour VGA+ 80x25 [    0.000000] console [ttyS0] enabled [    0.000000] allocated 33554432 bytes of page_cgroup [    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups [    0.000000] Detected 2266.734 MHz processor. [    0.008000] Calibrating delay loop (skipped) preset value.. 4533.46 BogoMIPS (lpj=9066936) [    0.008000] pid_max: default: 32768 minimum: 301 [    0.008000] Security Framework initialized [    0.008000] AppArmor: AppArmor initialized [    0.008006] Yama: becoming mindful. [    0.008938] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes) [    0.014373] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes) [    0.017441] Mount-cache hash table entries: 256 [    0.018407] Initializing cgroup subsys cpuacct [    0.019156] Initializing cgroup subsys memory [    0.019862] Initializing cgroup subsys devices [    0.020009] Initializing cgroup subsys freezer [    0.020729] Initializing cgroup subsys blkio [    0.021438] Initializing cgroup subsys perf_event [    0.022310] mce: CPU supports 10 MCE banks [    0.023163] SMP alternatives: switching to UP code [    0.046402] Freeing SMP alternatives: 24k freed [    0.047197] ACPI: Core revision 20110623 [    0.049052] ftrace: allocating 27033 entries in 107 pages [    0.053445] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1 [    0.056008] CPU0: Intel QEMU Virtual CPU version 1.0 stepping 03 [    0.060003] Performance Events: unsupported p6 CPU model 2 no PMU driver, software events only. [    0.060003] NMI watchdog disabled (cpu0): hardware events not enabled [    0.060003] Brought up 1 CPUs [    0.060003] Total of 1 processors activated (4533.46 BogoMIPS). [    0.060949] devtmpfs: initialized [    0.062513] EVM: security.selinux [    0.063081] EVM: security.SMACK64 [    0.064008] EVM: security.capability [    0.065558] print_constraints: dummy:  [    0.066254] RTC time:  8:35:28, date: 02/13/13 [    0.067076] NET: Registered protocol family 16 [    0.068142] ACPI: bus type pci registered [    0.068984] PCI: Using configuration type 1 for base access [    0.071152] bio: create slab <bio-0> at 0 [    0.072068] ACPI: Added _OSI(Module Device) [    0.072749] ACPI: Added _OSI(Processor Device) [    0.073440] ACPI: Added _OSI(3.0 _SCP Extensions) [    0.074209] ACPI: Added _OSI(Processor Aggregator Device) [    0.077515] ACPI: Interpreter enabled [    0.078121] ACPI: (supports S0 S3 S4 S5) [    0.078821] ACPI: Using IOAPIC for interrupt routing [    0.084201] ACPI: No dock devices found. [    0.084895] HEST: Table not found. [    0.085425] PCI: Ignoring host bridge windows from ACPI; if necessary, use "pci=use_crs" and report a bug [    0.086946] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff]) [    0.090705] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX4 ACPI [    0.091834] pci 0000:00:01.3: quirk: [io  0xb100-0xb10f] claimed by PIIX4 SMB [    0.106317]  pci0000:00: Unable to request _OSC control (_OSC support mask: 0x1e) [    0.111437] ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11) [    0.112353] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11) [    0.113383] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11) [    0.114405] ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11) [    0.115445] ACPI: PCI Interrupt Link [LNKS] (IRQs 9) *0 [    0.116580] vgaarb: device added: PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none [    0.117820] vgaarb: loaded [    0.118246] vgaarb: bridge control possible 0000:00:02.0 [    0.119255] i2c-core: driver [aat2870] using legacy suspend method [    0.120010] i2c-core: driver [aat2870] using legacy resume method [    0.121145] SCSI subsystem initialized [    0.122065] usbcore: registered new interface driver usbfs [    0.123105] usbcore: registered new interface driver hub [    0.124097] usbcore: registered new device driver usb [    0.125155] PCI: Using ACPI for IRQ routing [    0.126210] NetLabel: Initializing [    0.126763] NetLabel:  domain hash size = 128 [    0.127433] NetLabel:  protocols = UNLABELED CIPSOv4 [    0.128032] NetLabel:  unlabeled traffic allowed by default [    0.128990] HPET: 3 timers in total, 0 timers will be used for per-cpu timer [    0.130101] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0 [    0.130934] hpet0: 3 comparators, 64-bit 100.000000 MHz counter [    0.136107] Switching to clocksource kvm-clock [    0.148989] AppArmor: AppArmor Filesystem Enabled [    0.149895] pnp: PnP ACPI init [    0.150435] ACPI: bus type pnp registered [    0.151988] pnp: PnP ACPI: found 7 devices [    0.152654] ACPI: ACPI bus type pnp unregistered [    0.160397] NET: Registered protocol family 2 [    0.161303] IP route cache hash table entries: 131072 (order: 8, 1048576 bytes) [    0.164047] TCP established hash table entries: 524288 (order: 11, 8388608 bytes) [    0.172712] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes) [    0.174734] TCP: Hash tables configured (established 524288 bind 65536) [    0.175833] TCP reno registered [    0.176352] UDP hash table entries: 2048 (order: 4, 65536 bytes) [    0.177370] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes) [    0.178544] NET: Registered protocol family 1 [    0.179266] pci 0000:00:00.0: Limiting direct PCI/PCI transfers [    0.180202] pci 0000:00:01.0: PIIX3: Enabling Passive Release [    0.181110] pci 0000:00:01.0: Activating ISA DMA hang workarounds [    0.182264] ACPI: PCI Interrupt Link [LNKD] enabled at IRQ 11 [    0.183173] pci 0000:00:01.2: PCI INT D -> Link[LNKD] -> GSI 11 (level, high) -> IRQ 11 [    0.184481] pci 0000:00:01.2: PCI INT D disabled [    0.185283] PCI-DMA: Using software bounce buffering for IO (SWIOTLB) [    0.186279] Placing 64MB software IO TLB between ffff8800dbffb000 - ffff8800dfffb000 [    0.187449] software IO TLB at phys 0xdbffb000 - 0xdfffb000 [    0.188792] audit: initializing netlink socket (disabled) [    0.189648] type=2000 audit(1360744529.188:1): initialized [    0.214809] Trying to unpack rootfs image as initramfs... [    0.252156] HugeTLB registered 2 MB page size, pre-allocated 0 pages [    0.260222] VFS: Disk quotas dquot_6.5.2 [    0.260991] Dquot-cache hash table entries: 512 (order 0, 4096 bytes) [    0.262670] fuse init (API version 7.17) [    0.263431] msgmni has been set to 7873 [    0.276232] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) [    0.284047] io scheduler noop registered [    0.284669] io scheduler deadline registered [    0.285369] io scheduler cfq registered (default) [    0.286292] pci_hotplug: PCI Hot Plug PCI Core version: 0.5 [    0.287194] pciehp: PCI Express Hot Plug Controller Driver version: 0.4 [    0.288463] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0 [    0.289622] ACPI: Power Button [PWRF] [    0.291210] ERST: Table is not found! [    0.291840] GHES: HEST is not enabled! [    0.292657] ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10 [    0.293566] virtio-pci 0000:00:03.0: PCI INT A -> Link[LNKC] -> GSI 10 (level, high) -> IRQ 10 [    0.294992] virtio-pci 0000:00:04.0: PCI INT A -> Link[LNKD] -> GSI 11 (level, high) -> IRQ 11 [    0.300282] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled [    0.322807] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [    0.370917] 00:05: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [    0.396364] Linux agpgart interface v0.103 [    0.404625] brd: module loaded [    0.406062] loop: module loaded [    0.407646] scsi0 : ata_piix [    0.412224] scsi1 : ata_piix [    0.412760] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc060 irq 14 [    0.413870] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc068 irq 15 [    0.415327] Fixed MDIO Bus: probed [    0.415894] tun: Universal TUN/TAP device driver, 1.6 [    0.416711] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com> [    0.572940] ata2.00: ATAPI: QEMU DVD-ROM, 1.0, max UDMA/100 [    0.574318] ata2.00: configured for MWDMA2 [    0.575529] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     1.0  PQ: 0 ANSI: 5 [    0.577384] sr0: scsi3-mmc drive: 4x/4x cd/rw xa/form2 tray [    0.578271] cdrom: Uniform CD-ROM driver Revision: 3.20 [    0.584399] sr 1:0:0:0: Attached scsi generic sg0 type 5 [    0.764882] PPP generic driver version 2.4.2 [    0.765884] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [    0.767044] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [    0.768872] uhci_hcd: USB Universal Host Controller Interface driver [    0.770469] uhci_hcd 0000:00:01.2: PCI INT D -> Link[LNKD] -> GSI 11 (level, high) -> IRQ 11 [    0.771983] uhci_hcd 0000:00:01.2: UHCI Host Controller [    0.780181] uhci_hcd 0000:00:01.2: new USB bus registered, assigned bus number 1 [    0.781627] uhci_hcd 0000:00:01.2: irq 11, io base 0x0000c000 [    0.788310] hub 1-0:1.0: USB hub found [    0.788988] hub 1-0:1.0: 2 ports detected [    0.789892] usbcore: registered new interface driver libusual [    0.796086] i8042: PNP: PS/2 Controller [PNP0303:KBD,PNP0f13:MOU] at 0x60,0x64 irq 1,12 [    0.798327] serio: i8042 KBD port at 0x60,0x64 irq 1 [    0.799173] serio: i8042 AUX port at 0x60,0x64 irq 12 [    0.800181] mousedev: PS/2 mouse device common for all mice [    0.808438] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input1 [    0.810127] rtc_cmos 00:01: RTC can wake from S4 [    0.811082] rtc_cmos 00:01: rtc core: registered rtc_cmos as rtc0 [    0.812269] rtc0: alarms up to one day, 114 bytes nvram, hpet irqs [    0.852166] device-mapper: uevent: version 1.0.3 [    0.853068] device-mapper: ioctl: 4.22.0-ioctl (2011-10-19) initialised: dm-devel@redhat.com [    0.854488] cpuidle: using governor ladder [    0.855317] cpuidle: using governor menu [    0.856009] EFI Variables Facility v0.08 2004-May-17 [    0.860271] TCP cubic registered [    0.861037] NET: Registered protocol family 10 [    0.862519] NET: Registered protocol family 17 [    0.863370] Registering the dns_resolver key type [    0.868387] registered taskstats version 1 [    0.884234] Freeing initrd memory: 14916k freed [    0.893880]   Magic number: 1:826:573 [    0.894711] rtc_cmos 00:01: setting system clock to 2013-02-13 08:35:29 UTC (1360744529) [    0.896231] BIOS EDD facility v0.16 2004-Jun-25, 0 devices found [    0.897221] EDD information not available. [    0.899804] Freeing unused kernel memory: 924k freed [    0.901119] Write protecting the kernel read-only data: 12288k [    0.907811] Freeing unused kernel memory: 1604k freed [    0.913511] Freeing unused kernel memory: 1196k freed Loading, please wait... Begin: Loading essential drivers ... [    0.934990] udevd[83]: starting version 175 done. Begin: Running /scripts/init-premount ... done. Begin: Mounting root file system ... Begin: Running /scripts/local-top ... [    1.068409] FDC 0 is a S82078B IP-Config: eth0 hardware address XX:XX:XX:XX:XX:XX mtu 1500 DHCP IP-Config: eth0 complete (from 10.0.0.2):  address: 10.0.0.5  broadcast: 10.0.0.255  netmask: 255.255.255.0  gateway: 10.0.0.1  dns0     : 8.8.8.8          dns1   : 0.0.0.0           rootserver: 10.0.0.2 rootpath:   filename  : /pxelinux.0 [    1.129942] Loading iSCSI transport class v2.0-870. [    1.133710] iscsi: registered transport (tcp) iscsistart: transport class version 2.0-870. iscsid version 2.0-871 iscsistart: Logging into iqn.2013.org.example.target:client 10.0.0.2:3260,1 iscsistart: can not connect to iSCSI daemon (111)! iscsistart: version 2.0-871 [    1.139165] iscsistart (197): /proc/197/oom_adj is deprecated, please use /proc/197/oom_score_adj instead. [    1.188142] Refined TSC clocksource calibration: 2266.747 MHz. [    2.389685] scsi2 : iSCSI Initiator over TCP/IP iscsistart: connection1:0 is operational now [    2.647364] scsi 2:0:0:0: Direct-Access     LIO-ORG  IBLOCK           4.0  PQ: 0 ANSI: 5 [    2.653118] sd 2:0:0:0: Attached scsi generic sg1 type 0 [    2.655615] sd 2:0:0:0: [sda] 33554432 512-byte logical blocks: (17.1 GB/16.0 GiB) done. [    2.660695] sd 2:0:0:0: [sda] Write Protect is off [    2.662585] sd 2:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [    2.684956]  sda: unknown partition table [    2.691252] sd 2:0:0:0: [sda] Attached SCSI disk Begin: Running /scripts/local-premount ... done. [    7.955458] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null) Begin: Running /scripts/local-bottom ... done. done. Begin: Running /scripts/init-bottom ... done. 

Итоги:

Можно вполне использовать iSCSI для загрузки серверов, не имеющих своих дисков (актуально для виртуализации, самопильных систем хранения данных, серверов, которые не должны долго жить и т.п.).

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

Присутствует security-hole, поскольку /proc/cmdline доступен любому желающему в системе и этот любой желающий может получить доступ к экспортированному тому. Поэтому можно на таргете закрыть фаерволом все адреса, кроме необходимого.

Описанная схема — по большей части драфт и основа для инфраструктуры сетевой загрузки.

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

ISCSI на Википедии
Официальный сайт LIO
Официальный сайт Syslinux

ссылка на оригинал статьи http://habrahabr.ru/post/169251/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *