Встановити файлову систему лише для читання і перенаправлення запису в оперативну пам’ять?


21

Чи можна встановити файл циклу, як лише для читання, і перенаправити всі записи в оперативну пам’ять?

Відповіді:


18

Можна використовувати рівень файлової системи об'єднання, як aufs .

Демонстрація:

Створіть зображення файлової системи

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

Монтуйте його, заселяйте

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

Монтуйте його лише для читання

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

Невелика файлова система RAM

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

Поєднайте обидва

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

Цей варіант монтування створити нову "гілку" ( br), укладаючи /tmp/rammnt(читати-записувати) зверху /tmp/imgmnt(лише для читання). Ця "гілка" стає видимою як файлова система (читання-запис) /tmp/combined.

(Дивіться сторінку чоловіка aufs (5) для всіх деталей.)

Тепер все, що зроблено, ось що у вас є:

# 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

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

Ви могли використовувати звичайний каталог (у файловій системі читання / записування) або, можливо, каталог під, /dev/shmякщо це працює для вас, замість того, щоб створити певну tmpfsдля цього.


Цей прийом (або його варіації) використовується деяким дистрибутивом LiveCD. Вікіпедія Aufs елемент містить кілька.


+1 спасибі! Питання: (1) чи можна це зробити за допомогою fstabтакої точки монтажу /? (тобто так система завантажується з знімного зображення, дуже багато.)
Мехрдад

Я не думаю, що так. Якщо ви хочете зробити це для того /, я вважаю, що вам краще з initrd (саме так я вважаю, що це зроблено для livecds). Ви можете зробити це за допомогою сценарію init, хоча це звучить складно.
Мат

8

Оновлення:

Здається, є два інші простіші способи зробити це на Ubuntu (принаймні, більш пізні версії):

  1. sudo apt-get install overlayrootа потім, встановивши overlayroot="tmpfs:swap=1,recurse=0"в/etc/overlayroot.local.conf .

  2. sudo apt-get install fsprotectз подальшим переходом fsprotectяк параметр ядра


Нарешті я зрозумів, як це зробити з кореневою файловою системою (в Ubuntu 11.04)!

Етапи для створення завантажувальної системи прості. Я використовував цей посібник у поєднанні з цим посібником та низкою веб-пошуків, щоб з’ясувати, як змусити його працювати належним чином, без помилок.

Підсумок:

  1. Виконати:

    sudo apt-get install fsprotect apparmor-utils
    
  2. Збережіть це в /etc/initramfs-tools/scripts/init-bottom/__rootaufs. Я не думаю, що ім'я насправді має значення, але початок __може використовуватися для замовлення, тому якщо ви зміните ім’я, можливо, захочете зберегти підкреслення. (Це копія цього файлу .)

    #!/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. В /etc/default/grub, знайдіть рядок , яка починається з GRUB_CMDLINE_LINUX_DEFAULT, і всередині лапок , які слідують, додати параметр aufs=tmpfs.

    Бонус: Якщо вам потрібно періодично вимикати переадресацію, просто видаліть цей аргумент зі списку параметрів ядра. Можливо, ви можете це зробити, утримуючи клавішу Shift під час завантаження системи, щоб відобразити меню GRUB; потім натисніть e, щоб відредагувати параметри та просто стерти aufs=...параметр зі списку.

  4. Додайте ці рядки до /etc/sysctl.conf. ( Попередження : Потенційний ризик для безпеки.)

    kernel.yama.protected_nonaccess_hardlinks = 0
    kernel.yama.protected_sticky_symlinks = 0
    
  5. Запустіть ці рядки:

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

Якщо все пішло добре, при перезавантаженні ви будете робити це у тимчасовій файловій системі. Частина оперативної пам’яті буде в /rw, а зображення диска - у /ro, але, звичайно, це буде лише для читання.

Тим не менш, якщо ви завантажилися у тимчасову систему, але вам потрібно внести постійні зміни, ви можете знову встановити /roфайлову систему, сказавши

sudo mount -o remount,rw /ro

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


2

Так, по Unionfs див. Unionfs.filesystems.org . Ви маєте змонтувати першу файлову систему лише для читання, а також другу файлову систему RAM для читання та запису через unionfs.

В Ubuntu ви можете знайти пакунок unionfs-fuse, який є іншою реалізацією тих же речей, але в просторі користувача, а не як модуль ядра.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.