GNU/Linux >> Znalost Linux >  >> Linux

Připojit souborový systém pouze pro čtení a přesměrovat zápisy do RAM?

Je to možné pomocí sjednocující vrstvy souborového systému jako aufs.

Demo:

Vytvořte obraz systému souborů

# 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 
...

Připojit, naplnit

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

Připojit pouze pro čtení

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

Malý souborový systém RAM

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

Zkombinujte obě

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

Tato možnost připojení k vytvoření nové "větve" (br ) skládáním /tmp/rammnt (čtení i zápis) nad /tmp/imgmnt (pouze ke čtení). Tato "větev" je viditelná jako souborový systém (čtení-zápis) na /tmp/combined .

(Všechny podrobnosti najdete na manuálové stránce aufs(5).)

Nyní je vše hotovo, zde je to, co máte:

# 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

Takže do tmpfs zapíše "stop". souborový systém, nepokoušejí se šířit zpět do souboru obrazu připojeného smyčkou.

Mohli jste použít prostý adresář (na souborovém systému pro čtení/zápis) nebo možná adresář pod /dev/shm pokud vám to vyhovuje, místo vytvoření konkrétního tmpfs za to.

Tuto techniku ​​(nebo její varianty) používají některé distribuce LiveCD. Záznam Wikipedia aufs jich několik uvádí.


Aktualizace:

Zdá se, že existují 2 další jednodušší způsoby, jak to udělat na Ubuntu (alespoň novější verze):

  1. sudo apt-get install overlayroot následuje nastavení overlayroot="tmpfs:swap=1,recurse=0" v /etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotect následuje předání fsprotect jako parametr jádra

Konečně jsem přišel na to, jak to udělat s kořenovým souborovým systémem (v Ubuntu 11.04)!

Kroky pro vytvoření bootovatelného systému jsou jednoduché. Použil jsem tuto příručku v kombinaci s touto příručkou a spoustou vyhledávání na webu, abych zjistil, jak správně fungovat bez chyb.

Shrnutí:

  1. Spustit:

    sudo apt-get install fsprotect apparmor-utils
    
  2. Uložte to do /etc/initramfs-tools/scripts/init-bottom/__rootaufs . Nemyslím si, že ve skutečnosti záleží na názvu, ale na začátku __ může být použit pro účely objednávání, takže pokud změníte název, možná budete chtít ponechat podtržítka. (Toto je kopie tohoto souboru.)

    #!/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. V /etc/default/grub , najděte řádek, který začíná GRUB_CMDLINE_LINUX_DEFAULT a do uvozovek, které následují, přidejte parametr aufs=tmpfs .

    Bonus: Pokud potřebujete občas vypnout přesměrování dočasně, jednoduše odstraňte tento argument ze seznamu parametrů jádra. Pravděpodobně to můžete udělat tak, že při spouštění systému podržíte klávesu Shift, aby se zobrazila nabídka GRUB; poté stiskněte e upravte parametry a smažte aufs=... parametr ze seznamu.

  4. Připojte tyto řádky k /etc/sysctl.conf . (Upozornění :Potenciální bezpečnostní riziko.)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. Spusťte tyto řádky:

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

Pokud vše proběhlo v pořádku, po restartu tak učiníte do dočasného souborového systému. Část RAM bude mít hodnotu /rw a obraz disku bude mít hodnotu /ro , ale bude samozřejmě pouze pro čtení.

Pokud jste však zavedli dočasný systém, ale potřebujete provést trvalou změnu, můžete znovu připojit /ro souborový systém vyslovením

sudo mount -o remount,rw /ro

aby bylo možné do něj zapisovat, a pak můžete v tomto adresáři provést jakékoli potřebné úpravy.


Ano, od unionfs, viz unionfs.filesystems.org. Nejprve jste připojili souborový systém pouze pro čtení a jako druhý souborový systém RAM pro čtení a zápis prostřednictvím unionfs.

V Ubuntu můžete najít balíček unionfs-fuse, což je další implementace stejných věcí, ale v uživatelském prostoru, ne jako modul jádra.


Linux
  1. SSHFS? Co to je a jak to mohu použít?

  2. Jak připojit souborový systém, mapování uživatelských id?

  3. Připojit souborový systém Cifs přímo nebo přes Fstab?

  1. Mount a Automount a bezpečnostní problémy?

  2. Jak vytvořit soubor a připojit jej jako souborový systém?

  3. Jak vytvořit/odebrat a připojit systém souborů Stratis v CentOS/RHEL 8

  1. Vypsat pouze připojení připojení

  2. Připojte soubor zip jako souborový systém pouze pro čtení

  3. Jak připojit souborový systém v prostředí pouze pro čtení?