Como criar um sistema de arquivos como um usuário não root?

5

Eu gostaria de criar uma imagem de sistema de arquivos como um usuário não-root, o problema que estou enfrentando é que a maneira que eu estou fazendo atualmente, ele precisa de uma montagem e como um non-root não pode fazer um monte.

Isso é o que eu estou fazendo agora:

#!/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

Eu tenho acesso root completo, para que eu possa configurar / preparar qualquer coisa, mas o script será executado a partir de uma conta não-root.

No entanto, tenho a sensação de que pode haver uma maneira melhor que talvez nem precise ser montada, mas não tenho certeza ..

    
por svenema 13.02.2018 / 21:33

4 respostas

5

Precisa ser ext4?

Se alternativas são possíveis, você pode tentar a sua sorte com

  • mksquashfs, produz um sistema de arquivos compactado somente leitura do userspace
  • mkisofs, produz um sistema de arquivos somente leitura comumente usado para mídia ótica
  • cpio, tar, ... arquivos que precisam ser extraídos primeiro

Caso contrário, para tornar o ext4 no espaço do usuário uma realidade, você precisa

  • enlouqueça com debugfs
  • inicializa um kernel em um espaço de usuário vm
  • encontre outro utilitário de espaço de usuário puro que saiba lidar com imagens ext4

Em relação a debugfs , a maioria dos sistemas de arquivos nem tem esses utilitários, você teve sorte.

Sessão do usuário:

$ 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

Sessão da raiz: (apenas para verificar se funcionou)

# 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

Então, é possível e funciona.

No entanto, a opção mais prática ainda deve ser usar o root de alguma forma.

    
por 14.02.2018 / 01:34
2

sudo é feito exatamente para esse tipo de problema, você precisa dar ao usuário permissão para executar o comando mount no arquivo / etc / sudoers

então no seu script você pode preceder o comando mount com o sudo:

sudo mount -o loop $IMG $MNT

Você pode configurar a regra para que não exija uma senha

    
por 13.02.2018 / 23:22
2

Você pode adicioná-lo ao fstab com a opção user , para que seja montável por um usuário.

/path/to/app.ext4 /mount/point ext4 loop,user,noauto 0 0

Em seguida, seu usuário pode criar o arquivo e apenas executar:

mount /mount/point
    
por 15.10.2018 / 03:56
2

mke2fs -d exemplo mínimo de execução sem sudo

mke2fs faz parte do pacote e2fsprogs. É escrito pelo famoso desenvolvedor do sistema de arquivos do kernel Linux, Theodore Ts'o, que está no Google desde 2018, e o código-fonte está sob o kernel.org em: link Portanto, esse repositório pode ser considerado uma implementação userland de referência das operações do sistema de arquivos 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 upstream .

A opção chave é -d , que seleciona qual diretório usar para a imagem, e é uma adição relativamente nova à v1.43 em commit 0d4deba22e2aa95ad958b44972dc933fd0ebbc59

Portanto, ele funciona no Ubuntu 18.04, que possui o e2fsprogs 1.44.1-1, mas não o Ubuntu 16.04, que está em 1.42.13.

No entanto, podemos fazer como o Buildroot e compilá-lo a partir do código fonte facilmente no Ubuntu 16.04 com:

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

Se mke2fs falhar com:

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

quando adicionar a opção:

-E no_copy_xattrs

Isso é necessário, por exemplo, quando o diretório raiz está em NFS ou tmpfs em vez de extX como os sistemas de arquivos não parecem ter propriedades estendidas .

O mke2fs é geralmente vinculado a mkfs.extX , e man mke2fs diz que, se você usar a chamada se com esse link simbólico, -t estará implícito.

Como descobri isso e como resolver problemas futuros: Buildroot gera imagens ext2 sem sudo como mostrado aqui , então Acabei de executar a compilação com V=1 e extraí os comandos da parte de geração de imagens que aparece no final. Boa cópia antiga colar nunca me falhou.

TODO: descreva como resolver os seguintes problemas:

  • crie arquivos de propriedade do sudo na imagem. Buildroot faz isso.
  • calcula automaticamente o tamanho mínimo necessário. Estimativa inicial com du para tamanho de arquivo e find . | wc para estrutura de diretório, min que com 32Mb (falhas menores), então duplique até que o comando funcione, é provavelmente uma abordagem muito decente. Buildroot costumava fazer isso, mas parou por algum motivo, mas fácil de implementar nós mesmos.
  • extraia convenientemente todos os arquivos da partição:

Várias partições em um arquivo de imagem

Veja isto: link

    
por 15.10.2018 / 01:08