Рут – это мифическое существо в экосистеме 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.