ルート以外のユーザーとしてファイルシステムイメージを作成したいと思います。現在直面している問題は、root以外のユーザーがインストールできないインストールが必要であることです。
これが私が今やっていることです:
#!/bin/sh
IMG="app.ext4"
LBL="PIHU_APP"
MNT="/mnt/PIHU_APP"
APP="/home/buildroot/board/arctura/PIHU_APP/application"
#64MB:
dd if=/dev/zero of=$IMG bs=4096 count=16384
mkfs.ext4 $IMG
e2label $IMG $LBL
mkdir -p $MNT
mount -o loop $IMG $MNT
cp -r $APP $MNT
sync
umount $MNT
私はすべてを設定/準備できるようにフルrootアクセス権を持っていますが、スクリプトはrootではなくアカウントで実行されます。
しかし、インストールを必要としないより良い方法があるかもしれないと感じていますが、わかりません。
答え1
mke2fs -d
最小限の実行可能な例、不要sudo
mke2fs
e2fsprogs パッケージの一部です。 2018年、Googleで働いた有名なLinuxカーネルファイルシステム開発者Theodore Ts'oが作成しました。アップストリームのソースコードは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"
重要なオプションは、イメージ-d
に使用するディレクトリを選択することです。これは、コミットv1.43への比較的新しい追加です。0d4deba22e2aa95ad958b44972dc933fd0ebbc59
したがって、e2fsprogs 1.44.1-1を使用するUbuntu 18.04ではデフォルトで機能しますが、バージョン1.42.13を搭載したUbuntu 16.04では機能しません。
ただし、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にある場合、またはこれらのファイルシステムとしてextXの代わりにある場合にtmpfs
必要です。拡張属性がないようです。。
mke2fs
通常はにシンボリックリンクされておりmkfs.extX
、man mke2fs
これらのシンボリックリンクでcall ifを使用する場合、意味は-t
暗黙的に使用されます。
これを発見した方法と今後の問題を解決する方法は次のとおりです。ルート構築sudo なし ext2 イメージビルド図からわかるようにだから、私はビルドを実行しV=1
、最終的なイメージビルドセクションからコマンドを抽出しました。古いコピー - 貼り付けは決して私を失望させませんでした。
TODO:次の問題を解決する方法を説明してください。
- 画像にsudo所有ファイルを作成します。 Buildrootができます。
- 必要な最小サイズを自動的に計算します。最初は、
du
ファイルサイズとディレクトリ構造を少なくとも32 Mb(小さいサイズは失敗)と見積もってから、コマンドが機能するまでこれを2倍にするのはfind . | wc
かなり良い考えです。 Buildrootはこれを行いましたが、何らかの理由で中断されましたが、自分で実装するのは十分簡単でした。 - パーティションからすべてのファイルを簡単に抽出します。
1つのイメージファイルに複数のパーティションがある
答え2
必ずext4でなければなりませんか?
他のオプションがある場合は、幸運を試してみてください。
- mksquashfs、ユーザー空間から読み取り専用圧縮ファイルシステムを作成します。
- mkisofs は、光学メディアで一般的に使用される読み取り専用ファイルシステムを生成します。
- cpio、tar、...最初に解凍する必要があるファイル
それ以外の場合、ユーザースペースを現実にするには、ext4
次のことを行う必要があります。
- 狂ったように
debugfs
- ユーザー空間仮想マシンでカーネルを実行する
- ext4イメージを処理する方法を知る別の純粋なユーザースペースユーティリティを探す
に関しては、debugfs
ほとんどのファイルシステムにはそのようなユーティリティさえありません。幸運になります。
ユーザーセッション:
$ truncate -s 64M app.ext4
$ /sbin/mkfs.ext4 app.ext4
Creating filesystem with 65536 1k blocks and 16384 inodes
$ /sbin/debugfs -w app.ext4
debugfs: mkdir this_is_crazy
debugfs: cd this_is_crazy
debugfs: write /proc/config.gz config.gz
Allocated inode: 13
ルートセッション:(動作していることを確認するため)
# mount -o loop app.ext4 loop/
# cd loop/
# ls
lost+found this_is_crazy
# md5sum this_is_crazy/config.gz /proc/config.gz
7b414ad844272a9e3c31931037fe0495 this_is_crazy/config.gz
7b414ad844272a9e3c31931037fe0495 /proc/config.gz
したがって、可能で動作します。
しかし、最も実用的なオプションは、何らかの方法でルートを使用することです。
答え3
sudo
これらの問題については、/ etc / sudoersファイルでmountコマンドを実行するためのユーザー権限を付与する必要があります。
その後、スクリプトでmountコマンドの前にsudoを追加できます。
sudo mount -o loop $IMG $MNT
パスワードが必要ないようにルールを設定できます。
答え4
virt-make-fsコマンドはすべての要件を満たすことができます
sudo yum install -y /usr/bin/virt-make-fs
virt-make-fs -s 64M -t ext4 $APP $IMG --label=$LBL