Як створити образ ext2 без прав суперпользователя?


5

Мені потрібно генерувати кілька зображень ext2. Очевидний спосіб зробити це - створити зображення, змонтувати його та скопіювати вміст. Але для цього потрібні кореневі дозволи двічі (для придушення файлів та монтажу зображення). Також я знайшов два інструменти для генерації зображень: e2fsimage & genext2fs.

  • genext2fs розміщує зображення в оперативній пам'яті під час генерації, але розмір одного з моїх зображень становить ~ 30 Гбіт.

  • e2fsimage збоїв із деякими значеннями розміру зображення.

Тож як я можу генерувати свої зображення? Було б добре, якщо інструмент сам розрахує розмір зображення.

Відповіді:


2

З’ясували, чому e2fsimageтрапляються збої. Він викликаний переповненням int32, коли розмір зображення перевищує 4 Гбіт. Таким чином, рішення полягає в підрахунку необхідних блоків і inodes, створенні файлу циклу ( truncate& mke2fs), а потім використовувати e2fsimageз -nаргументом (так що він не створить цикл циклу, а використовувати вже створений)


1
Ви надіслали звіт про помилку та / або патч для цього?
Toby Speight

Я сумніваюся, що так і зробив. Вибачте.
Equidamoid

2

mke2fs -d мінімальний приклад без використання sudo

mke2fsє частиною пакету e2fsprogs. Він написаний відомим розробником файлової системи ядра Linux Теодором Ц'о, який є в Google станом на 2018 рік, а вихідний потік знаходиться під kernel.org за адресою: https://git.kernel.org/pub/scm/fs/ext2 / e2fsprogs Отже, цей сховище можна вважати еталонною реалізацією операцій з файловою системою ext:

#!/usr/bin/env bash
set -eu

root_dir=root
img_file=img.ext2

# Create a test directory to convert to ext2.
mkdir -p "$root_dir"
echo asdf > "${root_dir}/qwer"

# Create a 32M ext2 without sudo.
# If 32M is not enough for the contents of the directory,
# it will fail.
rm -f "$img_file"
mke2fs \
  -L '' \
  -N 0 \
  -O ^64bit \
  -d "$root_dir" \
  -m 5 \
  -r 1 \
  -t ext2 \
  "$img_file" \
  32M \
;

# Test the ext2 by mounting it with sudo.
# sudo is only used for testing.
mountpoint=mnt
mkdir -p "$mountpoint"
sudo mount "$img_file" "$mountpoint"
sudo ls -l "$mountpoint"
sudo cmp "${mountpoint}/qwer" "${root_dir}/qwer"
sudo umount "$mountpoint"

GitHub вище за течією .

Ключовим варіантом є те -d, що вибирає, який каталог використовувати для зображення, і це відносно нове доповнення до v1.43 в команді 0d4deba22e2aa95ad958b44972dc933fd0ebbc59

Тому він працює на Ubuntu 18.04 з коробки, де є e2fsprogs 1.44.1-1, але не Ubuntu 16.04, що знаходиться на 1.42.13.

Однак ми можемо зробити так само, як Buildroot і легко компілювати його з джерела на Ubuntu 16.04 за допомогою:

git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
cd e2fsprogs
git checkout v1.44.4
./configure
make -j`nproc`
./misc/mke2fs -h

Якщо mke2fsне вдається:

__populate_fs: Operation not supported while setting xattrs for "qwer"
mke2fs: Operation not supported while populating file system

при додаванні параметра:

-E no_copy_xattrs

Це потрібно, наприклад, коли кореневий каталог знаходиться в NFS або tmpfsзамість extX, оскільки ці файлові системи , схоже, не мають розширених властивостей .

mke2fsчасто посилається на mkfs.extXі man mke2fsговорить, що якщо ви використовуєте дзвінок, якщо з таким символьним посиланням, то -tмається на увазі.

Як я це з'ясував і як вирішити майбутні проблеми: Buildroot генерує зображення ext2 без sudo, як показано тут , тож я просто запустив збірку V=1і витяг команд з частини генерації зображень, яка йде в кінці. Стара стара копійна паста ніколи не підводила мене.

TODO: опишіть, як вирішити такі проблеми:

Кілька розділів в одному файлі зображень

Дивіться це: https://stackoverflow.com/questions/10949169/how-to-create-a-multi-partition-sd-image-without-root-privileges/52850819#52850819


1

Для створення зображення не потрібно привілею root. Ось приклад створення образу ext2:

dd if=/dev/zero of=./MyDisk.ext2 bs=512 count=20480
mkfs.ext2 ./MyDisk.ext2

але коренева привілей потрібна для монтажу пристрою:

mkdir MyDisk
sudo mount ./MyDisk.ext2 MyDisk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.