Для сборки ядра Linux, компиляции модуля файловой системы, пользовательской утилиты и запуска виртуальной машины необходим ряд пакетов. В их числе — компилятор C/C++, инструменты генерации парсеров (flex, bison), библиотеки для работы с ELF-объектами и криптографией, статически собранный BusyBox для initramfs, а также эмулятор QEMU для тестирования модуля в изолированном окружении.
sudo apt update && sudo apt install -y build-essential g++ flex bison libelf-dev libssl-dev bc busybox-static qemu-system-x86 wget cpio gzipПроект собирается как внешний модуль для ядра Linux 6.12.90. Исходные тексты ядра необходимы для компиляции модуля — из них берутся заголовочные файлы, система сборки Kbuild и таблица символов. Архив загружается с официального зеркала kernel.org и распаковывается в рабочий каталог проекта.
cd ~/ws
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.90.tar.xz
tar -xf linux-6.12.90.tar.xzСначала создаётся базовая конфигурация ядра командой defconfig, подходящая для платформы x86_64. Затем включаются опции, необходимые для работы CellFS в виртуальной машине: поддержка virtio-блочных устройств (через них QEMU пробрасывает дисковый образ), загрузка и выгрузка модулей ядра, подсистема блочных устройств и вычисление контрольных сумм CRC32, которые CellFS использует для проверки целостности метаданных. Команда olddefconfig фиксирует изменения, автоматически выбирая значения по умолчанию для всех зависимых параметров.
cd linux-6.12.90
make defconfigscripts/config --enable CONFIG_BLK_DEV_LOOP
scripts/config --enable CONFIG_VIRTIO_BLK
scripts/config --enable CONFIG_VIRTIO_PCI
scripts/config --enable CONFIG_EXT4_FS
scripts/config --enable CONFIG_CRC32
scripts/config --enable CONFIG_BLOCK
scripts/config --enable CONFIG_MODULES
scripts/config --enable CONFIG_MODULE_UNLOAD
scripts/config --set-str CONFIG_INITRAMFS_SOURCE ""make olddefconfigКомпиляция ядра занимает несколько минут. Флаг -j$(nproc) задействует все доступные ядра процессора для параллельной сборки. Результатом является сжатый образ arch/x86/boot/bzImage, который впоследствии передаётся QEMU в качестве загрузочного ядра.
make -j$(nproc)Команда make everything выполняет три задачи: собирает модуль ядра cellfs_module.ko через систему Kbuild, компилирует утилиту vol_admin для форматирования и диагностики томов CellFS из userspace, а также собирает набор автоматических тестов. Переменная KERNEL_SRC по умолчанию указывает на каталог linux-6.12.90 внутри проекта; при необходимости её можно переопределить.
cd ~/ws
make everythingТестовый набор реализован на C++17 и проверяет корректность форматирования тома, операции чтения и записи записей, а также поведение на граничных условиях (переполнение ячеек, максимальная длина данных, обращение к несуществующим записям). Тесты работают с дисковым образом напрямую, без загрузки модуля ядра.
make run_testsСкрипт boot_vm.sh автоматически создаёт дисковый образ, форматирует его утилитой vol_admin, собирает минимальный initramfs на базе BusyBox (включая модуль и утилиту) и запускает QEMU в консольном режиме. Виртуальная машина загружает собранное ядро, монтирует initramfs как корень и предоставляет интерактивную оболочку для работы с CellFS.
make vmПосле загрузки виртуальной машины модуль CellFS загружается вручную командой insmod. Параметры указывают путь к блочному устройству, положение основного и зеркального заголовков на диске, максимальное количество меток (записей) и число чанков на каждую запись. После загрузки модуля файловая система монтируется стандартной командой mount.
insmod /lib/cellfs_module.ko
backing_path="/dev/vda"
hdr_sector=0
mirror_sector=5
label_cap=64
chunks_each=3mount -t cellfs /dev/vda /mntЗаписи в CellFS создаются и читаются как обычные файлы. Имена файлов соответствуют номерам ячеек в формате rec_NNNNNN. Запись данных в файл размещает полезную нагрузку в соответствующих чанках на диске.
echo "payload" > /mnt/rec_000000
cat /mnt/rec_000000
ls /mntУтилита vol_admin позволяет из командной строки просматривать метаинформацию тома, проверять целостность заголовков и таблиц, выводить раскладку конкретной ячейки, а также полностью очищать или переинициализировать том.
vol_admin /dev/vda info
vol_admin /dev/vda check
vol_admin /dev/vda layout 0
vol_admin /dev/vda erase
vol_admin /dev/vda initПо завершении работы файловую систему необходимо размонтировать и выгрузить модуль перед выходом из виртуальной машины.
umount /mnt
rmmod cellfs_module