Bagaimana cara mengkonfigurasi Raspberry Pi untuk boot dengan root NFS?

25

Bagaimana saya bisa membuat Raspberry Pi saya menggunakan server NFS untuk sistem file root, bukan kartu SD?

Saya ingin dapat mengatur Raspberry Pi saya untuk memiliki sistem file root pada mesin jarak jauh melalui NFS untuk tujuan kinerja / cadangan / pengembangan. Bagaimana saya bisa melakukan ini?

Flexo
sumber
Terima kasih banyak atas tipnya untuk mengomentari #iface eth0 inet dhcp from (/ mnt / rpi-root / etc / network / interfaces). Tanpa perubahan itu, saya tidak bisa mendapatkan boot NFS pertama yang berfungsi selama hampir seminggu mencoba. Belum membaca berita gembira itu di tempat lain. Terima kasih banyak

Jawaban:

24

Versi singkat

  1. Anda perlu menyiapkan root dan mengekspornya dari mesin NFS
  2. Anda perlu mengkonfigurasi booting tahap awal untuk menggunakannya

Anda masih memerlukan kartu SD untuk booting tahap awal, tetapi setelah itu tidak ada kecuali / boot yang akan membutuhkan kartu SD.

Detail

Saya hanya melakukan ini pada mesin Linux. Secara teori dimungkinkan pada mesin apa pun yang dapat mengekspor sistem file NFS.

  1. Cara termudah untuk menyiapkan sistem file root adalah menyalin yang disediakan oleh gambar yang ada. Saya menggunakan gambar resmi Debian 6 sebagai titik awal saya:

    1. Unduh gambar, ekstrak file .zip. Anda sekarang harus memiliki debian6-19-04-2012.img di suatu tempat
    2. Pasang partisi root dari gambar itu menggunakan perangkat loopback. Anda perlu offset ke dalam gambar untuk memulai partisi root, dalam hal ini ini adalah partisi kedua dalam gambar:

      fdisk -l debian6-19-04-2012.img
      
      Disk debian6-19-04-2012.img: 1949 MB, 1949999616 bytes
      4 kepala, 32 sektor / jalur, 29754 silinder, total 3808593 sektor
      Unit = sektor 1 * 512 = 512 byte
      Ukuran sektor (logis / fisik): 512 byte / 512 byte
      Ukuran I / O (minimum / optimal): 512 byte / 512 byte
      Pengidentifikasi disk: 0x000ee283
      
      
      Perangkat Booting Mulai Akhir Blok Sistem Id
      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 # 
      

      Partisi kedua dimulai pada blok (atau sektor) 157696 sehingga offsetnya adalah (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- lingkaran
      root @ rapunzel: / tmp / debian6-19-04-2012 # ls / mnt / pi-root-loop
      bin Desktop dll lib mnt proc sbin selinux sys usr
      boot dev home media opt root sd srv tmp var
      root @ rapunzel: / tmp / debian6-19-04-2012 #
      
    3. Dengan gambar terpasang Anda mungkin ingin menyalin ini di tempat yang lebih permanen untuk menghindari menggunakan perangkat loopback selamanya. Saya membuat volume LVM2 dan memasangnya di / mnt / rpi-root, jadi saya lakukan:

      cp -rav / mnt / pi-root-loop / * / mnt / rpi-root /
      
    4. Kita perlu mengekspor filesystem sekarang, jadi kita perlu menambahkan baris seperti:

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

      ke / etc / ekspor pada server NFS, di mana 192.168.1.2 adalah alamat Raspberry Pi. Setelah menambahkan, jalankan exportfs -rvuntuk membaca kembali daftar ekspor. (Lihat ekspor (5) untuk opsi lebih lanjut termasuk wildcard / subnet daripada host individual)

    Anda juga bisa melewatkan langkah ini dan membangun sistem file root dari awal menggunakan sesuatu seperti multistrap.

  2. Sekarang kita perlu membangun kartu SD yang melakukan booting dan booting tahap awal menggunakan share NFS ini. Saya melakukan ini dengan mengambil partisi pertama dari gambar resmi dan menyalinnya ke kartu SD, di mana kartu SD adalah / dev / sdx:

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

    dan karena ini hanya menyalin partisi pertama yang mengedit tabel partisi dengan fdisk untuk menghapus dua partisi yang tidak kita salin.

    Setelah itu saya memasang partisi dari kartu SD dan mengedit file cmdline.txt dari itu untuk membaca:

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

    di mana 192.168.1.1 adalah alamat server NFS. Jika Anda tidak ingin menggunakan DHCP, Anda dapat mengatur cara alternatif alamat IP, lihat dokumen ini untuk rincian lebih lanjut.

    Setelah ini selesai, Anda dapat melepas kartu SD dan mem-boot Rapsberry Pi Anda dengan root NFS. Anda juga dapat memanipulasi sistem file dari sisi server, atau klien NFS lain sesuai keinginan Anda (mis. QEMU + binfmt_misc , snapshot LVM, sistem cadangan, dll.)

Hal-hal opsional

  • Mengatur RAMRUN dan RAMLOCK ke yes di / etc / default / rcS menyebabkan / var / run dan / var / lock masing-masing untuk dipasang sebagai tmpfs (mis. Ramdisk) - ini mungkin bermanfaat, bahkan jika Anda hanya memiliki satu perangkat booting dari Sistem file NFS.
  • Jika Anda menggunakan ip = dhcp Anda mungkin perlu mengomentari baris:

    #iface eth0 inet dhcp
    

    di / etc / network / interfaces (/ mnt / rpi-root / etc / network / interfaces) untuk menghindari situasi di mana swapping antara DHCP booting awal dan yang biasa nanti menyebabkan pesan seperti:

    nfs: server 192.168.1.1 tidak merespons, masih mencoba

  • Jika Anda ingin mem-boot banyak perangkat dari root yang sama, Anda perlu menyediakan / "tmp" (mungkin tmpfs) dan seluk-beluk lainnya untuk menghindari masalah dengan beberapa mesin yang mencoba menulis ke file yang sama.

Flexo
sumber
terima kasih untuk tutorial terperinci ini. Saya bekerja dengan sempurna dengan gambar terakhir. Sekarang ketika saya mencoba mengikuti langkah yang persis sama untuk gambar baru yang dirilis dua hari yang lalu saya menemukan kesalahan. Memeriksa sistem file root gagal dengan kesalahan berikut: fsck.ext4: Tidak ada perangkat atau alamat seperti itu ketika mencoba untuk membuka / menjalankan / rootdev Mungkin ada perangkat swap atau tidak ada? fsck meninggal dengan status keluar 8 Ada saran? Klaus
Saya tidak memiliki akses ke perangkat untuk memeriksa sekarang. Kedengarannya seperti kernel mungkin dibangun tanpa dukungan root nfs.
Flexo
1
Sepertinya saya sudah menemukan solusinya. Saya telah mengubah fstab: proc / proc defaults 0 0 / dev / mmcblk0p1 / boot vfat default 0 2 # / dev / mmcblk0p2 / ext4 default, noatime 0 1 Pertanyaannya adalah mengapa digunakan untuk bekerja dengan gambar sebelumnya. Itu baru saja gagal menjalankan: S05checkroot.sh. BTW: Apakah Anda punya ide bagaimana mengelola partisi swap. Apakah kita membutuhkannya?
Apakah mungkin untuk setengah keledai dan hanya NFS semuanya? yaitu. tuan rumah ekspor /home/user/Documents/raspisRootFolderdan klien fstabhanya menunggangi semuanya /?
puk
Jawaban bagus, membebaskan saya dari kartu SD yang gagal; memindahkan semuanya ke server NAS saya. Saya juga komentar /dev/mmcblk0p2 / ext4 defaults,noatime 0 1dari /etc/fstab, meskipun saya pikir itu akan gagal tanpa menyebabkan masalah apapun jika Anda meninggalkannya di.
TomG