2

I'm working on some home automation via a Raspberry Pi 3 B, I've got an external drive attached to it that I want to mount at startup without using fstab because I'll likely remove it at some point and this needs to be adaptable. I'm mounting by label in this scenario.

Currently the service fails at startup, and reports that the connection to the drive timed out. However, once the service is run by a user, the drive mounts without error. I'm beginning to think this is due to a misunderstanding about systemd but I can't think of an alternative, so I'd like some assistance.

Here's some relevant information:

/sbin/mount-media.sh

#!/bin/bash

#This is a mounting operation for use at startup.

## Variables

#Replace this with the label of target drive
DRIVE_LABEL='pidrive'

#The Rest
LABEL_FOUND=$(ls /dev/disk/by-label | grep -c $DRIVE_LABEL)
IS_MOUNTED=$(mount | grep -c /media)
CONNECTION_ATTEMPTS=0

## Function for checking if mounted.
is_mountable() {
  if [ $LABEL_FOUND = 1 ]; then
    if [ $IS_MOUNTED = 0 ]; then
      return 0
    else
      echo "Drive is already mounted"
      return 1
    fi
  else
    return 1
  fi
}

## Attempt to connect for 120 seconds
connect() {
  until [ $CONNECTION_ATTEMPTS -gt 119 ]; do
    if is_mountable; then
      mount /dev/disk/by-label/$DRIVE_LABEL /media
      return 0
    else
      ((CONNECTION_ATTEMPTS=CONNECTION_ATTEMPTS+1))
      echo $CONNECTION_ATTEMPTS
      sleep 1
    fi
  done
  if [ $IS_MOUNTED = 1 ]; then
    echo "Mounted $DRIVE_LABEL"
    exit 0
  else
    echo "Timed out, failed to mount."
    exit 1
  fi
}

## Main
connect

/etc/systemd/service/mount-media.service

[Unit]
Description=Mount our local drive to /media

[Service]
ExecStart=/sbin/mount-media.sh

[Install]
WantedBy=multi-user.target

On startup...

sudo journalctl -alf

-- Logs begin at Fri 2020-03-27 13:43:24 PDT. --
Mar 27 13:45:33 QTPi mount-media.sh[310]: 116
Mar 27 13:45:34 QTPi mount-media.sh[310]: 117
Mar 27 13:45:35 QTPi mount-media.sh[310]: 118
Mar 27 13:45:36 QTPi mount-media.sh[310]: 119
Mar 27 13:45:37 QTPi mount-media.sh[310]: 120
Mar 27 13:45:38 QTPi mount-media.sh[310]: Timed out, failed to mount.
Mar 27 13:45:38 QTPi systemd[1]: mount-media.service: Main process exited, code=exited, status=1/FAILURE
Mar 27 13:45:38 QTPi systemd[1]: mount-media.service: Failed with result 'exit-code'.

however, when the device is booted and a user runs

sudo systemctl start mount-media.service

Mar 27 13:49:04 QTPi sudo[2467]:       pi : TTY=pts/1 ; PWD=/home/pi ; USER=root ; COMMAND=/bin/systemctl start mount-media.service
Mar 27 13:49:04 QTPi sudo[2467]: pam_unix(sudo:session): session opened for user root by pi(uid=0)
Mar 27 13:49:04 QTPi systemd[1]: Started Mount our local drive to /media.
Mar 27 13:49:04 QTPi sudo[2467]: pam_unix(sudo:session): session closed for user root
Mar 27 13:49:05 QTPi kernel: EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
Mar 27 13:49:05 QTPi systemd[1]: mount-media.service: Succeeded.

pi@QTPi:~$ mount | grep /media

/dev/sda1 on /media type ext4 (rw,relatime)

pi@QTPi:~$ sudo blkid | grep pidrive

/dev/sda1: LABEL="pidrive" UUID="8249a0f7-f020-4c8d-866d-d8728df3b1e7" TYPE="ext4" PARTLABEL="primary" PARTUUID="9504d415-2649-48c1-a294-6869a275164b"

Should note that this UUID shifts every startup.

uname -a

Linux QTPi 4.19.97-v7+ #1294 SMP Thu Jan 30 13:15:58 GMT 2020 armv7l GNU/Linux
2

Try running it in root's crontab -e with a short sleep 30 at every reboot?

@reboot sleep 30; /sbin/mount-media.sh >> /var/log/mount.log 2>&1

And take it out of systemd

| improve this answer | |
  • This was a much better solution, thank you. – HearMeRawr Mar 27 at 22:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.