Настраивал как-то домашний мини сервер и потребовалось сделать так чтобы при перезагрузке или не дай бог аварийном выключении и включении мини сервера подключенные к нему внешний HDD автоматически примонтировались в нужные папки.
Решение в лоб с использованием fstab не подошло так как после перезагрузок точка монтирования диска изменялась. Можно было бы воспользоваться UUID но к сожалению и он после перезапусков частенько менялся, что приводило к тому, что необходимо было при старте подключаться к серверу физически и вводить команды вручную для его корректного запуска.
После этого я подумал использовать crontab ведь в нем есть возможность указать не периодичность с которой нужно выполнять скрипт/команду а указать @reboot и выполнять нужную мне команду после загрузки системы. Однако и здесь не все так гладно. Это событие срабатывает только при корректном выключении или перезагрузке сервера, а если же было отключение электроэнергии то при запуске после этого скрипт не выполняется.
Так что остановил свой выбор на rc.local . Однако и тут не все сразу. В Debian 11 по умолчанию нет файла /etc/rc.local и его работу нужно "включить".
Для этого нужно:
1) Создаем файл /etc/rc.local с содержимым
#!/bin/sh -e sh /root/твой_скрипт.sh exit 0
что-то типа такого:
2) Делаем файл исполняемым с помощью команды: chmod +x /etc/rc.local
3) Теперь нужно запустить демона rc-local: systemctl start rc-local
#!/bin/bash# Попытка сделать скрипт который будет проверять существует ли в системе(подключен) диск# и если есть, то монтируем его в папкуif [ "$1" = "" ] ; thenFIRST_SLEEP=60elseFIRST_SLEEP=$1fi# Функция для определения есть ли диск в системеget_hdd_isset() {if df | grep -q 'usb-Initio_INIC-3610'; thenecho "1"elseecho "0"fi}# Проверяем примонтирована ли эта папка ужеif_hdd_mount() {if df | grep -q '/mnt/Storage1/DATA/4TB_1'; thenecho "1"elseecho "0"fi}# Получаем адрес диска для монтированияget_disk() {df | grep 'usb-Initio_INIC-3610'|awk '{print $6}'}# Переменная для работы с лог файломLOG_FILE="/var/log/add_hdd_4TB_1.txt"# Переменная для индикации подлючен ли дискHDD_ISSET=$(get_hdd_isset )# Переменная для счётчика циклаCOUNT=0sleep "$FIRST_SLEEP"while [ $COUNT -lt 5 ]; doecho "[$(date "+%Y-%m-%d %H:%M:%S")] : Попытка №$((COUNT + 1))" >> "$LOG_FILE"if [ "$HDD_ISSET" -eq 1 ]; then# истинаif [ "$(if_hdd_mount)" -eq 1 ]; thenumount /mnt/Storage1/DATA/4TB_1echo "[$(date "+%Y-%m-%d %H:%M:%S")] : диск отмонтирован" >> "$LOG_FILE"fiTO_MOUNT_DISK=$(get_disk)echo "[$(date "+%Y-%m-%d %H:%M:%S")] : Диск в системе присутствует. Будем его монтировать." >> "$LOG_FILE"mount --bind "$TO_MOUNT_DISK" /DATA/4TB_1echo "[$(date "+%Y-%m-%d %H:%M:%S")] : Диск примонтирован в системе." >> "$LOG_FILE"COUNT=99continuefiif [ $COUNT -eq 4 ]; thenecho "[$(date "+%Y-%m-%d %H:%M:%S")] : Диск в системе не найден. Попытки подключения исчерпаны, завершаем выполнение скрипта." >> "$LOG_FILE"elseecho "[$(date "+%Y-%m-%d %H:%M:%S")] : Диск в системе не найден. Ожидаем 15 секунд и делаем ещё одну попытку." >> "$LOG_FILE"sleep 15fiCOUNT=$((COUNT + 1))done
