Arquivo de imagem do automount como sobreposição do UnionFS

1

Desejo montar automaticamente um arquivo de imagem na inicialização do sistema usando os arquivos de configuração do UnionFS e sobreposição (por exemplo, / etc / network / interfaces) na parte superior dos arquivos de diretório stock / etc, permitindo a personalização do usuário.

Estou usando uma distribuição Linux embarcada (Kernel 3.14.28, caso você esteja se perguntando) e possa alcançar manualmente o resultado desejado depois que o sistema atingir o prompt de login.

Agora desejo automatizar o processo durante a inicialização do sistema.

Meu pensamento era que o / etc / fstab forneceria toda a funcionalidade necessária para conseguir isso. No entanto, estou com dificuldades para montar automaticamente a partição FAT e a subseqüente montagem do UnionFS durante a inicialização do sistema.

Meu / etc / fstab pode ser visto abaixo:

# start: /etc/fstab file
/dev/root   /               auto       defaults              1  1
proc        /proc           proc       defaults              0  0
devpts      /dev/pts        devpts     mode=0620,gid=5       0  0
usbdevfs    /proc/bus/usb   usbdevfs   noauto                0  0
tmpfs       /run            tmpfs      mode=0755,nodev,nosuid,strictatime 0  0
tmpfs       /var/volatile   tmpfs      defaults              0  0

# mount the user data image and then mount the unionfs user setting overlays
/dev/mmcblk2p1/userdata.img      /userdata       vfat    loop,auto,rw,exec                               0       0
/userdata/etc               /etc            unionfs    dirs=/userdata/etc=rw:/etc=ro,auto   0       0
# end: /etc/fstab file

Durante a inicialização, vejo:

...
EXT3-fs (mmcblk2p3): mounted filesystem with ordered data mode
VFS: Mounted root (ext3 filesystem) readonly on device 179:11.
devtmpfs: mounted
Freeing unused kernel memory: 352K (80e3b000 - 80e93000)
INIT: version 2.88 booting
unionfs: error accessing lower directory '/userdata/etc' (error -2)
unionfs: read_super: error while parsing options (err = -2)
Starting udev
udevd[187]: starting version 182
EXT3-fs (mmcblk2p5): using internal journal
EXT3-fs (mmcblk2p5): mounted filesystem with ordered data mode
FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
EXT3-fs (mmcblk1p2): warning: mounting fs with errors, running e2fsck is recommended
EXT3-fs (mmcblk1p2): using internal journal
EXT3-fs (mmcblk1p2): mounted filesystem with ordered data mode
FAT-fs (mmcblk2p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
EXT3-fs (mmcblk2p2): using internal journal
EXT3-fs (mmcblk2p2): mounted filesystem with ordered data mode
EXT3-fs (mmcblk2p3): using internal journal
...

Parece que o sistema está tentando executar a montagem do UnionFS antes que o ponto de montagem (/ userdata) esteja pronto. Meu entendimento era que as partições listadas em / etc / fstab são montadas sequencialmente. Se este não for o caso, por favor me eduque;)

Então, minha pergunta é: Como posso alterar o arquivo / etc / fstab (e quaisquer outros arquivos) para obter o efeito de montagem automática desejado?

Obrigado antecipadamente

    
por adrian127 09.05.2016 / 16:17

1 resposta

0

Exemplos de código estão no final deste post . Nowdays systemd lê fstab e depois tenta montar o fs em paralelo. Os scripts de montagem padrão systemd são criados no momento da inicialização e você os encontra em

'run/systemd/generator'

Você pode tentar usar o parâmetro noauto no fstab, que monta o fs somente quando é acessado. Que pode ter sideffcts para que você, em alguns casos, tente acessar o ponto de montagem duas vezes antes de ser ativado.

Talvez haja a possibilidade de dar ao programa que acessa o ponto de montagem um atraso. Realmente - não sei se isso é verdade. No entanto, a outra solução é criar um script de inicialização do systemd onde você substitui a leitura do fstab. Isso pode ser feito de duas maneiras, seja pelo comando systemd para ler um arquivo rc.local no qual você especifica a opção de montagem, ou (suponho) de maneira mais correta - escreve scripts apenas para o systemd.

Eu dou exemplos ambos são dos meus próprios scripts de montagem que eu descobri em outros exemplos.

Mais tarde, editarei este post para adicionar links de onde gostei dos recursos que usei que me ajudaram a criar esses scripts. Ambos os exemplos precisam de dois arquivos. RENÚNCIA DE RESPONSABILIDADE Não afirmo que o mountpoits é o correto seguindo os padrões. Por exemplo, eu montei uma pasta no diretório raiz. São apenas minhas próprias tentativas enquanto ainda sou inexperiente em linux e faço minhas próprias coisas do meu próprio jeito no meu próprio sistema testbench. É um trabalho em andamento e por enquanto, bastante sloopy feito. Use os exemplos apenas como referência e tente ser mais rígido nos padrões do que eu. Além disso, suponho que alguém poderia melhorar esses arquivos de várias maneiras. Comentários e sugestões são muito apreciados.

1. use o rc-local

#This file should be named /etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local Compatibility
ConditionFileIsExecutable=/usr/local/sbin/rc.local

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/rc.local
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

.

#Local multi-user startup script.
#this file should be named as  /usr/local/sbin/rc.local and have the executable attribute set.
#!/bin/sh
mount -L BIGDATA /BIGDATA
#2do, If LABEL not found, Add failback  to  search for UUID 
LBL=$(blkid -s LABEL  $(mount | grep " / ") | cut -d "=" -f 2-2 | tr -d '"')

mount -t aufs -o dirs=/BIGDATA/mountslinks/dist-global_rw/newfiles_rw/home=rw:/BIGDATA/mountslinks/dist-global_rw/global_rw/home=rw:/BIGDATA/mountslinks/dist-local_rw/"$LBL"/home=rw none /home
mount -t aufs -o dirs=/BIGDATA/mountslinks/dist-global_rw/newfiles_rw/root=rw:/BIGDATA/mountslinks/dist-global_rw/global_rw/root=rw:/BIGDATA/mountslinks/dist-local_rw/"$LBL"/root=rw none /root

2. Use apenas o systemd (mudei para este após algumas reinicializações. Não porque o primeiro não funcionou - na verdade, funciona bem (no meu sistema) - mais porque Em primeiro lugar, queria também aprender esta abordagem e também acho que esta é mais à prova do futuro.

#this one is an edited version of the one Automatically generated by systemd-fstab-generator

[Unit]
Before=local-fs.target
[Mount]
What=/dev/disk/by-label/BIGDATA
Where=/BIGDATA
Type=ext4
Options=defaults,nofail

[Install]
WantedBy=multi-user.target

.

[Unit]
Before=local-fs.target
Requires = BIGDATA.mount
After = BIGDATA.mount

[Mount]
What=noauto,x-systemd.requires=/BIGDATA,x-systemd.automount
Where=/home/peter
Type=aufs
Options=br=/BIGDATA/mountslinks/lubuntu/new_rw/home/peter=rw:/BIGDATA/mountslinks/lubuntu/local_rw/home/peter=rw:/BIGDATA/mountslinks/lubuntu/shared_rw/home/peter=rw


[Install]
WantedBy = multi-user.target

Além disso, suponho que um em fstab poderia adicionar um parâmetro dentro do fstab informando ao systemd a ordem de montagem.

    
por 25.07.2016 / 19:53

Tags