Устройство смонтировано только для чтения, но я все еще могу писать на него (CentOS 6.8)

Вы правы, действительно "что-то должно было измениться между 2001 годом и настоящим". Книга, которую вы читаете, описывает мир в соответствии с первой исторической реализацией потоков POSIX в Linux, которая называется LinuxThreads (см. также статью Википедии).

У LinuxThreads были некоторые проблемы совместимости со стандартом POSIX — например, потоки, не использующие общие PID — и некоторые другие серьезные проблемы. Чтобы исправить эти недостатки, Red Hat инициировала другую реализацию под названием NPTL (собственная библиотека потоков POSIX), чтобы добавить необходимую поддержку библиотеки ядра и пользовательского пространства для достижения лучшего соответствия POSIX (взяв хорошие части из еще одного конкурирующего проекта повторной реализации IBM под названием NGPT (" Потоки Posix следующего поколения"), см. статью Википедии о NPTL). Дополнительные флаги, добавленные к системному вызову clone(2) (особенно CLONE_THREAD, на которые @ikkkachu указывает в своем ответе), вероятно, наиболее очевидная часть модификаций ядра. Часть работы, связанная с пользовательским пространством, в конечном итоге была включена в библиотеку GNU C.

В настоящее время некоторые встроенные Linux SDK используют старую реализацию LinuxThreads, потому что они используют версию LibC с меньшим объемом памяти, называемую uClibc (также называемую µClibc), и потребовалось значительное количество лет, прежде чем пользовательское пространство NPTL реализация из GNU LibC была перенесена и принята в качестве реализации потоковой передачи POSIX по умолчанию, поскольку, вообще говоря, эти специальные платформы не стремятся молниеносно следовать новейшим модам. Это можно наблюдать, заметив, что действительно PID для разных потоков на этих платформах также отличаются, в отличие от стандарта POSIX, - как описано в книге, которую вы читаете. На самом деле, как только вы вызвали pthread_create(), вы внезапно увеличили количество процессов с одного до трех, так как для сохранения беспорядка потребовался дополнительный процесс.

На странице руководства Linux pthreads(7) представлен исчерпывающий и интересный обзор различий между ними. Другим информативным, хотя и устаревшим, описанием различий является эта статья Ульриха Деппера и Инго Молнара о конструкции NPTL.

Я рекомендую вам не воспринимать эту часть книги слишком серьезно. Вместо этого я рекомендую Butenhof Programming POSIX threads и справочные страницы POSIX и Linux по этому вопросу. Многие учебники по этому вопросу неточны.

1
13.04.2017, 15:36
1 ответ

Я помню, как я где-то читал, возможно, на страницах руководства, что есть своего рода ошибка, которая означает, что сделать устройство доступным только для чтения, вам также необходимо перемонтировать устройство .

mount -o remount,ro ...

попробуйте добавить перемонтирование после других записей в fstab, ps mount может иметь файловую систему «none» в fstab.

ОБНОВЛЕНИЕ:

Я нашел соответствующую запись в человеке;

   mount(8) since v2.27 allows to change the mount options by passing the relevant options along with --bind.  For example:

          mount --bind,ro foo foo

   This feature is not supported by the Linux kernel; it is implemented in userspace by an additional mount(2) remounting syscall.  This solution is not atomic.

   The alternative (classic) way to create a read-only bind mount is to use the remount operation, for example:

          mount --bind olddir newdir
          mount -o remount,ro,bind olddir newdir

   Note that a read-only bind will create a read-only mountpoint (VFS entry), but the original filesystem superblock will  still  be  writable,  meaning  that  the  olddir  will  be
   writable, but the newdir will be read-only.

   It's impossible to change mount options recursively (for example with -o rbind,ro).

исходя из этого, вы можете попробовать использовать параметры fstab;

default,rbind,ro

в противном случае добавьте запись для повторного монтирования.

ОБНОВЛЕНИЕ 2 (man 8 mount / man 8 mount blockdev);

   -r, --read-only
          Mount the filesystem read-only.  A synonym is -o ro.

          Note  that,  depending  on the filesystem type, state and kernel behavior, the system may still write to the device.  For example, ext3 and ext4 will replay the journal if
          the filesystem is dirty.  To prevent this kind of write access, you may want to mount an ext3 or ext4 filesystem with the ro,noload mount options or set the  block  device
          itself to read-only mode, see the blockdev(8) command.

Это означает, что у вас есть выбор:

ro,noload

или использовать;

blockdev --setro /dev/...
0
28.01.2020, 01:08

Теги

Похожие вопросы