GNU/Linux >> Belajar Linux >  >> Linux

Pasang sistem file hanya-baca, dan alihkan penulisan ke RAM?

Dimungkinkan menggunakan lapisan sistem file gabungan seperti aufs.

Demo:

Buat gambar sistem file

# dd if=/dev/zero of=/tmp/image bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.0028428 s, 369 MB/s
# mke2fs /tmp/image 
...

Pasang, isi

# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt

Pasang hanya-baca

# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt 
-su: /tmp/imgmnt/hello.txt: Read-only file system

Sistem file RAM kecil

# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt

Gabungkan keduanya

# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined

Opsi pemasangan itu untuk membuat "cabang" baru (br ) dengan menumpuk /tmp/rammnt (baca-tulis) di atas /tmp/imgmnt (hanya baca). "Cabang" ini dibuat terlihat sebagai sistem berkas (baca-tulis) pada /tmp/combined .

(Lihat halaman manual aufs(5) untuk semua detailnya.)

Sekarang semua selesai, inilah yang Anda miliki:

# ls /tmp/combined
hello.txt  lost+found
# cat /tmp/combined/hello.txt 
hello
# echo bye > /tmp/combined/hello.txt 
# cat /tmp/combined/hello.txt 
bye

# cat imgmnt/hello.txt 
hello
# cat rammnt/hello.txt 
bye

Jadi tulisan "stop" di tmpfs filesystem, mereka tidak berusaha menyebarkan kembali ke file gambar yang terpasang di loop.

Anda dapat menggunakan direktori biasa (pada sistem file baca/tulis), atau mungkin direktori di bawah /dev/shm jika itu berhasil untuk Anda, alih-alih membuat tmpfs tertentu untuk itu.

Teknik ini (atau variasinya) digunakan oleh beberapa distribusi LiveCD. Entri aufs Wikipedia mencantumkan beberapa.


Pembaruan:

Sepertinya ada 2 cara lain yang lebih sederhana untuk melakukan ini di Ubuntu (setidaknya versi yang lebih baru):

  1. sudo apt-get install overlayroot diikuti dengan pengaturan overlayroot="tmpfs:swap=1,recurse=0" di /etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotect diikuti dengan meneruskan fsprotect sebagai parameter kernel

Saya akhirnya menemukan cara melakukan ini dengan sistem file root (di Ubuntu 11.04)!

Langkah-langkah untuk membuat sistem dapat di-boot sangatlah sederhana. Saya menggunakan panduan ini dalam kombinasi dengan panduan ini dan banyak penelusuran web untuk mengetahui cara membuatnya berfungsi dengan baik, tanpa bug.

Ringkasan:

  1. Jalankan:

    sudo apt-get install fsprotect apparmor-utils
    
  2. Simpan ini ke /etc/initramfs-tools/scripts/init-bottom/__rootaufs . Menurut saya nama sebenarnya tidak penting, tetapi awal __ mungkin digunakan untuk tujuan pengurutan, jadi jika Anda mengubah nama, Anda mungkin ingin mempertahankan garis bawah.(Ini adalah salinan dari file ini.)

    #!/bin/sh -e
    
    case $1 in
      prereqs)
        exit 0
        ;;
    esac
    
    for x in $(cat /proc/cmdline); do
      case $x in
        root=*)
          ROOTNAME=${x#root=}
          ;;
        aufs=*)
          UNION=${x#aufs=}
        case $UNION in
          LABEL=*)
            UNION="/dev/disk/by-label/${UNION#LABEL=}"
            ;;
          UUID=*)
            UNION="/dev/disk/by-uuid/${UNION#UUID=}"
            ;;
        esac    
          ;;
      esac
    done
    
    if [ -z "$UNION" ]; then
        exit 0
    fi
    
    # make the mount points on the init root file system
    mkdir /aufs /ro /rw
    
    # mount read-write file system
    if [ "$UNION" = "tmpfs" ]; then
      mount -t tmpfs rw /rw -o noatime,mode=0755
    else
      mount $UNION /rw -o noatime
    fi
    
    # move real root out of the way
    mount --move ${rootmnt} /ro
    
    mount -t aufs aufs /aufs -o noatime,dirs=/rw:/ro=ro
    
    # test for mount points on union file system
    [ -d /aufs/ro ] || mkdir /aufs/ro
    [ -d /aufs/rw ] || mkdir /aufs/rw
    
    mount --move /ro /aufs/ro
    mount --move /rw /aufs/rw
    
    # strip fstab off of root partition
    grep -v $ROOTNAME /aufs/ro/etc/fstab > /aufs/etc/fstab
    
    mount --move /aufs /root
    
    exit 0
    
  3. Di /etc/default/grub , temukan baris yang dimulai dengan GRUB_CMDLINE_LINUX_DEFAULT , dan di dalam tanda kutip yang mengikuti, tambahkan parameter aufs=tmpfs .

    Bonus: Jika Anda perlu sesekali mematikan pengalihan sementara, cukup hapus argumen ini dari daftar parameter kernel. Anda mungkin dapat melakukannya dengan menahan tombol Shift saat sistem melakukan booting, untuk menampilkan menu GRUB; lalu tekan e untuk mengedit parameter, dan hapus saja aufs=... parameter dari daftar.

  4. Tambahkan baris ini ke /etc/sysctl.conf . (Peringatan :Potensi risiko keamanan.)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. Jalankan baris ini:

    sudo aa-complain dhclient3
    sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs
    sudo update-initramfs -k all -u
    sudo update-grub
    

Jika semuanya berjalan dengan baik, saat Anda reboot, Anda akan melakukannya ke dalam sistem file sementara. Bagian RAM akan berada di /rw , dan disk image akan berada di /ro , tapi tentu saja itu hanya bisa dibaca.

Namun demikian, jika Anda telah mem-boot ke sistem sementara tetapi perlu melakukan perubahan permanen, Anda dapat memasang ulang /ro sistem file dengan mengatakan

sudo mount -o remount,rw /ro

untuk membuatnya dapat ditulisi, lalu Anda dapat melakukan modifikasi apa pun yang diperlukan pada direktori tersebut.


Ya, oleh unionfs, lihat unionfs.filesystems.org. Anda harus memasang sistem file read-only pertama, dan sebagai sistem file RAM baca-tulis kedua melalui unionfs.

Di Ubuntu Anda dapat menemukan paket unionfs-fuse, yang merupakan implementasi lain dari hal yang sama, tetapi di ruang pengguna, bukan sebagai modul kernel.


Linux
  1. Cara Mengarahkan Output ke File dan Stdout di Linux

  2. Cara Memasang dan Melepas Drive di Linux

  3. Memasang Sistem File Cifs Secara Langsung Atau Melalui Fstab?

  1. Mount Dan Automount Dan Masalah Keamanan?

  2. Daftar hanya mengikat tunggangan

  3. Bagaimana cara memasang sistem file di lingkungan hanya-baca?

  1. Inode dan sistem file Linux

  2. SSHFS? Apa itu dan bagaimana cara menggunakannya?

  3. Bagaimana Cara Memasang Sistem File, Memetakan Userid?