Визначте, чи встановлена ​​файлова система чи розділ RO чи RW через Bash Script?


37

Чи є простий спосіб визначити, чи змонтована файлова система монтується як лише для читання або для читання-запису? Я думав просто трубити, mountале думав, що може бути простіший спосіб.


1
Ідеальним системним викликом для цього було б те, statvfsщо, серед іншого, повертає поля прапора із прапором, що вказує на кріплення, призначене лише для читання. На жаль, я не знаю команди оболонки, щоб це зробити безпосередньо. Я б використав stat -f, але ця команда показує все, крім прапорів.
kasperd

2
Зауважте: як @Travis Кемпбел корисно пояснює у своєму коментарі на serverfault.com/a/277449/236916 , mountне завжди говорить вам про те, що ви хочете: перефразуючи, він читає /etc/mtab, що є кешованою версією даних, і може бути застарілим у деяких випадках. Інформація в /proc/mountsтому, що ви дійсно хочете.
mwfearnley

Відповіді:


51

Цей маленький вкладиш щось вискакує, якщо існує файлова система ro.

grep "[[:space:]]ro[[:space:],]" /proc/mounts 

Припустимо, що у вас зазвичай немає ро-файлової системи, як компакт-диск на диску, достатньо для деяких основних типів моніторингу і не потребує зміни файлової системи, щоб знайти поточний стан. Він також не передбачає тип вашої файлової системи. Переконайте це в grep -v iso9660, якщо ви не хочете, щоб ваші компакт-диски залишалися поза записом.


1
Мені довелося скористатися grep -P "\sro[\s,]" /proc/mountsабоgrep " ro[ ,]" /proc/mounts
WhiteKnight

3
Це набагато краща відповідь, ніж подяка "спробувати і створити файл".
Вагнерр

Це не говорить лише вам про параметри, які використовувались для монтажу, а не поточний статус? Наприклад, запис із параметрами ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0встановлюється як повторне перерахування як прочитане лише у випадку помилки, тому, не перевіряючи, mountви не знаєте, чи відбулося це повторне перетворення, отже, чи є воно фактично наразі в ro.
Вальф

Це не був мій досвід.
мерехтіння

3
У мене сьогодні був такий. Це коренева файлова система в ro, але вона була rw під час її запуску. $ grep "\sro[\s,]" /proc/mountsВихід:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
мерехтіння

11

Старе питання, але я натрапив на нього, шукаючи тієї самої допомоги і, здається, знайшов ще простіший спосіб без необхідності створювати файл.

    [ -w /root-rw ] && echo "rw" || echo "ro"
    rw
    [ -w /root-ro ] && echo "rw" || echo "ro"
    ro

Звичайно, root-ro - це ros fs, а root-rw - rw fs.


3
Це здається, щоб перевірити дозвіл файлової системи, але не статус монтування.
Роберт Калхун

1
Щоправда, але це дуже просто і може працювати в деяких випадках (як у мене).
Yajo

З man dashдля -wпараметра - "Файл не можна записати у файловій системі лише для читання, навіть якщо цей тест вказує на істинне". AFAIK це те саме для інших снарядів.
Graeme

7

Якщо файлова система змонтована, я б перейшов у тимчасовий каталог і спробую створити файл. Код повернення підкаже, чи є файлова система лише для читання або для читання-запису за умови, що файлова система не повна (дякую Віллему).


1
Якщо ви просто перевіряєте, як встановлений файл файлів, отримання вихідного з монтажу повинно вистачити. Але я повинен погодитися, це більш вичерпний спосіб перевірити. Є випадки, коли mount може повідомити, що він встановлений для читання / запису, але насправді лише для читання. Поширений приклад цього - велика кількість помилок SCSI на пристрої, що змушує його захищати себе, переходячи лише для читання. Створення файлу перевірить читання + запис / лише для читання без сумнівів.
Олексій

1
це було б охайно:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
glenn jackman

Сценарій, як написано, має перегони. Я б використовував FILE = mktemp -p /filesystem/of/interest/замість просто використовувати "afile" для створення файлу та імені файлу. кращий
Рік Шнайдер

1
Це неправильно повідомить про повну файлову систему як лише для читання.
Віллем

@David, Це здається, що стоп-хак замість справжнього рішення.
Pacerier

4

У мене просто було це питання, і це справжні пасти ...

Погляньте на / proc / mounts -

egrep " ro,|,ro " /proc/mounts 
/dev/sda3 / ext4 ro,seclabel,relatime,barrier=1,data=ordered 0 0    
/dev/sda5 /var ext4 ro,seclabel,relatime,barrier=1,data=ordered 0 0

FYI - Ці два розділи показують, що вони монтуються rw, лише використовуючи команду mount.


2
Це не спрацює, якщо 'ro' є єдиним варіантом кріплення
Віллем

3

На основі відповіді мерехтіння , під впливом коментаря WhiteKnight

Створіть функцію детектора льоту.

eval "function is_readonly () {
          $( grep -P "\sro[\s,]" /proc/mounts | awk '{print "if echo $1 | grep -q \""$2"\"; then return 0;fi"}' )
      return 1;}";    

використовуйте його, щоб визначити, чи є шлях на fs лише для читання

is_readonly /path/to/file/on/read/only/fs && echo "sorry. can't delete that"

І утилізуйте його, коли будете готові

#dump temp function
unset -f is_readonly;


0

Наприклад, щоб перевірити, чи працює кореневий розділ у режимі лише для читання:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi

2
Це стосується не всіх випадків. / sbin / mount перегляне / etc / mtab для кешованої версії поточно встановлених файлових систем (та їх поточних параметрів). Якщо / вдається перезавантажити ro з якоїсь причини, mtab може не бути оновлений належним чином, тому / може відображатися rw як і раніше. / proc / mounts завжди повинен показувати правильне значення.
Травіс Кемпбелл

1
Я погоджуюся з необхідністю використання / proc / mounts. Я думаю, що цей тест повинен бути зведений до функції оболонки (баш, оскільки ОП запитує це), яка гарантує, що посилання на рядок не є підрядком іншого шляху.
Скаперен

0

Як і Антоніо, ви можете використовувати / proc / mounts, щоб зробити те ж саме. Використовуйте власний диск замість sda4.

кіт / прок / кріплення | grep / dev / sda4 | awk '{print substr ($ 4,1,2)}'

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