Администрирование → Root хуже Михалкова

homm 6 октября в 11:14 32,6k

Рут – это мифическое существо в экосистеме Linux. Он может всё: зайти в любой каталог, удалить любой файл, завершить любой процесс, открыть любой порт. В общем это суперчеловек, чрезвычайно могущественный и очень полезный. Но задумывались ли вы когда-нибудь, какую цену мы платим руту? Не думали же вы, что он работает за просто так.


Вы знаете команду df? Она показывает все подключенные сейчас диски и статистику по ним: сколько место занято, сколько свободно. Например:


$ df -m
Filesystem     1M-blocks   Used Available Use% Mounted on
udev                 224      1       224   1% /dev
tmpfs                 48      1        47   2% /run
/dev/dm-0           9204   7421      1294  86% /

Вы когда-нибудь замечали, что для локальных дисков сумма Used и Available чаще всего меньше общего размера диска? Ненамного, но меньше.


Давайте ради эксперимента попробуем занять все место на диске:


$ dd if=/dev/zero of=test bs=1M count=10240
dd: error writing ‘test’: No space left on device
1365+0 records in
1364+0 records out
1431212032 bytes (1.4 GB) copied, 2.05683 s, 696 MB/s

Отлично, no space left on device. Место закончилось. Проверим:


$ df -m
Filesystem     1M-blocks   Used Available Use% Mounted on
udev                 224      1       224   1% /dev
tmpfs                 48      1        47   2% /run
/dev/dm-0           9204   8714         0 100% /

Use 100% и мы больше не можем ничего записать. Но значит ли это что никто не может. Помните, что возможности рута безграничны? Давайте попробуем под рутом, а вдруг.


$ sudo dd if=/dev/zero of=test1 bs=1M count=10240
dd: error writing ‘test1’: No space left on device
474+0 records in
473+0 records out
497000448 bytes (497 MB) copied, 0.783122 s, 635 MB/s

$ ls -lh
total 1.8G
-rw-rw-r-- 1 homm homm 1.4G Oct  6 02:37 test
-rw-r--r-- 1 root root 474M Oct  6 02:37 test1

Удивительно! На совершенно забитый диск влезло еще почти полгигабайта. И вот теперь df показывает, что действительно, всё-всё, за малюсеньким исключеним, забито:


$ df -m
Filesystem     1M-blocks   Used Available Use% Mounted on
udev                 224      1       224   1% /dev
tmpfs                 48      1        47   2% /run
/dev/dm-0           9204   9188         0 100% /

Но как так получилось? Места на диске не было, а рут смог записать еще. Подождите гуглить, я за вас уже всё нагуглил. Оказывается, при создании файловой системы по умолчанию Линукс резервирует 5% под неопределенные нужды рута. Это может быть полезно для системного диска, который большую часть времени не забит под завязку и там действительно что-то может понадобиться руту. Теоретически. Но если у вас файловый сервер, к которому подключены 10 винтов по 2 терабайта, вы же просто в никуда отдаете целый терабайт места. Ведь вряд ли рут пишет на эти диски хоть что-то.


По этому поводу не устраивались митинги и демонстрации, Госдума не собиралась три раза, но тем не менее почти каждый из нас отдает руту 5% своего диска. Под его неопределенные нужды.


Как это исправить


Проще простого.


$ sudo tune2fs -m 0 /dev/dm-0
tune2fs 1.42.9 (4-Feb-2014)
Setting reserved blocks percentage to 0% (0 blocks)

Вуаля, теперь мы и сами без труда и без рута́ можем под завязку засрать собственный диск.


$ dd if=/dev/zero of=test1 bs=1M count=10240
dd: error writing ‘test1’: No space left on device
474+0 records in
473+0 records out
496992256 bytes (497 MB) copied, 0.835994 s, 594 MB/s

Данный способ совершенно безопасен, может быть использован на ходу и не требует размонтирования диска. Правда хорошо подумайте, нужно ли оно вам на системном диске.


Важное уточнение: как верно заметили в комментариях, такой резерв по умолчанию есть только на файловых системах ext3 и ext4.

Проголосовать:
+57
Сохранить: