Monday, January 27, 2020

Raspberry Pi Overlay Root Filesystem

I copied this from https://yagrebu.net/unix/rpi-overlay.md so I don't loose it. I have done a lot of network booting and overlay file system work this last year and these are the best directions for overlay file system and don't want to loose them. I will rewrite them to include my own subtle changes at some point, and publish network booting and network booting + overlay file system (which is a total crazy mess with no directions).
Raspberry Pi Overlay Root Filesystem
This document describes a method to protect the root filesystem from writes while still allowing all applications to function as normal while writing to a temporary Overlay filesystem. Figuring this out would have been impossible for me without this excellent post by ejolson on the RPI.org forums.
For my installation I used a RPI 3 and the latest Raspbian Stretch Lite image (2017-11-29). I do not know if these instructions will work without modification on earlier RPI hardware.
Note: When the overlay filesystem is in place your RPI will function as usual, but any data generated after startup is only saved in RAM and will be lost upon reboot.

Let's Begin

First we need to create a initramfs image that contains the overlay module and a boot script to mount our root partition with the overlay. (All this could of course be compiled into the kernel image, but initramfs-tools(8) is an easier way to learn about the early init-process.)
echo overlay >>/etc/initramfs-tools/modules
Place the following boot script in /etc/initramfs-tools/scripts/overlay (download):
# Local filesystem mounting                     -*- shell-script -*-

#
# This script overrides local_mount_root() in /scripts/local
# and mounts root as a read-only filesystem with a temporary (rw)
# overlay filesystem.
#

. /scripts/local

local_mount_root()
{
        local_top
        local_device_setup "${ROOT}" "root file system"
        ROOT="${DEV}"

        # Get the root filesystem type if not set
        if [ -z "${ROOTFSTYPE}" ]; then
                FSTYPE=$(get_fstype "${ROOT}")
        else
                FSTYPE=${ROOTFSTYPE}
        fi

        local_premount

        # CHANGES TO THE ORIGINAL FUNCTION BEGIN HERE
        # N.B. this code still lacks error checking

        modprobe ${FSTYPE}
        checkfs ${ROOT} root "${FSTYPE}"

        # Create directories for root and the overlay
        mkdir /lower /upper

        # Mount read-only root to /lower
        if [ "${FSTYPE}" != "unknown" ]; then
                mount -r -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /lower
        else
                mount -r ${ROOTFLAGS} ${ROOT} /lower
        fi

        modprobe overlay

        # Mount a tmpfs for the overlay in /upper
        mount -t tmpfs tmpfs /upper
        mkdir /upper/data /upper/work

        # Mount the final overlay-root in $rootmnt
        mount -t overlay \
            -olowerdir=/lower,upperdir=/upper/data,workdir=/upper/work \
            overlay ${rootmnt}
}
Create the initramfs image:
update-initramfs -c -k $(uname -r)
It will be placed in /boot/initrd.img<kernel_version> - you can rename it to match your kernel file if you want.
Add the following to /boot/config.txt - where initrd7.img is the initramfs image you created in the previous step:
kernel=kernel7.img
initramfs initrd7.img
And finally, add boot=overlay to the beginning of /boot/cmdline.txt.
This should do it. Reboot and keep your fingers crossed.

Kernel Panic

If the OS doesn't come back up, there is probably a typo somewhere, or you missed something.
You can remove boot=overlay from cmdline.txt to boot as normal.
A serial connection can be really handy when trying to troubleshoot the startup process. USB TTL console cables are dirt cheap, just make sure you get one that outputs 3.3V on the TX line so that you don't fry your RPI. Use screen(1)'s buffer to scroll back and try to figure out where it went wrong.
The documentation is also quite good. Read the man page for initramfs-tools(8) and the default boot scripts themselves:
less /usr/share/initramfs-tools/init
less /usr/share/initramfs-tools/scripts/local

Finishing Touches

Read-Only /boot

The /boot filesystem is still mounted rw. You can protect it as well by adding ro to the boot partitions mount options in /etc/fstab:
PARTUUID=72a9e9a9-01   /boot   vfat   defaults,ro   0   2

overctl

Since I would be updating the filesystem on my RPI regularly, I wanted a secure way to enable and disable the overlay. overctl has the following features:
Usage: overctl [-h|-r|-s|-t|-w]
   -h, --help     This message
   -r, --ro       Set read-only root with overlay fs
   -s, --status   Show current state
   -t, --toggle   Toggle between -r and -w
   -w, --rw       Set read-write root
Place the script in /usr/local/sbin and mark the file as executable. You will also need to create the following files containing the cmdline.txt options that you wish to toggle between:
/boot/cmdline.txt.orig
/boot/cmdline.txt.overlay

motd(5)

I figured I could use a reminder of which state the RPI is in. So I cobbled together this motd(5) script:
#!/bin/sh

str=$(mount | grep ' on / ')

if echo $str | grep -q 'overlay'; then
        printf "\n------ INFO: / MOUNTED WITH OVERLAY ------\n\n"
elif echo $str | grep -q 'rw'; then
        printf "\n++++++ INFO: / MOUNTED READ-WRITE ++++++\n\n"
else
        printf "\n!!!!!! WARNING: / UNKNOWN STATE !!!!!!\n\n"
fi
Place the code above in /etc/update-motd.d/80-overlay and make sure the file is executable.

Wednesday, January 8, 2020

Sony vs Canon: DSLR and Mirrorless

I had the Sony A9 and AIII and just couldn't use them because they are way too small for my hands. I think there has been so much attention on mirrorless, as well as marketing money to influencers on YouTubers which makes it seem like everyone is using Sony. I get it, mirrorless has it's place, and there are some great features. there's also some terrible features. I currently use a number of Canon DSLR cameras including the Canon EOS R. The R isn't my favorite camera, but it has grown on me. Anytime I reach for a camera, certainly for traveling, that is what I bring 90% of the time. The R and a Canon 7GX MII has been with me to 4 continents over the last year and I honestly wouldn't trade them for any Sony, despite having access to them. So here is my list of pluses and minuses:

- Blackout: The A9 has no blackout, all other mirrorless cameras have way too much blackout in my opinion. Canon R blackout is better than any Sony other than A9 but impossible to oh take photos of whales because they move too fast. Any DSLR such as Canon 5D MIV work fine for sports and wildlife photography, I just don't get the complaining of DSLR blackout. A DSLR instantly refreshes, where a mirrorless displays the previous image for way way too long and then refreshes. Only the A9 is usable for any wildlife or sports photography period.

- In body image stabilization (IBIS) I really don't understand why everyone wants IBIS. IBIS actually is a detractor if you want a seriously durable camera because the sensor shakes around.

- Smaller bodies are good for small hands, but not good for big hands. I have tried every battery grip available for the A series and they just don't work. The new body design is better, but not even close to a Canon or Nikon. Also the grip is shallow enough and the lens release is at the base of the body so when I grab the camera I've released the lens more than a few times.

- Sony can't handle water. If a Sony looks at water it stops working. Where I have dropped my 1D in river water and they keep working.

- Sony has no service support. When a camera needs servicing Sony suggest throwing it away and buying a new one. Canon has CPS, which is awesome if you need a camera serviced. Absolutely ridiculous Sony. No professional can depend on a Sony because of this.

- Shake a Sony camera and it makes noise. Strange.

- Love Sony A9 silent shooting, amazing for Wedding photography. Absolutely a game changer.

- I like the flip out LCDs on Canon better than Sony. Also the touchscreen. The menu system on Canon is way better too. The video codec is a little better on Sony.

- Canon color science is the best there is. Nikon is actually really great too. Hasselblad is pretty awesome too. Sony, not so much, every photo and video needs to be adjusted to look good. But Nikon video is lacking.

- Weight. Anyone that tells me that a Sony weighs less is crazy. Put a comparable lens on both cameras and compare the weight, they are basically the same and actually the Sony weighs more, just with a tiny camera in your hands. If you put a super small lens on a Sony then you have a weight savings, but meh. Now size is a bit smaller for traveling which is nice. But go for a micro 4/3 if size is a real issue.

- What is really nice about mirrorless is there's a shutter release button for photos and a record button for video. You don't have to switch between modes and remember do I look through the eyepiece or the rear screen.

- Lastly, all camera's do their best autofocus in good light. However, mirrorless cameras have poor autofocus anytime the light is anything less than good. The reason for this is what you see is what you get, but that is also what you autofocus from, where a DSLR will flip the mirror down and open up the lens aperture, evaluate then flip everything back to take the photo. This can take time, but 16 FPS for the pro series and 5FPS for the low end is pretty darn good.