Кое-какое представление о файловых системах у нас сложилось, пора уже приступать к делу. Для начала, давайте запишем файловую систему. В этом нам поможет утилита mkfs. Всякие настройки по умолчанию для файловой системы ext4 лежат в файле /etc/mke2fs.conf (head /etc/mke2fs.conf ). Тут у нас размеры блоков, инод и всё такое. И всё что нам остаётся сделать для создания файловой системы – написать команду mkfs точка, желаемая файловая система, а потом раздел или диск (sudo mkfs.ext4 /dev/sdb1). Программа создаст файловую систему и покажет нам информацию о ней – сколько блоков какого объёма поместилось в файловой системе, какое количество инод, идентификатор файловой системы, где сохранились бэкапы суперблока - того самого, где хранятся метаданные самой файловой системы. Всякие детали о файловой системе можно посмотреть с помощью tune2fs -l и указанием раздела с нужной файловой системой (sudo tune2fs -l /dev/sdb1).
Но в большинстве случаев с этим всем не нужно заморачиваться. По умолчанию всё настроено так, чтобы работать из коробки для большинства случаев. А если файловая система вам нужна для каких-то более серьёзных задач, то нужно изучать документацию. Пойдём дальше. Ну, есть у нас файловая система, а что с ней делать? Её нужно куда-то прицепить, точнее, примонтировать в какую-то директорию. Собственно, всё зависит от ваших задач. Задачи могут быть разные – скажем, отделить файлы пользователей от системы, чтобы можно было переустановить операционную систему, не стерев ваши файлы. Тут нужно отделить директорию /home. Или, допустим, вы хотите на сервере отделить файлы с данными от файлов операционной системы. Или, например, отделить директорию с логами, чтобы в случае какой-нибудь проблемы они внезапно не забили весь диск логами, от чего система вообще может перестать нормально работать. И это только ряд задач, на деле причин может быть много. Но, давайте, например, вынесем файлы пользователей на новую файловую систему.
Если я возьму и просто примонтирую новую файловую систему в /home, то я перекрою существующие файлы пользователей и вместо них будет чистая файловая система и директория /home окажется пустой. Это не дело, нужно сначала перенести файлы пользователей на новую файловую систему. А это не такая простая задача – если я сейчас сижу от имени пользователя, пусть даже не видно, но я работаю с файлами в домашней директории своего пользователя. Т.е. графический интерфейс подгрузил всякие файлы настроек и всячески использует мою домашнюю директорию. А пока файлы используются, перемещать их не стоит – можно случайно повредить их. Поэтому нужно завершить все процессы, использующие директорию /home. Во первых, для этого мне нужно разлогинится. Но как мне тогда работать? Правильно, через виртуальный терминал. Нажимаем правый Ctrl+F3 и заходим в виртуальный терминал из под рута. Дальше убеждаемся, что никакой процесс не использует файлы в директории /home, в этом нам поможет утилита lsof, показывающая открытые файлы, с ключом +D, чтобы проверить во всех субдиректориях (lsof +D /home). У меня тут пусто, но если у вас какие-то процессы используют файлы, желательно их завершить, вы знаете как. Дальше стоит проверить размер директории /home – хотя надо было еще при создании разделов. Для этого используем утилиту du (du -h /home). Как видите, тут файлов на 241 мегабайт, а наш раздел sdb1 почти на 200 (fdisk -l /dev/sdb1).
Да и будь тут хоть 250 мегабайт, у меня дальше начинается другой раздел, а значит в будущем я не смогу увеличить размер раздела и файловой системы, по крайней мере без кучи махинаций. Поэтому лучше изначально разделы распределить так, чтобы у каждой файловой системы хватало места с запасом. Но при этом, если нет необходимости, не занимайте всё свободное место на раздел – увеличить раздел и файловую систему всегда можно, если есть свободное место, а вот уменьшить размер файловой системы зачастую проблемно, а на xfs пока вообще нет такой возможности.
Но у меня есть раздел sdc2 на 800 мегабайт (fdisk -l /dev/sdc2), его и будем использовать. Опять же, нам нужна файловая система – mkfs.ext4 /dev/sdc2. Теперь мне нужно перенести файлы из директории /home на новую файловую систему. А чтобы это сделать, мне нужно временно примонтировать новую файловую систему. Для таких целей даже есть специальная директория - /mnt. Я просто пишу mount /dev/sdc2 /mnt/ - т.е. какую файловую систему в какую директорию. Чтобы убедиться, что всё сработало, я использую утилиту df (df -h). Самая последняя запись - /dev/sdc2 примонтирован в /mnt. Окей, пора переносить файлы – mv -v /home/* /mnt. Проверяем, всё ли нормально ( ll /mnt /home, du -h /mnt). Вроде всё ок – файлы перемещены. Теперь пора отмонтировать новую файловую систему и примонтировать в /home. Чтобы отмонтировать - umount /mnt.
Но прежде чем пойдём дальше, есть еще одна деталь. То как мы примонтировали сейчас, не означает, что после перезагрузки операционная система также примонтирует. Ей нужно об этом сказать, чтобы в будущем она всегда монтировала sdc2 в /home. Для этого есть файл /etc/fstab (cat /etc/fstab). И тут нам нужно достоверно компьютеру сказать, какую файловую систему куда нужно монтировать. А так как мы выяснили, что sda sdb и sdc – имена, которые могут меняться, то нельзя указывать их. Вместо них мы можем использовать идентификатор файловой системы. Помните, при создании мы видели такой? И чтоб не искать его, можем воспользоваться утилитой blkid (blkid /dev/sdc2). Второй столбик – UUID – это наш идентификатор файловой системы. Если мы форматнём эту файловую систему, будет другой UUID.
И теперь нам нужно переписать этот UUID в файл /etc/fstab. Но.. тут же много символов? Хотя… мы же знаем, что у нас в системе куча утилит для работы с текстом. Воспользуемся одной из них – cut. И так, blkid делит столбцы по пробелам, значит пробел наш делитель. При этом, нам нужен второй столбец. Значит, blkid /dev/sdc2 | cut -d’ ‘ -f2. И мы получили нужную строку. Теперь нужно записать её в файл /etc/fstab. Но прежде чем делать эксперименты с реальными файлами, лучше их забэкапить (cp /etc/fstab{,.bkp}, ls /etc/fstab*). Напишите в комментариях, каким образом сработало регулярное выражение при копировании. Теперь выполняем команду blkid, но вывод добавляем в fstab ( blkid /dev/sdc2 | cut -d’ ‘ -f2 >> /etc/fstab ). Тут будьте очень внимательными, обязательно два символа больше, чтобы не перезаписать файл.
Теперь осталось дописать строку (nano /etc/fstab). И так, файловая система указана. Можно ориентироваться на примеры выше. После UUID-а указываем точку монтирования - /home. Количество пробелов не важно. Дальше указываем тип файловой системы – ext4. После этого – опции монтирования. Допустим, чтобы в inode не писалась информация о последнем доступе к файлу – это сильно сократит частоту записи на жесткий диск – напишем defaults,noatime, через запятую, без пробела. А по умолчанию можно оставить defaults. На самом деле defaults тут чтобы поле не пустовало и мы могли бы убрать defaults и оставить только noatime, но я решил оставить чтобы показать пример нескольких опций. Я приложу ссылку, где показаны различные опции монтирования, там же можно найти информацию, что включает в себя defaults(https://ru.wikipedia.org/wiki/Fstab). Дальше две цифры. Первая – dump – для создания резервной копии файловой системы. Хотя для работы этого нужна утилита dump, которая сейчас практически не пользуются. Но в целом есть такая возможность, и если стоит 1, то будет сниматься дамп, а в большинстве случаев здесь указывается 0 – т.е. без дампа. Вторая цифра – проверка файловой системы. Во время работы на файловой системе могут накапливаться ошибки, и в целом внештатные ситуации, как например при внезапном отключении компьютера, могут создавать ошибки. Да, журналирования частично решает проблемы, но не полностью. Поэтому файловые системы желательно иногда проверять на наличие ошибок и исправлять, для этого есть утилита fsck. Но проверять целостность файловой системы во время работы нельзя, это может её повредить. Её нужно предварительно отмонтировать. Но это не всегда просто – как вы отмонтируете корень, где у вас система? Да и чтобы не заниматься этим вручную, это можно автоматизировать, чтобы при включении компьютера конкретная файловая система проверялась на ошибки и они исправлялись. Тут значение может быть 0 – это не проверять. 1 стоит ставить только для файловой системы, где лежит корень, так как исправление ошибок на нём более приоритетно. Для проверки всех остальных файловых систем можно указать 2. После чего сохраняем. И теперь, когда система знает, куда монтировать sdc2, можно просто написать mount /dev/sdc2 или mount /home. Теперь можем вернуться к графическому интерфейсу – Ctrl+F1 и залогинится. Опять напишем df -h и посмотрим, что куда примонтировано. Как видите, файловая система sdc2 примонтирована в директорию /home. И если бы что-то не работало, мы бы просто не смогли залогинится.