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

NFS version 3 and 4.1 setup for Microsoft Windows 7, Linux and Mac Os X Clients

Настройка NFS (nfs3, nfs41) и подключение клиентов Microsoft Windows 7, Linux, Mac Os X 

 

Concept: "single service" vs. "many services" 


Идея единой службы (vs многие службы), которая "экспортируетресурсы, управляемые файл-серверами и хранилищами, является привлекательной для администратора файл-сервера (хранилища) и приемлемой для пользователей в следующих предположениях: 
  • Администратор избегает управлять технически несовместимыми политиками выделения ресурсов;
  • В прикладной среде (Linux, Windows 7+ Professional, Mac Os X) поддерживается  клиент для этой службы; 
  • Простота и прозрачность  в использовании (например, в Windows - это привязка ресурса к "буковке", "Y:"); 
  • 100% локализация: клиенты  работают  с русскими именами файлов (поддержка UTF-8) [1]; 
  • Сервер корректно отрабатыает запросы типа "создать копию папки", не направляя перекачку данных по сети "через клиентский буфер"; 
  • Сервис шустро работает, масштабируем. Процессор оптимально загружен; 
В средах Windows лучшим выбором такой "единой службы" является Microsoft Windows networking (SMB). Наилучшим выбором является Windows Server в качестве домен-контроллера, с поддержкой Active Directory. В смешанных (Mac Os X, Windows 7+, Windows XP, Linux) средах наилучшего выбора нет
Коммерческая платформа Windows Server 2012 (см. рисунок) и open source Arch Linux позволяют настроить службы SMB, NFS или обе службы одновременно. 

В данном упражнении рассмотрим настройку NFS в смешанной среде: Arch Linux, Mac Os X Yosemite, Windows 7, Windows Vista. 

 

Constraints 



  • Mac Os X поддерживает NFS. Клиент работает с по протоколу nfs3, используя "непривилегированные" (>1024) порты  и не поддерживает nfs4. Поддерживается трансляция национальных кодировок;
  • Windows Vista и 7 версий Ultimate и Enterprise (не professional!) имеет "службы подключения к NFS". Службы не установлены по умолчанию. Эти службы работают по протоколу nfs3, используя "непривилегированные" (>1024) порты,  не поддерживает nfs4,  не поддерживают UTF-8 [1]; 
  •  Windows 7 версий Professional  NFS Version 4 Open Source Reference Implementation(ms-nfs41-client-x64)  не понимает nfs3  [5]; 
  • Сервер Arch Linux может экспортировать ресурсы в соответствии со спецификациями nfs3 и nfs4 для разных клиентов.  
В данном примере рассматриваем простейшие работающие в средах Linux, Mac Os X и Windows 7 примеры конфигурации сервера и клиента учитывающие вышеуказанные constraints. 
  • Не рассматриваются: Kerberos, схемы identity (uid и gid) mapping между Windows и Linux, интеграция со информационными службами каталогов как-то (open)ldap, NIS, ActiveDirectory. 
  • Скажу забегая вперёд: "Захоти что-то из п. 1- косяки вылезут".

Установка и конфигурация службы NFS 


1) На сервере (используем Arch Linux Arm) установим nfs-utils: 

$sudo pacman -S nfs-utils 

2) Экспортируем по протоколу NFS существующие (и отстроенные в плане прав доступа) файловые системы.
Конфигурации выделены синим.  
Внимание. 
Есть "волшебные" опции;
Предлагаю уяснить применение каждой из них в процессе самозадрачиванияподготовки.  

$sudo nano /etc/exports  
# /etc/exports - exports(5) - directories exported to NFS clients 
# 
# Example for NFSv2 and NFSv3: (works for Linux, Windows Vista Ultimate and Mac Os X) 
/srv/home        192.168.1.0/24(rw,sync,insecure) 

# Example for NFSv4 (works for Linux and Windows 7 ms-nfs41-client-x64): 
/srv/nfs4 192.168.1.0/24(sec=sys,rw,sync,fsid=0,insecure) 

# Use `exportfs -arv` to reload. 

3) Перезагрузим службу NFS: 

$ sudo exportfs -arv 

 

Тестирование подключения Mac Os X к  службе NFS 

1) Командуем монтировать /srv/home, экспортируемую по протоколу nfs3: 

medv-MBP-3:~ medv$ sudo mkdir /private/nfs2 
medv-MBP-3:~ medv$ sudo mount -t nfs -o resvport 192.168.1.3:/srv/home /private/nfs2 
medv-MBP-3:~ medv$

2) Ресурс "/srv/home" смонтирован на "/private/nfs2" -> Тест passed 

Тестирование подключения клиента Windows 7 NFS Version 4 Open Source Reference Implementation к службе NFS 


1) Скачиваем NFS Version 4 Open Source Reference Implementation (клиент Windows) [2] и устанавливаем, как описывает методичка [3]; 

2) После успешной установки клиента в каталог "С:\Users\Public\ms-nfs41-client-x64 
командуем подключить /srv/nfs4,  экспортируемую по протоколу nfs4, к буковке "Y:" 

Внимание
/srv/nfs4 экспортируется с параметром fsid=0 (то есть как "/"). 
Поэтому Windows NFS Version 4 клиент будет отсчитывать путь как "192.168.1.3:/",  не находя путь, заданный в формате "192.168.1.3:/srv/nfs4". 

Microsoft Windows [Version 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation.  All rights reserved. 

C:\Windows\system32>net start "pnfs client" 
The requested service has already been started. 

More help is available by typing NET HELPMSG 2182. 


C:\Windows\system32>cd c:\Users\Public\ms-nfs41-client-x64 

c:\Users\Public\ms-nfs41-client-x64>nfs_mount.exe Y: 192.168.1.3:/ 
Successfully mounted 192.168.1.3 to drive Y: 

c:\Users\Public\ms-nfs41-client-x64>Y: 

Y:\>dir /w 
 Volume in drive Y is PnfsVolume 
 Volume Serial Number is BABA-FACE 

 Directory of Y:\ 

[.]                   [video]               [etc] 
rootfs.tgz            usb_key_func.sh.2     ._rootfs.tgz 
._usb_key_func.sh.2   rootfs.tar.gz 
               5 File(s)    763.416.187 bytes 
               3 Dir(s)  110.300.561.408 bytes free 

Y:\> 
3) Ресурс "/srv/nfs4" подключен к буковке Y: -> Test passed 

 

Публикации 


  1. Zhang Weiwu "There is no solution with Microsoft's NFS client in Windows 7"  http://superuser.com/ 
  2.  University of Michigan Projects: NFSv4.1 Client for Windows  
  3.  University of Michigan Windows NFS 4.1 Client Instructions

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'