Подробный гайд: Монтирование устройства или раздела в режиме только для чтения (RO)
1. Что такое RO-монтирование
Режим ro означает, что файловая система смонтирована только для чтения:
- файлы можно читать;
- нельзя создавать, изменять, удалять файлы;
- нельзя изменять метаданные файловой системы через обычные операции;
- большинство программ получит ошибку при попытке записи.
Пример:
mount -o ro /dev/sdb1 /mnt
2. Быстрая шпаргалка
Смонтировать раздел только для чтения
sudo mkdir -p /mnt/ro
sudo mount -o ro /dev/sdb1 /mnt/ro
Проверить, что смонтировано RO
findmnt /mnt/ro
или:
mount | grep /mnt/ro
В опциях должно быть что-то вроде:
ro,noatime
Перемонтировать уже смонтированную ФС в RO
sudo mount -o remount,ro /mnt/ro
Размонтировать
sudo umount /mnt/ro
Если занято:
sudo fuser -mv /mnt/ro
sudo lsof +D /mnt/ro
3. Подготовка: определить устройство
Перед монтированием важно понять, какое устройство или раздел нужно монтировать.
Посмотреть блочные устройства
lsblk -f
Пример вывода:
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 12345678-1234-1234-1234-123456789abc /
└─sdb1 xfs 87654321-4321-4321-4321-cba987654321
Посмотреть UUID
sudo blkid
Пример:
/dev/sdb1: UUID="87654321-4321-4321-4321-cba987654321" TYPE="xfs"
Посмотреть текущие монтирования
findmnt
или:
cat /proc/mounts
4. Монтирование обычного раздела в RO
Общая команда
sudo mkdir -p /mnt/ro
sudo mount -o ro /dev/sdXN /mnt/ro
Где:
/dev/sdXN— ваш раздел;/mnt/ro— точка монтирования.
Пример:
sudo mkdir -p /mnt/ro
sudo mount -o ro /dev/sdb1 /mnt/ro
Проверка
findmnt /mnt/ro
Ожидаемый фрагмент опций:
ro
5. Монтирование по UUID вместо /dev/sdX
Использовать UUID надежнее, потому что имена устройств могут меняться.
Пример:
sudo mount -o ro UUID=87654321-4321-4321-4321-cba987654321 /mnt/ro
Узнать UUID:
sudo blkid /dev/sdb1
6. Монтирование конкретных файловых систем
ext2 / ext3 / ext4
sudo mount -t ext4 -o ro /dev/sdb1 /mnt/ro
Если файловая система повреждена, ядро может предложить или принудительно смонтировать ее read-only.
Иногда полезно добавить:
sudo mount -t ext4 -o ro,noload /dev/sdb1 /mnt/ro
Опция noload не воспроизводит журнал ext4. Это может быть полезно при forensic-анализе или поврежденной ФС, но файловая система может остаться в неконсистентном состоянии.
Для поврежденной ext4 также можно использовать:
sudo mount -t ext4 -o ro,errors=continue /dev/sdb1 /mnt/ro
Но лучше сначала сделать образ диска, если данные важны.
XFS
sudo mount -t xfs -o ro /dev/sdb1 /mnt/ro
Если XFS имеет грязный журнал, монтирование может потребовать восстановления.
В диагностических целях можно попробовать:
sudo mount -t xfs -o ro,norecovery /dev/sdb1 /mnt/ro
Внимание:
norecovery не выполняет восстановление журнала. Это может быть нужно для анализа, но не для обычной работы.
Btrfs
sudo mount -t btrfs -o ro /dev/sdb1 /mnt/ro
Если нужно смонтировать конкретный подтом:
sudo mount -t btrfs -o ro,subvol=@ /dev/sdb1 /mnt/ro
Посмотреть подтома:
sudo btrfs subvolume list /dev/sdb1
или, если том уже смонтирован:
btrfs subvolume list /mnt/ro
ISO-образ
ISO обычно монтируется через loop-устройство и является read-only по природе.
sudo mkdir -p /mnt/iso
sudo mount -o ro,loop /path/to/image.iso /mnt/iso
Пример:
sudo mount -o ro,loop ubuntu.iso /mnt/iso
SquashFS
SquashFS обычно уже является read-only.
sudo mount -t squashfs -o ro /path/to/file.squashfs /mnt/ro
FAT / exFAT / NTFS
Для FAT/exFAT:
sudo mount -t auto -o ro /dev/sdb1 /mnt/ro
Для NTFS в Linux часто используется ntfs-3g:
sudo mount -t ntfs-3g -o ro /dev/sdb1 /mnt/ro
Если нужно принудительно указать тип:
sudo mount -t ntfs3 -o ro /dev/sdb1 /mnt/ro
или:
sudo mount -t ntfs-3g -o ro /dev/sdb1 /mnt/ro
7. Перемонтирование в read-only
Если файловая система уже смонтирована в read-write, ее можно перемонтировать в read-only:
sudo mount -o remount,ro /mnt/point
Пример:
sudo mount -o remount,ro /mnt/data
Проверка:
findmnt /mnt/data
Если перемонтирование не удается
Причина обычно в том, что какая-то программа держит файлы открытыми для записи или точка монтирования используется как рабочая директория.
Посмотреть процессы:
sudo fuser -mv /mnt/data
или:
sudo lsof +D /mnt/data
Можно завершить процессы, но только если вы понимаете последствия.
Например:
sudo fuser -km /mnt/data
Внимание:
Это принудительно завершит процессы, использующие точку монтирования.
8. Перемонтирование корневой файловой системы в RO
Иногда нужно перевести корень в read-only, например для диагностики или аварийного восстановления.
sudo mount -o remount,ro /
Но на работающей системе это часто не получается, потому что корень активно используется. Если нужно безопасно перевести корень в RO:
1. Перейти в rescue/target или single-user mode:
sudo systemctl isolate rescue.target
2. Затем:
mount -o remount,ro /
Или загрузиться в recovery mode и выполнить:
mount -o remount,ro /
Если нужно снова в read-write:
mount -o remount,rw /
9. Монтирование RO через /etc/fstab
Если нужно, чтобы раздел всегда монтировался только для чтения, добавьте опцию ro в /etc/fstab.
Пример строки:
UUID=87654321-4321-4321-4321-cba987654321 /mnt/data ext4 ro,noatime 0 2
или для XFS:
UUID=87654321-4321-4321-4321-cba987654321 /mnt/data xfs ro,noatime 0 0
После редактирования:
sudo systemctl daemon-reload
sudo mount -a
Или смонтировать конкретную точку:
sudo mount /mnt/data
Проверка:
findmnt /mnt/data
10. Монтирование через systemd mount unit
Альтернатива /etc/fstab — systemd mount-юниты.
Например, создайте файл:
sudo nano /etc/systemd/system/mnt-data.mount
Содержимое:
[Unit]
Description=Read-only data mount
[Mount]
What=/dev/disk/by-uuid/87654321-4321-4321-4321-cba987654321
Where=/mnt/data
Type=ext4
Options=ro,noatime
[Install]
WantedBy=multi-user.target
Если нужно, чтобы монтирование происходило автоматически при обращении:
sudo nano /etc/systemd/system/mnt-data.automount
Содержимое:
[Unit]
Description=Automount read-only data
[Automount]
Where=/mnt/data
[Install]
WantedBy=multi-user.target
Применить:
sudo systemctl daemon-reload
sudo systemctl enable --now mnt-data.automount
Проверка:
findmnt /mnt/data
11. Read-only bind mount
Bind mount позволяет смонтировать уже существующую директорию в другое место.
Создать bind mount
sudo mount --bind /source/dir /mnt/bind
Сделать его read-only
sudo mount -o remount,ro,bind /mnt/bind
Важно:
Для read-only bind mount обычно нужно делать именно remount,ro,bind.
Пример полностью:
sudo mkdir -p /mnt/bind
sudo mount --bind /etc /mnt/bind
sudo mount -o remount,ro,bind /mnt/bind
Проверка:
findmnt /mnt/bind
В опциях должно быть что-то вроде:
ro,relatime
Нюанс bind mount
Иногда нужно явно указать:
sudo mount -o remount,ro,bind /mnt/bind
а не просто:
sudo mount -o remount,ro /mnt/bind
Потому что bind-монтирование имеет отдельный флаг bind.
12. Read-only loop mount файла
Если нужно смонтировать файл как блочное устройство только для чтения:
sudo mount -o ro,loop /path/to/file.img /mnt/ro
Пример:
sudo mount -o ro,loop disk.img /mnt/ro
Если нужно смонтировать конкретный раздел внутри образа, используйте offset.
Например, если раздел начинается с 1048576 байт:
sudo mount -o ro,loop,offset=1048576 disk.img /mnt/ro
Посмотреть разделы в образе:
fdisk -l disk.img
или:
parted disk.img unit B print
13. Монтирование LUKS-контейнера в режиме read-only
Если диск зашифрован LUKS, можно открыть его в read-only режиме.
Открыть LUKS как read-only
sudo cryptsetup --readonly open /dev/sdb1 secure_disk
Появится устройство:
/dev/mapper/secure_disk
Дальше монтируем:
sudo mkdir -p /mnt/ro
sudo mount -o ro /dev/mapper/secure_disk /mnt/ro
Закрыть
sudo umount /mnt/ro
sudo cryptsetup close secure_disk
14. Монтирование LVM в read-only
Для LVM можно активировать тома в read-only режиме.
Посмотреть volume groups
sudo vgs
sudo lvs
Активировать VG в read-only
sudo vgchange -ay --readonly vg_name
Затем смонтировать логический том:
sudo mount -o ro /dev/vg_name/lv_name /mnt/ro
Деактивировать
sudo umount /mnt/ro
sudo vgchange -an vg_name
15. Аппаратная или блочная защита от записи
Иногда нужно запретить запись на уровне блочного устройства.
Проверить статус read-only у блока
blockdev --getro /dev/sdb
Если вывод:
0
устройство доступно для записи.
Если:
1
устройство в режиме read-only.
Установить read-only на блочное устройство
sudo blockdev --setro /dev/sdb
Снять:
sudo blockdev --setrw /dev/sdb
Важно:
Это не всегда работает для всех устройств, особенно USB-флешек, SD-карт и некоторых аппаратных контроллеров.
16. Защита SD-карты или USB-устройства
Если SD-карта имеет физический переключатель Lock, переведите его в положение Lock. Тогда система не сможет писать на карту, если драйвер и картридер корректно обрабатывают этот переключатель.
Для USB-флешек аппаратная защита часто отсутствует, но можно использовать:
sudo blockdev --setro /dev/sdb
или udev-правила.
17. Udev-правило для автоматического RO
Можно создать правило, которое будет помечать конкретное устройство как read-only.
Создайте файл:
sudo nano /etc/udev/rules.d/99-readonly.rules
Пример для конкретного устройства по UUID:
ENV{ID_FS_UUID}=="87654321-4321-4321-4321-cba987654321", ENV{UDISKS_SYSTEM}="1", OPTIONS+="static_node=dm-0"
Но более практичный подход — использовать udev для установки атрибутов, если устройство их поддерживает.
Пример по модели/серийному номеру:
SUBSYSTEM=="block", ATTRS{model}=="YourDeviceModel", ATTR{ro}="1"
Проверить атрибуты устройства:
udevadm info -a -n /dev/sdb
Перезагрузить правила:
sudo udevadm control --reload-rules
sudo udevadm trigger
Не все устройства поддерживают запись в атрибут ro.
18. Проверка, что монтирование действительно RO
Проверка через findmnt
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS
Пример вывода:
TARGET SOURCE FSTYPE OPTIONS
/mnt/ro /dev/sdb1 ext4 ro,noatime
Проверка через mount
mount | grep /mnt/ro
Проверка через /proc/mounts
grep /mnt/ro /proc/mounts
Попытка записи
touch /mnt/ro/testfile
Если ФС в RO, вы должны получить:
touch: cannot touch '/mnt/ro/testfile': Read-only file system
19. Типичные ошибки и их причины
Ошибка: mount: /mnt/ro: cannot mount; probably incompatible filesystem
Возможные причины:
- неверный тип файловой системы;
- поврежденная ФС;
- отсутствует драйвер;
- устройство не является тем, что вы думаете.
Что делать:
sudo blkid /dev/sdb1
sudo file -s /dev/sdb1
dmesg | tail
Ошибка: mount: /mnt/ro: wrong fs type, bad option, bad superblock
Проверьте устройство:
sudo blkid /dev/sdb1
sudo dmesg | tail
Если файловая система повреждена и данные важны, не запускайте агрессивное восстановление на оригинале.
Лучше сделать образ:
sudo ddrescue -f -n /dev/sdb1 /path/to/image.img /path/to/logfile.log
И работать уже с образом.
Ошибка: mount: /mnt/ro: permission denied
Нужны права root:
sudo mount -o ro /dev/sdb1 /mnt/ro
Ошибка: mount point is busy
При размонтировании или remount:
sudo fuser -mv /mnt/ro
sudo lsof +D /mnt/ro
Файловая система смонтирована RO, но некоторые файлы можно менять
Проверьте, нет ли отдельных bind mount, tmpfs или overlayfs поверх этой файловой системы.
findmnt -R /
Также проверьте:
cat /proc/mounts
20. RO и ошибки файловой системы
Для ext4 есть опции обработки ошибок:
errors=continue— продолжать работу после ошибок;errors=remount-ro— перемонтировать в read-only при ошибках;errors=panic— вызвать kernel panic при ошибках.
Пример:
sudo mount -o ro,errors=continue /dev/sdb1 /mnt/ro
В /etc/fstab:
UUID=... /mnt/data ext4 ro,errors=continue 0 2
21. Если нужно защитить данные на поврежденном диске
Если диск подозревается в неисправности, лучше не монтировать его в read-write вообще.
Рекомендуемый порядок:
- Не запускать
fsckна оригинале, если данные важны.
2. Сделать посекторный образ:
sudo ddrescue -f -n /dev/sdb /path/to/image.img /path/to/rescue.log
3. Работать с образом:
sudo mount -o ro,loop /path/to/image.img /mnt/ro
Если в образе есть разделы:
sudo kpartx -av image.img
Затем монтировать появившиеся устройства:
sudo mount -o ro /dev/mapper/loop0p1 /mnt/ro
Убрать:
sudo umount /mnt/ro
sudo kpartx -dv image.img
22. Монтирование NFS в режиме read-only
Для NFS read-only можно задать на клиенте:
sudo mount -t nfs -o ro server:/export/share /mnt/ro
Пример:
sudo mount -t nfs -o ro 192.168.1.10:/srv/share /mnt/ro
Но важно понимать: ro на клиенте запрещает запись с этого клиента. Сервер может все равно разрешать запись другим клиентам.
В /etc/fstab:
server:/srv/share /mnt/ro nfs ro,soft,timeo=30 0 0
23. Read-only в контейнерах и systemd
systemd service с read-only корнем
В unit-файле можно использовать:
[Service]
ReadOnlyPaths=/
ReadWritePaths=/var/lib/myapp
Или более жестко:
[Service]
ProtectSystem=strict
PrivateTmp=true
ReadWritePaths=/var/lib/myapp
Docker read-only container
docker run --read-only -it alpine sh
Если нужны временные каталоги для записи:
docker run --read-only \
--tmpfs /tmp \
--tmpfs /run \
-it alpine sh
24. OverlayFS поверх read-only файловой системы
Иногда базовая файловая система делается read-only, а изменения сохраняются в верхний слой.
Пример:
sudo mount -t overlay overlay \
-o lowerdir=/lower,upperdir=/upper,workdir=/work \
overlay /mnt/merged
Где:
/lower— read-only слой;/upper— слой для изменений;/work— служебный каталог overlayfs;/mnt/merged— итоговая точка монтирования.
Это полезно для embedded-систем, live-систем и защищенных киосков.
25. Разница между ro, nosuid, nodev, noexec
Опция ro не то же самое, что nosuid, nodev, noexec.
ro
Запрещает запись.
noexec
Запрещает исполнение файлов.
nosuid
Игнорирует set-user-ID и set-group-ID биты.
nodev
Запрещает интерпретацию специальных файлов устройств.
Пример безопасного монтирования:
sudo mount -o ro,noexec,nosuid,nodev /dev/sdb1 /mnt/ro
В /etc/fstab:
UUID=... /mnt/ro ext4 ro,noexec,nosuid,nodev 0 2
26. Пример полного сценария: подключить внешний диск RO
Допустим, появился внешний диск /dev/sdb1.
1. Смотрим устройство
lsblk -f
sudo blkid
2. Создаем точку монтирования
sudo mkdir -p /mnt/external-ro
3. Монтируем только для чтения
sudo mount -o ro,noexec,nosuid,nodev /dev/sdb1 /mnt/external-ro
4. Проверяем
findmnt /mnt/external-ro
5. Пробуем запись
touch /mnt/external-ro/test
Ожидаемая ошибка:
Read-only file system
6. Размонтируем
sudo umount /mnt/external-ro
27. Пример: сделать существующий каталог доступным только для чтения через bind
Исходный каталог:
/data/shared
Нужно предоставить его в /mnt/shared-ro только для чтения.
sudo mkdir -p /mnt/shared-ro
sudo mount --bind /data/shared /mnt/shared-ro
sudo mount -o remount,ro,bind /mnt/shared-ro
Проверка:
findmnt /mnt/shared-ro
Попытка записи:
touch /mnt/shared-ro/file
Должно быть:
Read-only file system
28. Пример: автоматически монтировать раздел RO при загрузке
Допустим, раздел:
/dev/sdb1
UUID:
87654321-4321-4321-4321-cba987654321
Точка монтирования:
/mnt/readonly
Создаем точку:
sudo mkdir -p /mnt/readonly
Редактируем:
sudo nano /etc/fstab
Добавляем:
UUID=87654321-4321-4321-4321-cba987654321 /mnt/readonly ext4 ro,noatime,nosuid,nodev 0 2
Применяем:
sudo systemctl daemon-reload
sudo mount -a
Проверяем:
findmnt /mnt/readonly
29. Если нужно монтировать root filesystem в read-only постоянно
Это отдельная большая тема, потому что Linux ожидает возможность записи в /var, /tmp, /run, /etc и другие каталоги.
Обычно используют один из подходов:
Вариант 1: root RO + tmpfs для изменяемых каталогов
Например, /etc, /var, /tmp могут быть tmpfs или overlayfs.
Пример записи в /etc/fstab:
tmpfs /tmp tmpfs defaults,noatime 0 0
tmpfs /var/log tmpfs defaults,noatime 0 0
tmpfs /var/tmp tmpfs defaults,noatime 0 0
Но это может сломать сервисы, которые ожидают сохранения логов и состояния.
Вариант 2: overlayfs
Базовый root read-only, изменения пишутся в отдельный слой.
Вариант 3: специализированные решения
Например:
- OSTree;
- immutable Linux;
- read-only embedded rootfs;
- initramfs-based setups;
- LiveCD-style overlay.
30. Короткий ответ для большинства случаев
Если вам нужно просто смонтировать раздел только для чтения:
sudo mkdir -p /mnt/ro
sudo mount -o ro /dev/sdXN /mnt/ro
Проверить:
findmnt /mnt/ro
Размонтировать:
sudo umount /mnt/ro
Если нужно перемонтировать уже смонтированный раздел в RO:
sudo mount -o remount,ro /mnt/ro
Если нужно навсегда:
UUID=... /mnt/ro ext4 ro,noatime 0 2
в /etc/fstab.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.