Какие устройства работают с f2fs. Переезд с HDD на SSD и F2FS. Бережное отношение к накопителю

В среде моддеров и энтузиастов Android, как и в любой секте, есть несколько святынь, которые принято почитать несмотря ни на что. Это оптимизированные кастомные ядра, скрипты и приложения для оптимизации системы, «улучшатели» звука и многое другое. В последнее время к ним добавилась файловая система F2FS, которая, согласно многим свидетельствам, существенно поднимает производительность работы с NADN-памятью и сохраняет ее от износа. Но так ли это на самом деле?

Начало

Впервые F2FS (Flash Friendly File System) предстала людскому взору в октябре 2012 года, когда компания Samsung опубликовала патчи с ее реализацией для ядра Linux. По словам разработчиков, ФС была с нуля спроектирована специально для flash-памяти и позволяла повысить производительность чтения/записи таких накопителей и использовать их особенности для некоторых оптимизаций и защиты от износа.

Уже к концу года F2FS стала официальной частью Linux 3.8, а еще через некоторое время ее поддержка появилась в CyanogenMod 10.2 и кастомном рекавери TWRP. С тех пор моддеры и оптимизаторы включают ее во все свои каcтомные ядра, пишут массу хвалебных отзывов, публикуют скриншоты с доказательством феноменальной производительности файловой системы.

Со стороны все это выглядит более чем обнадеживающе, поэтому новички в Android дружно вступают в ряды тех, кто прикоснулся к прекрасному и заимел это прекрасное в своем смартфоне. Вот только мало кто задумывается о том, почему родившая на свет чудо Samsung сама не использует F2FS даже в своих последних флагманах.

А причина проста: F2FS практически ничем не лучше файловой системы ext4, используемой в Android по умолчанию. Чтобы не быть голословным, разберу два основных мифа, касающихся F2FS: производительность и бережное отношение к flash-накопителям.

Производительность

В Сети можно найти множество примеров сравнения производительности ext4 и F2FS. Они очень похожи и очень часто показывают огромный выигрыш последней в скорости записи данных. Вот, например, результаты сравнения AndroBench для смартфона Sony Experia Z1:

Выглядит странно, не так ли? Скорость случайной записи возросла в 150 раз в сравнении с ext4 и в шесть раз в сравнении со скоростью чтения. Впервые такую аномалию заметили журналисты Phoronix, когда проводили тестирование F2FS в начале 2013 года:


Тогда они резонно предположили, что на самом деле F2FS пишет данные на диск не сразу, а вместо этого кеширует их для последующей записи. Если взглянуть на архитектуру F2FS , становится очевидно, что это действительно так. F2FS работает с блоками данных размером 4 Кбайт, объединяя их в сегменты размером 2 Мбайт, а те, в свою очередь, объединяются в секции, которых может быть до шести штук.

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

Последние тесты Phoronix также подтверждают практически равную производительность обеих файловых систем. F2FS заметно вырвалась вперед только в тесте на одновременную работу с тысячами файлов, что обусловлено ее внутренними оптимизациями. Однако ни один смартфон не работает одновременно с таким количеством файлов. Такая ситуация редкость даже на десктопе и специфична для серверов.

Бережное отношение к накопителю

Второе заблуждение относительно F2FS связано с более бережным отношением к flash-памяти. Все мы знаем, что flash-память - штука хрупкая и выдерживает всего несколько тысяч циклов записи/стирания данных. По этой причине размещать данные на flash-накопителе рекомендуется в формате лога, когда новые блоки не перезаписывают старые, а вместо этого пишутся в незанятую область, после чего старый блок помечается как неиспользуемый и впоследствии очищается, освобождая пространство.

Именно так работает F2FS, и именно поэтому многие люди считают ее лучшим выбором для flash-памяти в сравнении с ext4, работающей по классической схеме, которая предполагает изменение данных на месте. Но есть один нюанс. Дело в том, что абсолютно любая современная флеш-память, начиная от USB-флешек и заканчивая серверными SSD, содержит в себе контроллер FTL (Flash Translation Layer), отвечающий за то, чтобы представить совсем непохожую на магнитные диски флеш-память как обычный диск, на который можно записать определенное количество блоков данных.

Помимо таких вещей, как объединение нескольких чипов flash-памяти в один «диск» и выполнение операции TRIM, которая очищает уже не используемые блоки, FTL также ответственен за выбор физического размещения записываемого блока в памяти. И здесь он использует (сюрприз!) log-структурированную мини-ФС. Другими словами, любая современная флеш-память сама занимается увеличением своего срока службы независимо от того, какую файловую систему ты на ней создашь: F2FS, ext4, FAT32 или любую другую, - результат будет один.

На самом деле причина, по которой F2FS называется «дружественной к флеш-памяти» (Flash Friendly), вовсе не в бережном отношении к памяти, а в том, что она умеет учитывать некоторые ее особенности, чтобы сделать работу с памятью более эффективной. Один из примеров увеличения эффективности - это тот самый механизм объединения данных в секции.

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

Но и здесь не все так просто. Все оптимизации F2FS требуют индивидуальной настройки файловой системы для каждой модели flash-памяти. Файловая система будет настолько эффективной, насколько точно ее настроили. И делать это должен не пользователь кастомной прошивки, а сам производитель памяти, потому как только он может знать все нюансы ее устройства.

Итого

F2FS - отличная файловая система. Об этом говорит хотя бы тот факт, что, только появившись на свет, она уже способна успешно конкурировать с вылизываемой годами и сотнями людей ext4. Однако не стоит ждать от нее чудес и бежать форматировать свое устройство. Да, многие люди заявляют о заметном даже без тестов увеличении производительности, но опять же, скорее всего, эти эффекты вызваны тем самым механизмом отложенной записи и на самом деле никакого существенного прироста скорости нет.

Добрый день. Для начала разберемся что есть F2FS и для чего он нужен.

F2FS (англ. Flash-Friendly File System) — это представленная в 2013 файловая система, оптимизированная для использования на флешносителях, в том числе и SSD, картах памяти и встроенных в различные устройства чипах памяти. В общем это файловая система, которая изначально учитывает постоянное время доступа и ограниченное количество циклов перезаписи ячеек памяти, поэтому ее использование и желательно.

Подготовка устройства к установке файловой системы

Поддержка данной файловой системы включена в ядро Linux начиная с версии 3.8. В сыром виде CyanogenMOD не позволяет использовать данную файловую систему, поэтому его нужно допиливать. Но, к счастью, товарищ dimfish уже все для нас сделал, и теперь нам осталось только правильно установить операционную систему. Сразу предупреждаю, что абсолютно все данные с телефона сотрутся, поэтому о всевозможных бекапах лучше подумать заранее (Google-аккаунт для контактов, Titanium backup для приложения и руки для извлечения важных фотографий). Если все важное уже сохранили и в прямоте своих рук уверены, то приступаем. Но напоминаю, что прошивка телефона — это в некоторой степени всегда лотерея, и за ваш телефон в ответе только вы. Вы можете его сломать!

При написании инструкции у меня стоял Paranoid Android, и у меня не получилось с первого раза установить F2FS, я сделал сброс до заводского состояния, и после этого прошивка встала как к себе домой. Единственный вариант сохранения данных это если у вас на данный момент стоит обычный CM11. В данном случае вам необходимо сделать бекап /data, через TWRP, которое доступно ниже, и после установки восстановить. Если же у вас любой другой ROM, включая стоковый, восстанавливать /data не рекомендуется.

Производительность работы файловой системы - очень важная вещь, в этой статье мы выясним какая файловая система работает быстрее на данный момент, а также как зависит производительность от версии ядра Linux. Мы будем сравнивать производительность Ext4 vs F2FS vs Btrfs на SSD и будем использовать ядра 4.4, 4.5, 4.6 и 4.7.

Все три файловые системы были протестированы на каждой из последних стабильных версий ядра. Все тесты проводились на Samsung 950 PRO M.2 NVM Express SSD.

В качестве операционной системы для тестирования использовалась ночная сборка Ubuntu 16.10, а также, ядра взятые из Ubuntu Mainline Kernel PPA. Тесты проводились полностью автоматизированным и воспроизводимым способом с помощью программного обеспечения Phoronix Test Suite. Для тестирования каждой из файловых систем раздел был начисто отформатирован. Также форматирование выполнялось для каждой версии ядра. Для монтирования каждой из файловых систем использовались параметры монтирования по умолчанию.

Первым тестом было тестирование производительности базы данных SQLite. Скорость копирования при записи в Btrfs немного ниже чем в Ext4 и F2FS. Ext4 в этом тесте показала лучший результат. Производительность Btrfs действительно заметно улучшилась в ядрах Linux 4.5 и Linux 4.6, а для остальных файловых систем она осталась на том же уровне.

В тесте случайного чтения FIO все три файловые системы показали регресс начиная с версии ядра Linux 4.4.

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

Тест случайной записи не так интересен.

В тесте FS-Mark F2FS вышла на первое место. Тестировалась работа с 1000 файлов размером по 1 Мб. Производительность Ext4 и Btrfs приблизительно на одинаковом уровне.

Flash-Friendly File-System продолжает давать отличные результаты. На этот раз 4000 файлов, 32 подкаталога, размер 1 Мегабайт.

В многопоточном тесте FS-Mark не выявил большой разницы в производительности файловых систем Ext4 vs F2FS vs Btrfs.

F2FS опять занимает первое место по скорости чтения в тесте BlogBench. На втором месте Btrfs.

Наилучшая скорость записи по BlogBench в ext4.

F2FS возвращается на вершину в тесте Dbench.

EXT4 и F2FS показали себя лучше за Btrfs в тесте производительности PostgreSQL.

Выводы

Это все результаты тестирования Ext4 vs F2FS vs Btrfs, которые мы сегодня рассмотрим. Как видите, F2FS - довольно перспективная файловая система, но Ext4 и Btrfs держатся неплохо. Что касается ядер, то здесь производительность в целом увеличивается, но это увеличение не очень большое.

Алексей Федорчук
Ubuntu’вы страсти, 12.06.2013

Файловая система f2fs (Flash-Friendly File System - “Дружественная к Флэшкам Файловая система”) разработана специально для размещения на SSD и тому подобных твердотельных носителях информации. Она штатно поддерживается ядром Linux, начиная с версии 3.8.0 - той самой, которая входит в состав Ubuntu 13.04.

В принципиальной поддержке f2fs легко убедиться командой

$ ls /lib/modules/3.8.0-23-generic/kernel/fs/f2fs

в выводе которой мы увидим модуль

Однако по умолчанию он не задействован. Поэтому можно попытаться загрузить его обычным образом:

$ sudo modprobe f2fs

Попытка будет успешной, о чём нам сообщит команда

$ lsmod | grep f2fs f2fs 109231 0

Интересно, что при этом вывод команды

Dmesg | grep -i f2fs

будет по прежнему пуст. И после перезагрузки никакого намёка на этот модуль не обнаружится. Так что нужно обеспечить его загрузку на старте системы вручную. Для этого достаточно в файл /etc/modules добавить строку

Что можно сделать от лица суперпользователя либо в текстовом редакторе, либо последовательностью команд типа

$ sudo -i $ echo f2fs >> /etc/modules $ exit

Как нетрудно догадаться, этим достигается обязательность загрузки соответствующего модуля на стадии инициализации системы.

Однако от самой по себе поддержки любой файловой системы мало радости, если нет соответствующих инструментов для работы с ней. А для работы с f2fs их у нас в Ubuntu пока нет.

Впрочем, и получение этого инструментария - труд не великий. И заключается он в проверке доступности репозитория universe с последующей командой

Sudo apt-get install f2fs-tools

Впрочем, весь инструментарий для работы с f2fs в настоящее время сводится к единственной команде - /sbin/mkfs.f2fs и сопутствующей документации - man (8) mkfs.f2fs .

Создание f2fs на разделе или raw-устройстве выполняется обычным образом:

Mkfs.f2fs /dev/sdf1

в ответ на что последует такой вывод:

F2FS-tools: Ver: 1.1.0 (29-Nov-2012) Info: sector size = 512 Info: total sectors = 30308319 (in 512bytes) Info: zone aligned segment0 blkaddr: 256 Info: This device doesn"t support TRIM Info: format successful

Приведённый пример относится к флэшке, почему и мы и видим сообщение об отсутствии поддержки TRIM - на любом современно SSD его, ясное дело, не будет.

Команда mkfs.f2fs имеет несколько опций. Одна из них -l задаёт метку для соответствующего раздела или устройства, что очень целесообразно при использовании f2fs на сменных носителях типа флэшек. Остальные же определяют политику распределения блоков (-a), размер области обеспечения (-o), число сегментов на секцию (-s) и секций на зону (-z). Однако оказываемый ими эффект нигде не документирован, а возможностей для экспериментов у меня не было. Так что остаётся положиться на умолчания, каковые, кроме как у тёти Мани можно посмотреть также, дав команду mkfs.f2fs без аргумента:

A heap-based allocation -o overprovision ratio -s # of segments per section -z # of sections per zone

После создания файловой системы f2fs возникает естественное желание опробовать её в деле. Для чего желательно её примонтировать куда-либо. Автоматически системой она не опознаётся, не смотря на обеспечение загрузки нужного модуля. То есть, в отличие от других файловых систем на внешних носителях, по умолчанию её не видно в файловых менеджерах типа Nautilus или Thunar.

Однако это не значит, что разделы или устройства с f2fs обязательно монтировать руками и тем более от root’а. Достаточно создать в домашнем каталоге пользователя точку монтирования (например, $HOME/test) и вписать в /etc/fstab строку

/dev/sdb1 $HOME/test f2fs user,noauto 0 0

Разумеется, не забыв подставить значение переменной $HOME и указать имя наличествующего устройства. После чего устройство с f2fs появляется среди точек входа Nautilus’а или Thunar’а при его подсоединении (в виде метки - если таковая была задана). Это относится к сменным носителям - например, флэшкам или SD-картам. Устройства внутренние (накопители SSD) целесообразно монтировать обычным образом «на постоянной основе».

К сожалению, разместить на f2fs корень файловой иерархии в настоящий момент нельзя. В инсталляторе Ubuntu такой возможности не предусмотрено. А «обходные пути», подобные тем, что применяются при установке с корнем на ZFS, упираются в то, что grub-probe не опознаёт f2fs, и никаких «корректировщиков», подобных GRUB for Native ZFS, пока (?) не существует.

На 250Gb и стал думать, как мне систему на него перенести.

В первую очередь озадачился выбором файловой системы наиболее подходящей под SSD. После непродолжительного гугления решил ставить на относительно свежую ФС разработанную самсунгом специально под флешевые F2FS (Flash Friendly File System) носители.

F2FS является достаточно молодой ФС, но тем не менее поддерживается ядром линукса начиная с версии 3.8

Задача вырисовывалась такая:

  1. Научить систему понимать F2FS
  2. Разметить и отформатировать SSD в F2FS
  3. Скопировать данные
  4. Настроить fstab и grub

Включаем поддержку F2FS в Kubuntu

В kubuntu 14.04 и 14.10 модуль поддержки f2fs присутствует, но не включен. Так что для включения поддержки достаточно набрать:

sudo modprobe f2fs

Проверяем, что модуль подключен

sudo lsmod | grep f2fs

Теперь система может работать с f2fs, но только до перезагрузки. Что бы модуль подгружался автоматически при каждой загрузке, добавляем в конец файла /etc/modules запись f2fs

sudo -i
echo f2fs >> /etc/modules

Так же учим initramfs поддерживать f2fs. Для этого добавляем f2fs в конец файла и обновляем.

В kubuntu 16.10 ядром 4.8 так же надо дополнительно добавить модуль crc32 иначе система не загрузится.

sudo -i
echo f2fs >> /etc/initramfs-tools/modules
echo crc32 >> /etc/initramfs-tools/modules
update-initramfs -u

Для создания f2fs устанавливаем пакеты f2fs-tools и gparted

sudo apt-get install f2fs-tools gparted

Диспетчер разделов КДЕ не умеет создавать f2fs, а вот gparted может.

Для подержки в 14.04 так же необходимо обновить пакет util-linux до версии 2.25 или выше.

sudo add-apt-repository ppa:xeron-oskom/util-linux && sudo apt-get update && sudo apt-get dist-upgrade -f

Подключаем SSD, создаем разделы и форматируем в F2FS

Поскольку в моем распоряжении был только ноутбук без стационарного компьютера SSD я подключил как внешний диск, через USB. Для этого я взял старый внешний HDD, разобрал и поключил вместо обычного внешнего диска свой SSD и подключил все это дело к usb.
На удивление ни система ни диспетчер разделов диска не увидели. Но после загрузки с установочной флешки с kubuntu 14.04 диск увиделся и я благополучно создал пустой раздел после чего диск стал виден и в основной системе, в которой я и произвел разбивку и форматирование.

Разбивку делал в gparted, так как диспетчер разделов КДЕ f2fs пока не понимает.

Лично я разметил так:
/Boot ext2 768Mb
/Root f2fs 20Gb
/Home f2fs 210Gb

Своп будет в файле под управлением .

Копируем данные с HDD на SSD

Переносим данные из /home

На SSD в разделе /home создаем папку с вашем именем пользователя, назначаете себя её владельцем

sudo mkdir $USER && chown "$USER":"$USER" $USER

и копируем все что нам необходимо не забывая скопировать основные конфигурационные файлы и папки, такие как:
.kde
.local
.config
.mozilla

Для переноса данных из домашней директории можно воспользоваться простым копированием с сохранением атрибутов и прав на файлы. Я делал выборочное копирование из домашней папки, так как мой HDD был ровно в два раза больше нового SSD, и всё просто бы не поместилось, да и "мусора" там накопилось прилично.

Я копировал так:

sudo cp -ar /home/dm/.kde/* /media/f2fs/home/dm

Копирование /root и /boot

Для копирования c данных с /root грузимся с liveusb kubuntu, включаем поддержку f2fs монтируем необходимые разделы и копируем данные с разделов.

Включаем поддержку f2fs
sudo modprobe f2fs

Создаем папку в которую будем монтировать
sudo mkdir /media/f2fs_root

Смотрим какие диски нам доступны
sudo fdisk -l

Монтируем раздел f2fs root. Вместо sdx подстаить свой раздел.
sudo mount /dev/sdx /media/f2fs_root

Копируем /root из HDD на SSD
sudo cp -ar /media/kubuntu/root/* /media/f2fs_root

То же самое делаем с разделом /boot

Настраиваем fstab и grub

Перезагружаемся в свою систему.

Настраиваем fstab

Узнаем UUID разделов на SSD
sudo blkid

И правим fstab на SSD

sudo nano /media/f2fs/root/etc/fstab

У меня он теперь выглядит как то так:

UUID=хххххххх-хххх-хххх-хххх-хххххххххххх / f2fs rw,noatime,discard 0 2
UUID=хххххххх-хххх-хххх-хххх-хххххххххххх /home f2fs rw,noatime,discard 0 2
UUID=хххххххх-хххх-хххх-хххх-хххххххххххх /boot ext2 auto,noatime 1 2

Делаем chroot SSD для настройки grub

sudo mount /dev/sdx /media/f2fs/root/boot
sudo mount /dev/sdx /media/f2fs/root/boot/efi
sudo mount --bind /dev /media/f2fs/root/dev
sudo mount --bind /proc /media/f2fs/root/proc
sudo mount --bind /sys /media/f2fs/root/sys
sudo chroot /media/f2fs/root

Затем устанавливаем загрузчик

sudo grub-install /dev/sdx
sudo update-grub

Где sdX - имя SSD устройства (на пример /dev/sdb )

Не выходя из chroot правим grub.cfg на SSD
Открываем /boot/grub/grub.cfg

sudo nano /boot/grub/grub.cfg

И ищем записи типа:
linux /vmlinuz-3.16.0-25-generic root=/dev/sdb2

в которых меняем /dev/sdb2 на /dev/sda2

Все, отключаем HDD и подключаем SSD.

Используемые материалы:

Похожие публикации