гіперпетлі для пінгвіна: файлова система у файлі (losetup)

| комп'ютери, linux, підказка

як я міг цього не знати? монтування файлу як пристрою (loop device) з файловою системою (по суті, файлова система у файлі) за допомогою losetup — це вельми просто:

крок 1. створюємо порожній файл потрібного розміру (128 мб для прикладу):

head -c 128M /dev/zero > /path/to/file

крок 2. шукаємо першу вільну мітку пристрою (/dev/loopX):

losetup -f

крок 3. підключаємо файл file.img як пристрій (для прикладу /dev/loop1):

(sudo) losetup /dev/loop1 /path/to/file.img

крок 4. створюємо файлову систему (ext4 для прикладу):

(sudo) mkfs.ext4 /dev/loop1

крок 5. …і монтуємо пристрій куди треба (/mnt/mount_point):

(sudo) mount /dev/loop1 /mnt/mount_point

користуємося.

коли треба відмонтувати:

(sudo) umount /dev/loop1

коли треба взагалі відключити файл і звільнити мітку пристрою:

(sudo) losetup -d /dev/loop1

бонус! якщо маємо файл з уже створеною файловою системою (тобто крок 4 не потрібен) — тоді кроки 2, 3 та 5 можна об’єднати, бо mount вміє це робити сам:

(sudo) mount -o loop /path/to/file.img /mnt/mount_point

ще один бонус! команди для резервування місця під файл, в порядку спадання швидкості (для порівняння в дужках даю час, що знадобився на моєму ноутбуці з ssd):

  • fallocate -l 128M /path/to/file (3 мс)
  • dd if=/dev/zero of=/path/to/file (208 мс)
  • head -c 128M /dev/zero > /path/to/file (324 мс)

очевидно, що fallocate не заповнює файл нулями, як це роблять дві інших команди, лише резервує місце (в більшости випадків цього досить).