Rpi3B + SD Card Backup & Media Server - проблемы с использованием rsync - PullRequest
0 голосов
/ 20 июня 2019

Простите, если есть действительно простой ответ на этот вопрос. Я относительно новичок в Linux.

Я пытаюсь создать плекс-медиа-сервер на Raspberry Pi для моего тестя, чтобы просматривать все его фотографии на своем телевизоре.

Основная концепция заключается в том, что у меня есть rpi с внешним жестким диском и устройство чтения карт USB SD. Когда SD-карта подключена, она автоматически копирует файлы на жесткий диск. Затем я указываю плекс на жесткий диск, чтобы забрать все фотографии.

Я уже построил простой сервер NAS / plex дома на rpi, так что запустил его без проблем. Однако у меня возникли проблемы с автоматическим копированием файлов с SD-карты.

Я никогда раньше не создавал сценариев, поэтому я использовал проект, который я нашел, в качестве справочника, называемого маленьким бэкапом, и попытался изменить его в соответствии со своими потребностями. Оригинал здесь, если вам нужно сослаться на него:

https://github.com/dmpop/little-backup-box/

Оригинальный сценарий определяет, когда устройства подключены, а затем выключает rpi. Поскольку я хочу запустить мультимедийный сервер PLEX на RPI, мне нужно, чтобы он оставался включенным. Полный скрипт изменен мной ниже.

#!/bin/bash

# IMPORTANT:
# Run the install-little-backup-box.sh script first
# to install the required packages and configure the system.

# Specify devices and their mount points
STORAGE_DEV="sda1"
STORAGE_MOUNT_POINT="/media/storage"
CARD_DEV="sdb1"
CARD_MOUNT_POINT="/media/card"

# When the USB storage device is detected, mount it
mount /dev/$STORAGE_DEV $STORAGE_MOUNT_POINT

# Wait for a card reader or a camera
CARD_READER=$(ls /dev/* | grep $CARD_DEV | cut -d"/" -f3)
until [ ! -z $CARD_READER ]
  do
  sleep 1
  CARD_READER=$(ls /dev/sd* | grep $CARD_DEV | cut -d"/" -f3)
done

# If the card reader is detected, mount it and obtain its UUID
if [ ! -z $CARD_READER ]; then
  mount /dev/$CARD_DEV $CARD_MOUNT_POINT
  # # Set the ACT LED to blink at 500ms to indicate that the card has been mounted
  sudo sh -c "echo 500 > /sys/class/leds/led0/delay_on"
  # Create the CARD_ID file containing a random 8-digit identifier if doesn't exist
  if [ ! -f $CARD_MOUNT_POINT/CARD_ID ]; then
    < /dev/urandom tr -cd 0-9 | head -c 8 > $CARD_MOUNT_POINT/CARD_ID
  fi
  # Read the 8-digit identifier number from the CARD_ID file on the card
  # and use it as a directory name in the backup path
  read -r ID < $CARD_MOUNT_POINT/CARD_ID
  BACKUP_PATH=$STORAGE_MOUNT_POINT/"$ID"
# Perform backup using rsync
rsync -avh --timeout=10  $CARD_MOUNT_POINT/ $BACKUP_PATH
fi

exec $0 && exit

Это прекрасно работает по большей части. Я могу вставить одну SD-карту, и она скопирует все файлы.

Однако проблема, с которой я сталкиваюсь, заключается в том, что мне нужно, чтобы это было достаточно надежно, так как мой тесть стар и может вытащить SD-карты, прежде чем они закончат копировать и т. Д. Мне также нужно, чтобы потом скопировать другой SD после удаления оригинала.

Поэтому я попытался изменить сценарий, чтобы перезапустить себя после завершения. Кажется, что это работает, так как я вижу, что скрипт backup.sh работает, когда я ввожу команду top.

Однако, если копирование намеренно прерывается извлечением SD-карты, то при подключении новой карты памяти новые файлы не копируются. Я полагаю, что проблема может быть связана с тем, что процесс rsync не был надлежащим образом завершен / завершен.

Поэтому я добавил --timeout = 10, чтобы попытаться аккуратно завершить процесс rsync, если IO не обнаружен, но, похоже, это не работает, так как я вижу, что rsync продолжает работать как процесс после извлечения SD. карта.

Я не совсем уверен, где я ошибаюсь, и я только предполагаю, что это проблема с rsync. Так что любая помощь высоко ценится.

Дополнительная информация: модель rpi 3 b + бегущая растяжка.

...