Как мне настроить Raspberry Pi для загрузки с рутом NFS?

25

Как я могу заставить мой Raspberry Pi использовать сервер NFS для корневой файловой системы вместо SD-карты?

Я хотел бы иметь возможность настроить мой Raspberry Pi на использование его корневой файловой системы на удаленном компьютере через NFS для повышения производительности, резервного копирования и разработки. Как я могу это сделать?

Flexo
источник
Большое спасибо за подсказку закомментировать #iface eth0 inet dhcp из (/ mnt / rpi-root / etc / network / interfaces). Без этого изменения я не смог получить свою первую работающую загрузку NFS в течение почти недели попыток. Я нигде не читал этот лакомый кусочек. Большое спасибо

Ответы:

24

Короткая версия

  1. Вам нужно подготовить рут и экспортировать его с компьютера NFS
  2. Вы должны настроить загрузку на ранней стадии, чтобы использовать это

Вам все еще понадобится SD-карта для начальной загрузки, но после этого SD-карте ничего кроме / boot не понадобится.

Детали

Я сделал это только на машине с Linux. Теоретически это возможно на любой машине, которая может экспортировать файловые системы NFS.

  1. Самый простой способ подготовить корневую файловую систему - скопировать ту, которая предоставлена ​​существующими образами. В качестве отправной точки я использовал официальный образ Debian 6 :

    1. Загрузите изображение, распакуйте файл .zip. Теперь у вас должен быть файл debian6-19-04-2012.img
    2. Смонтируйте корневой раздел из этого образа, используя петлевое устройство. Для начала корневого раздела вам потребуется смещение в изображении, в данном случае это второй раздел в изображении:

      fdisk -l debian6-19-04-2012.img
      
      Диск debian6-19-04-2012.img: 1949 МБ, 1949999616 байт
      4 головки, 32 сектора / дорожка, 29754 цилиндра, всего 3808593 сектора
      Единицы = секторы 1 * 512 = 512 байт
      Размер сектора (логический / физический): 512 байт / 512 байт
      Размер ввода / вывода (минимальный / оптимальный): 512 байт / 512 байт
      Идентификатор диска: 0x000ee283
      
      
      Система Идентификатора Начальной Загрузки Завершения Загрузки
      debian6-19-04-2012.img1 2048 155647 76800 c W95 FAT32 (LBA)
      debian6-19-04-2012.img2 157696 3414015 1628160 83 Linux
      debian6-19-04-2012.img3 3416064 3807231 195584 82 Linux swap / Solaris
      корень @ Рапунцель: / TMP / debian6-19-04-2012 # 
      

      Второй раздел начинается в блоке (или секторе) 157696, поэтому смещение равно (512 * 157696) = 80740352:

      root @ rapunzel: / tmp / debian6-19-04-2012 # mkdir / mnt / pi-root-loop
      root @ rapunzel: / tmp / debian6-19-04-2012 # mount -o loop, offset = 80740352 /tmp/debian6-19-04-2012/debian6-19-04-2012.img / mnt / pi-root- петля
      root @ rapunzel: / tmp / debian6-19-04-2012 # ls / mnt / pi-root-loop
      bin рабочий стол и т. д. lib mnt proc sbin selinux sys usr
      boot dev home media opt root sd srv tmp var
      корень @ Рапунцель: / TMP / debian6-19-04-2012 #
      
    3. С установленным изображением вы, вероятно, захотите скопировать это куда-нибудь более постоянное, чтобы избежать использования петлевого устройства навсегда. Я сделал том LVM2 и установил его в / mnt / rpi-root, поэтому я сделал:

      cp -rav / mnt / pi-root-loop / * / mnt / rpi-root /
      
    4. Теперь нам нужно экспортировать файловую систему, поэтому нам нужно добавить строку вроде:

      / mnt / rpi-root 192.168.1.2 (rw, no_root_squash)
      

      в / etc / exports на сервере NFS, где 192.168.1.2 - адрес Raspberry Pi. После добавления этого запуска exportfs -rvперечитайте список экспорта. (См. Export (5) для более сложных опций, включая подстановочные знаки / подсети, а не отдельные хосты)

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

  2. Теперь нам нужно создать SD-карту, которая выполняет начальную загрузку и загружается с использованием этого общего ресурса NFS. Я сделал это, взяв первый раздел официального образа и скопировав его на SD-карту, где SD-карта - / dev / sdx:

    dd if = / tmp / debian6-19-04-2012 / debian6-19-04-2012.img of = / dev / sdx bs = 512 count = 155647
    

    и затем, поскольку это скопировало только первый раздел, отредактировав таблицу разделов с помощью fdisk, удалив два раздела, которые мы не скопировали.

    После этого я смонтировал раздел с SD-карты и отредактировал с него файл cmdline.txt:

    dwc_otg.lpm_enable = 0 console = ttyAMA0,115200 kgdboc = ttyAMA0,115200 console = tty1 root = / dev / nfs nfsroot = 192.168.1.1: / mnt / rpi-root ip = dhcp rootfstype = nfs
    

    где 192.168.1.1 - адрес сервера NFS. Если вы не хотите использовать DHCP, вы можете установить альтернативные способы IP-адреса, см. Этот документ для получения дополнительной информации.

    После этого вы можете отключить SD-карту и загрузить Rapsberry Pi с корнем NFS. Вы также можете манипулировать файловой системой со стороны сервера или других клиентов NFS по своему усмотрению (например, QEMU + binfmt_misc , снимки LVM, системы резервного копирования и т. Д.)

Дополнительные вещи

  • Установка для RAMRUN и RAMLOCK значения yes в / etc / default / rcS приводит к тому, что / var / run и / var / lock соответственно монтируются как tmpfs (т.е. ramdisk) - это, вероятно, стоит, даже если у вас загружается только одно устройство с Файловая система NFS.
  • Если вы используете ip = dhcp, вам, вероятно, нужно закомментировать строку:

    #iface eth0 inet dhcp
    

    в / etc / network / interfaces (/ mnt / rpi-root / etc / network / interfaces), чтобы избежать ситуации, когда переключение между ранним загрузочным DHCP и обычным более поздним вызывает сообщение, подобное:

    NFS: сервер 192.168.1.1 не отвечает, все еще пытается

  • Если вы хотите загрузить множество устройств из одного корня, вам нужно позаботиться о предоставлении «local» / tmp (возможно, tmpfs) и других тонкостей, чтобы избежать проблем с несколькими машинами, пытающимися записать в одни и те же файлы.

Flexo
источник
спасибо за этот подробный урок. Я отлично работал с последним изображением. Теперь, когда я попытался выполнить те же действия для нового изображения, выпущенного два дня назад, я обнаружил ошибку. Проверка корневой файловой системы завершается неудачно из-за следующей ошибки: fsck.ext4: при попытке открыть / запустить / rootdev такое устройство или адрес отсутствуют. Возможно, отсутствует или заменено устройство? fsck умер со статусом выхода 8 Есть предложения? Клаус
У меня нет доступа к устройству для проверки прямо сейчас. Похоже, ядро ​​может быть собрано без поддержки root от nfs.
Флекс
1
Кажется, я нашел решение. Я изменил fstab: proc / proc proc по умолчанию 0 0 / dev / mmcblk0p1 / boot vfat по умолчанию 0 2 # / dev / mmcblk0p2 / ext4 по умолчанию, noatime 0 1 Вопрос в том, почему он используется для работы с предыдущим изображением. Это просто не удалось выполнить: S05checkroot.sh. Кстати: у вас есть идеи, как управлять разделом подкачки. Нам это нужно?
Возможно ли это наполовину задница и просто NFS все это? то есть. хост-экспорт /home/user/Documents/raspisRootFolderи клиент fstabпросто монтируют все это на /?
Пук
Отличный ответ, вытащил меня из неисправной SD-карты; перенес все это на мой сервер NAS. Я также закомментирована /dev/mmcblk0p2 / ext4 defaults,noatime 0 1из /etc/fstab, хотя я думаю , что оно не будет , не вызывая никаких проблем , если вы оставите его в.
TomG