Usando SquashFS como Sistema de Archivos Root de Sólo Lectura

Esta guía describe cómo utilizar SquashFS. SquashFS (http://goo.gl/WT6Lxf) es un sistema de archivos comprimido de sólo lectura para Linux sobre plataformas basadas en el ODROID-XU4 como son HC1, HC2, MC1 y XU3. La tasa de corrupción de RootFS (http://goo.gl/LMVjzS) tras producirse fallos de energía queda reducida muy significativamente porque SquashFS es un sistema de archivos muy robusto. Ten en cuenta que un sistema SquashFS integrado sólo funcionará correctamente si la versión del Kernel es la 4.14.5-92 o superior.

Preparación

Necesitas preparar una tarjeta microSD o un módulo eMMC de arranque con una imagen mínima de Ubuntu. Para obtener instrucciones sobre cómo escribir imágenes en una tarjeta, consulta la Wiki en http://goo.gl/FNRzAk. Esta guía da por hecho que vas a usar una tarjeta microSD.

Instalación

Puedes instalar squashfs-tools en tu sistema ODROID-XU4. Es la herramienta para crear sistemas de archivos Squash.

$ sudo apt install squashfs-tools

Creación de la imagen del sistema de archivo root squash

Para crear la imagen del sistema de archivos root Squash son necesarios los siguientes pasos:

  • Eliminar el script que cambia de tamaño de forma automática
  • Editar /etc/rc.local y eliminar la función del cambio automático de tamaño
  • Editar /etc/fstab y eliminar la opción de montaje root
  • Utilizar mksquashfs para crear sistemas de archivos root de solo lectura

$ sudo rm /media/ck/rootfs/aafirstboot
 $ sudo cat /media/ck/rootfs/etc/rc.local
 #!/bin/sh -e
 #
 # rc.local
 #
 # This script is executed at the end of each multiuser runlevel.
 # Make sure that the script will "" on success or any other
 # value on error.
 #
 # In order to enable or disable this script just change the execution
 # bits.
 #
 # By default this script does nothing.

if [ -f /aafirstboot ]; then /aafirstboot start ; fi

exit 0

$ sudo nano /media/ck/rootfs/etc/rc.local
 $ sudo cat /media/ck/rootfs/etc/rc.local
 #!/bin/sh -e
 #
 # rc.local
 #
 # This script is executed at the end of each multiuser runlevel.
 # Make sure that the script will "" on success or any other
 # value on error.
 #
 # In order to enable or disable this script just change the execution
 # bits.
 #
 # By default this script does nothing.

exit 0
 $ sudo cat /media/ck/rootfs/etc/fstab
 UUID=e139ce78-9841-40fe-8823-96a304a09859 / ext4 errors=remount-ro,noatime 0 1
 LABEL=boot /media/boot vfat defaults 0 1

$ sudo nano /media/ck/rootfs/etc/fstab
 $ sudo cat /media/ck/rootfs/etc/fstab
 LABEL=boot /media/boot vfat defaults 0 1

$ sudo mksquashfs /media/ck/rootfs/ squash.rootfs
 Parallel mksquashfs: Using 8 processors
 Creating 4.0 filesystem on squash.rootfs, block size 131072.
 [================================================-] 36821/36821 100%
 Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 131072
 compressed data, compressed metadata, compressed fragments, compressed xattrs
 duplicates are removed
 Filesystem size 423720.81 Kbytes (413.79 Mbytes)
 42.27% of uncompressed filesystem size (1002435.26 Kbytes)
 Inode table size 464688 bytes (453.80 Kbytes)
 28.95% of uncompressed inode table size (1604883 bytes)
 Directory table size 433806 bytes (423.64 Kbytes)
 39.67% of uncompressed directory table size (1093654 bytes)
 Xattr table size 48 bytes (0.05 Kbytes)
 40.00% of uncompressed xattr table size (120 bytes)
 Number of duplicate files found 2340
 Number of inodes 45340
 Number of files 31162
 Number of fragments 1912
 Number of symbolic links 10373
 Number of device nodes 79
 Number of fifo nodes 0
 Number of socket nodes 0
 Number of directories 3726
 Number of ids (unique uids + gids) 22
 Number of uids 6
 root (0)
 man (6)
 dnsmasq (104)
 rtkit (107)
 libuuid (100)
 avahi-autoipd (105)
 Number of gids 18
 root (0)
 video (44)
 audio (29)
 tty (5)
 kmem (15)
 disk (6)
 dip (30)
 shadow (42)
 utmp (43)
 messagebus (106)
 ssh (111)
 mlocate (110)
 staff (50)
 avahi-autoipd (113)
 netdev (102)
 adm (4)
 scanner (109)
 mail (8)

Sistemas de archivos Squash en una tarjeta microSD

Si todo ha ido bien, desmonta /dev/sdc2 (si fuera necesario) y usa dd para copiar squash.rootfs en /dev/sdc2:

  • Desmontar todas las particiones de la microSD
  • Usar dd para copiar el archivo squash.rootfs a la partición #2 de la microSD
  • Volver a conectar la tarjeta microSD y verificar el montaje

$ mount
 /dev/sdc2 on /media/ck/rootfs type ext4 (rw,nosuid,nodev,uhelper=udisks2)
 /dev/sdc1 on /media/ck/boot type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)
 $ sudo umount /dev/sdc?
 $ sudo dd if=./squash.rootfs of=/dev/sdc2
 $ sync
 $ mount

/dev/sdc2 on /media/ck/disk type squashfs (ro,nosuid,nodev,uhelper=udisks2)
 /dev/sdc1 on /media/ck/boot type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)

Modificación de las opciones de montaje rootfs en el archivo boot.ini

Puedes encontrar el UUID de la partición ext4 en la opción "root=" dentro del archivo boot.ini:

/media/ck/boot/boot.ini

 #------------------------------------------------------------------------------------------------------
 # Basic Ubuntu Setup. Don't touch unless you know what you are doing.
 # --------------------------------
 setenv bootrootfs "console=tty1 console=ttySAC2,115200n8 root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro fsck.repair=yes net.ifnames=0"
 Find the bootrootfs environment and change the rootfs options as follows:
 This HOWTO using a microSD card. If you are using an eMMC module, you can use root=mmcblk0p2
 #------------------------------------------------------------------------------------------------------
 # Basic Ubuntu Setup. Don't touch unless you know what you are doing.
 # --------------------------------
 setenv bootrootfs "console=tty1 console=ttySAC2,115200n8 root=/dev/mmcblk1p2 rootfstype=squashfs rootwait ro net.ifnames=0"
 $ nano /media/ck/boot/boot.ini
 $ cat /media/ckkim/boot/boot.ini | grep bootrootfs
 setenv bootrootfs "console=tty1 console=ttySAC2,115200n8 root=/dev/mmcblk1p2 rootfstype=squashfs rootwait ro net.ifnames=0"
 setenv bootargs "${bootrootfs} ${videoconfig} ${hdmi_phy_control} ${hid_quirks} smsc95xx.macaddr=${macaddr} ${external_watchdog} governor=${governor}"
Ahora simplemente asegúrate de que todo funciona correctamente. No te olvides de fijar el interruptor del modo de arranque en la tarjeta microSD. El login de odroid es "root" y la contraseña "odroid".
# mount
 sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
 proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
 udev on /dev type devtmpfs (rw,nosuid,relatime,size=952168k,nr_inodes=186804,mode=755)
 devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
 tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204240k,mode=755)
 /dev/mmcblk1p2 on / type squashfs (ro,relatime)
 securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
 tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
 tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
 tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
 cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
 cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
 cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
 cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
 cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
 cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
 cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
 cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
 cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
 cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
 systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=27,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
 mqueue on /dev/mqueue type mqueue (rw,relatime)
 debugfs on /sys/kernel/debug type debugfs (rw,relatime)
 configfs on /sys/kernel/config type configfs (rw,relatime)
 /dev/mmcblk1p1 on /media/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
 tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=204240k,mode=700)
Ejemplo: hacer que /home sea editable.

  • Crear una nueva partición ext4 en la tarjeta microSD
  • Desempaquetar squashfs-root
  • Crear nuevo directorio /media/data
  • Editar /etc/fstab para montar la partición de datos ext4 rw
  • Añadir/modificar con forme a tus preferencias y luego volver a crear squash.rootfs
  • Copiar el squash.rootfs recién creado sobre el existente en la tarjeta microSD
  • Arrancar usando la tarjeta microSD con la nueva imagen

$ sudo umount /dev/sdc?
$ sudo fdisk /dev/sdc
$ sudo mkfs.ext4 /dev/sdc3 -L data
$ sudo unsquashfs squash.rootfs
$ sudo mkdir -p squashfs-root/media/data
$ sudo nano squashfs-root/etc/fstab
$ cat squashfs-root/etc/fstab
 LABEL=boot /media/boot vfat defaults 0 1
 LABEL=data /media/data ext4 defaults 0 1
$ sudo mksquashfs squashfs-root/ squash.rootfs.1
$ sudo dd if=./squash.rootfs.1 of=/dev/sdc2
Reinicia y usa la tarjeta microSD que contiene la nueva imagen.
# mount | grep mmc
 /dev/mmcblk1p2 on / type squashfs (ro,relatime)
 /dev/mmcblk1p1 on /media/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
 /dev/mmcblk1p3 on /media/data type ext4 (rw,relatime,data=ordered)
Por ejemplo, se puede usar overlayfs (http://goo.gl/1UGThG) activado como módulo en el Kernel 4.14.y. Usa overlayfs para hacer /home editable.
# modprobe overlay
 # lsmod
 Module Size Used by
 overlay 65536 0
 joydev 20480 0
 spidev 20480 0
 spi_s3c64xx 20480 0
 exynos_gpiomem 16384 0
 ipv6 380928 28
 # mkdir -p /media/data/home
 # mkdir -p /media/data/home/upper
 # mkdir -p /media/data/home/work
 # mount -t overlay -o lowerdir=/home,upperdir=/media/data/home/upper,workdir=/media/data/home/work overlay /home
 # mount
 ...
 overlay on /home type overlay (rw,relatime,lowerdir=/home,upperdir=/media/data/home/upper,workdir=/media/data/home/work)
 # cd /home
 # touch file1
 # ls
 file1
Para comentarios, preguntas y sugerencias, visita el artículo de la wiki sobre SquashFS en http://goo.gl/Xw2epe.

Be the first to comment

Leave a Reply