Eu escrevi um script de shell para criar um sistema squashfs live a partir de uma instalação no disco rígido, para ter um sistema Linux rodando apenas na memória RAM.
Mas quando executo o sistema toram live, tenho o seguinte erro no dmesg:
systemd[1]: Failed to open /dev/shm device, ignoring: Inappropriate ioctl for device
Apesar deste erro, o sistema toram live parece funcionar sem problemas.
O script funciona apenas se apenas um usuário for criado no Linux instalado, porque as ACL não são suportadas pelo squashfs, mas são necessárias para o diretório /media/username/.
Aqui está o roteiro:
#!/bin/bash
# Destination directory:
DEST=$HOME/squashfs
sudo mkdir -p ${DEST}
# Copying installation in destination directory:
sudo rsync --progress --specials --perms -av -lXEog --delete / ${DEST} --one-file-system \
--exclude=/proc/* --exclude=/tmp/* --exclude=/dev/* \
--exclude=/sys/* --exclude=/boot/* \
--exclude=/etc/mtab --exclude=${DEST}
# Make /media/username ownership to the user, because squashfs doesn't support ACL
MEDIA="$USER:$USER $DEST/media/$USER"
sudo chown $MEDIA
# Remove links to mounted drives in destination directory /media/username/:
MEDIA="$DEST/media/$USER"
sudo rm -f $MEDIA/*
# Remove unwanted entries in fstab of the future live system:
sudo sed -i '/\/boot\/efi/d' ${DEST}/etc/fstab
sudo sed -i '/swap/d' ${DEST}/etc/fstab
sudo sed -i '/UUID=.*\ \/\ /d' ${DEST}/etc/fstab
# Mount special files in order to chroot:
sudo mount -o bind /proc ${DEST}/proc
sudo mount -o bind /dev ${DEST}/dev
sudo mount -o bind /dev/pts ${DEST}/dev/pts
sudo mount -o bind /sys ${DEST}/sys
sudo cp /etc/resolv.conf ${DEST}/etc/resolve.conf
# upgrade the chrooted system, and install live-boot package
# as well as the lastest kernel:
sudo chroot ${DEST} apt-get update
sudo chroot ${DEST} apt-get upgrade
sudo chroot ${DEST} apt-get remove linux-image*
sudo chroot ${DEST} apt-get install live-boot
sudo chroot ${DEST} apt-get install linux-image-amd64
sudo chroot ${DEST} apt-get clean
sudo chroot ${DEST} apt clean
# Umount the special files:
sudo umount ${DEST}/proc
sudo umount ${DEST}/dev/pts
sudo umount ${DEST}/dev
sudo umount ${DEST}/sys
# Delete unwanted files:
[ -n "$DEST" ] && sudo find ${DEST}/var/mail ${DEST}/var/lock ${DEST}/var/backups ${DEST}/var/tmp -type f -exec rm {} \;
# Delete only OLD log files:
[ -n "$DEST" ] && sudo find ${DEST}/var/log -type f -iregex '.*\.[0-9].*' -exec rm -v {} \;
[ -n "$DEST" ] && sudo find ${DEST}/var/log -type f -iname '*.gz' -exec rm -v {} \;
# Clean current log files:
[ -n "$DEST" ] && sudo find ${DEST}/var/log -type f | while read file; do echo -n '' | sudo tee $file; done
# Clean Pakcage cache:
[ -n "$DEST" ] && sudo rm -v ${DEST}/var/cache/apt/archives/*.deb
# Remove old kernel and initrd in the partition where will be installed the live system:
sudo rm -f /media/$USER/LIVE/live/initrd.img*
sudo rm -f /media/$USER/LIVE/live/vmlinuz*
# Copy new kernel and initrd in the partition where will be installed the live system:
sudo mv -f ${DEST}/boot/initrd.img* /media/$USER/LIVE/live/initrd.img
sudo mv -f ${DEST}/boot/vmlinuz* /media/$USER/LIVE/live/vmlinuz
# Remove old shquashfs in the partition where will be installed the live system:
sudo rm -f /media/$USER/LIVE/live/filesystem.squashfs
# Make the new squashfs:
sudo mksquashfs ${DEST} /media/$USER/LIVE/live/filesystem.squashfs -xattrs -processors 4 -noappend -always-use-fragments
`/media/$USER/LIVE/` is where the live system partition is mounted.
Then I boot the live system placed on a partition with the kernel options: `toram boot=live`
Editar:
Quando executo df
o comando, ele me diz que /dev/shm
está montado em /run/live/medium
.
O comando mount | grep medium
me diz que /dev/shm
também está montado no /usr/lib/live/mount/medium
.
Parece que o sistema mantém na RAM uma cópia da partição onde está o squashfs.
Quando quero desmontar /run/live/medium
, me diz que é impossível porque the target is active
. Mas eu desmontei com sucesso /usr/lib/live/mount/medium
.
Então eu me pergunto se esses problemas estão relacionados e se existe uma maneira de desmontar /run/live/medium
?
/dev/shm
geralmente é um tmpfs ou ramdisk, então pode haver um problema ao montá-lo em seu ambiente não convencional.systemd
está ignorando corretamente isso como um problema, pois você não precisa de um ramdisk fs em seu ambiente de ramdisk completo.Isso é causado por um bug na inicialização ao vivo. O bug já foi corrigido no upstream , mas levará algum tempo até que um lançamento seja feito. Enquanto isso, você pode simplesmente ignorar o log de erros (é inofensivo). Ou você mesmo pode consertar:
Explicação do bug: live-boot monta um tmpfs usando
/dev/shm
como nome do dispositivo. Mas um tmpfs na verdade não possui um dispositivo subjacente, então você pode usar qualquer coisa como nome do dispositivo. Normalmente,tmpfs
é usado. Se/dev/shm
for usado, confunde o systemd, pois ele tenta abrir/dev/shm
como um dispositivo, o que falha porque/dev/shm
não é um dispositivo.Por que você não se livra do erro adicionando os 2 comandos a seguir no
# Mount Special Files Section
sudo test -L /dev/shm && sudo rm /dev/shm && sudo mkdir /dev/shm
sudo chmod 1777 /dev/shm
Veja: Gentoo Wiki: Instalando os sistemas de arquivos necessários
Também recomendo inserir o chroot apenas uma vez usando os comandos do link acima.