Як налаштувати Raspberry Pi для завантаження з коренем NFS?


25

Як я можу змусити мій Raspberry Pi використовувати сервер NFS для кореневої файлової системи замість SD-карти?

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


Дякую за пораду прокоментувати #iface eth0 inet dhcp з (/ mnt / rpi-root / тощо / мережа / інтерфейси). Без цієї зміни я не змогла отримати своє перше робоче завантаження NFS протягом майже тижня спроб. Я не читав цього ласощі ніде більше. Велике спасибі

Відповіді:


24

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

  1. Потрібно підготувати корінь та експортувати його з машини NFS
  2. Для його використання потрібно налаштувати завантаження на ранньому етапі

Вам все одно знадобиться SD-карта для раннього завантаження, але після цього нічого, крім / завантаження, не знадобиться.

Деталі

Я робив це лише на машині 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
      root @ rapunzel: / 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 Desktop і т.д. lib mnt proc sbin selinux sys usr
      завантажувач Dev домашній медіа opt opt ​​root sd srv tmp var
      root @ rapunzel: / 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 / export на сервер NFS, де 192.168.1.2 - адреса Raspberry Pi. Після додавання запустіть, exportfs -rvщоб перечитати список експорту. (Дивіться про експорт (5) для більш вдосконалених варіантів, включаючи символи / підмережі, а не окремі хости)

    Ви також можете пропустити цей крок і створити кореневу файлову систему з нуля, використовуючи щось подібне multistrap.

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

    dd якщо = / tmp / debian6-19-04-2012 / debian6-19-04-2012.img of = / dev / sdx bs = 512 кол = 155647
    

    а потім, оскільки це лише скопіювало перший розділ, редагуючи таблицю розділів, з fdisk, щоб видалити два розділи, які ми не копіювали.

    Після цього я змонтував розділ з карти SD і відредагував файл cmdline.txt з нього, щоб прочитати:

    dwc_otg.lpm_enable = 0 консоль = ttyAMA0,115200 kgdboc = ttyAMA0,115200 консоль = 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 так, щоб в / 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 не відповідає, все ще намагаюся

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


дякую за цей детальний підручник. Я прекрасно працював з останнім зображенням. Тепер, коли я спробував виконати абсолютно ті ж кроки для нового зображення, що вийшов два дні тому, я натрапив на помилку. Перевірка кореневої файлової системи не вдається зі такою помилкою: fsck.ext4: Немає такого пристрою чи адреси під час спроби відкрити / запустити / rootdev Можливо, не існує або заміняти пристрій? fsck помер зі статусом виходу 8 Будь-які пропозиції? Клаус

Я не маю доступу до пристрою, щоб перевірити зараз. Звучить, що ядро ​​може бути побудовано без кореневої підтримки nfs.
Flexo

1
Здається, я знайшов рішення. Я змінив fstab: proc / proc proc за замовчуванням 0 0 / dev / mmcblk0p1 / boot vfat defaults 0 2 # / dev / mmcblk0p2 / ext4 за замовчуванням, noatime 0 1 Питання, чому він працював з попереднім зображенням. Це просто не вдалося виконати: S05checkroot.sh. BTW: Чи маєте ви ідею, як керувати розділом swap. Чи нам це потрібно?

Чи можна наполовину запустити це і просто NFS? тобто. хост-експорт, /home/user/Documents/raspisRootFolderа клієнт fstabпросто монтує всю справу /?
puk

Чудова відповідь, врятував мене з невдалої карти SD; перемістив все це на мій сервер NAS. Я також закоментований /dev/mmcblk0p2 / ext4 defaults,noatime 0 1з /etc/fstab, хоча я думаю , що воно не буде , не викликаючи жодних проблем , якщо ви залишите його в.
TomG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.