3

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

1 Answer 1

3

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

3
  • 1
    Thanks for this. I understand that user's crontabs aren't processed until that user logs in. Does root's crontab get processed without a root login?
    – bitsmack
    Apr 12, 2021 at 20:30
  • Yes, the contents of root's crontab is run just like user crontab. Most things in there aren't @reboot but instead run on a schedule. Root's crontab always runs when the line specifies it to. Apr 19, 2021 at 22:37
  • @bitsmack: user crontab entries do not depend on that user's (or any user) login. Same is true for the root crontab. If cron depended on a user login, it really wouldn't be very useful at all.
    – Seamus
    Nov 7, 2021 at 2:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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