1 (edytowany przez krypton_pl 2025-02-25 11:15:35)

Temat: Skrypt do automatycznego montowania partycji

Napisałem skrypt do automatycznego montowania partycji nowo podłączanych urządzeń, działający jako usługa Openwrt.
Przy montowaniu pomijane są partycje montowane poprzez fstab. Może komuś się przyda

#!/bin/sh /etc/rc.common

# Skrypt startowy dla OpenWRT
START=99
STOP=10

# Katalog, w którym będą montowane partycje
MOUNT_DIR="/mnt/devices"

# Logowanie do syslog
log_to_syslog() {
    local level=$1
    local message=$2
    logger -t "automount" -p "user.$level" "$message"
}

# Funkcja startowa
start() {
    log_to_syslog "info" "Starting automount service..."

    # Tworzenie katalogu montowania, jeśli nie istnieje
    mkdir -p "$MOUNT_DIR"

    # Uruchomienie głównej pętli w tle
    (
        while true; do
            # Pobierz listę wszystkich partycji
            PARTITIONS=$(lsblk -lnpo NAME,TYPE | grep -E 'part$' | awk '{print $1}') || {
                log_to_syslog "err" "Failed to list partitions using lsblk."
                sleep 10
                continue
            }

            # Iteruj przez wszystkie partycje
            for PARTITION in $PARTITIONS; do
                # Pomijaj partycje wymienione w /etc/fstab
                if grep -q "^$PARTITION" /etc/fstab; then
                    continue
                fi

                # Pobierz typ systemu plików i UUID
                FSTYPE=$(blkid -o value -s TYPE "$PARTITION") || {
                    log_to_syslog "err" "Failed to get filesystem type for $PARTITION."
                    continue
                }
                UUID=$(blkid -o value -s UUID "$PARTITION") || {
                    log_to_syslog "err" "Failed to get UUID for $PARTITION."
                    continue
                }

                # Pomijaj partycje bez systemu plików lub typu swap
                if [ -z "$FSTYPE" ] || [ "$FSTYPE" = "swap" ]; then
                    continue
                fi

                # Sprawdź, czy partycja jest już zamontowana
                if ! findmnt -rno UUID | grep -q "^$UUID$"; then
                    # Utwórz katalog montowania
                    MOUNT_POINT="$MOUNT_DIR/$(basename $PARTITION)"
                    mkdir -p "$MOUNT_POINT"

                    # Spróbuj zamontować partycję
                    /bin/mount "$PARTITION" "$MOUNT_POINT" || {
                        log_to_syslog "err" "Failed to mount $PARTITION at $MOUNT_POINT."
                        rmdir "$MOUNT_POINT"
                        continue
                    }

                    log_to_syslog "info" "Partition $PARTITION (UUID: $UUID) successfully mounted at $MOUNT_POINT."
                fi
            done

            # Sprawdź katalogi w /mnt/devices/ i usuń te bez zamontowanej partycji
            for MOUNT_POINT in "$MOUNT_DIR"/*; do
                if [ -d "$MOUNT_POINT" ]; then
                    MOUNTED_UUID=$(findmnt -rn -o UUID "$MOUNT_POINT")
                    if [ -z "$MOUNTED_UUID" ]; then
                        rmdir "$MOUNT_POINT"
                    fi
                fi
            done

            # Odczekaj 10 sekund przed kolejnym sprawdzeniem
            sleep 10
        done
    ) &
}

# Funkcja stopowa
stop() {
    log_to_syslog "info" "Stopping automount service..."
    killall $(basename $0) 2>/dev/null
}

# Funkcja restart
restart() {
    stop
    start
}

2

Odp: Skrypt do automatycznego montowania partycji

Czekaj, przecież OpenWrt potrafi samodzielnie montować partycji automatycznie po włożeniu, opcja auto_mount w fstabie.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: Skrypt do automatycznego montowania partycji

Prawda, ale chciałem aby montowane były w dowolnym katalogu, bez przerabiania oryginalnego skryptu.

4

Odp: Skrypt do automatycznego montowania partycji

Ok, to tylko dla porządku dodam że są pakiety np. ksmbd-hotplug które przez sambę udostępniają automatycznie podłączone nośniki.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

5

Odp: Skrypt do automatycznego montowania partycji

@krypton_pl W razie czego, gdzie to zapisać / umieścić?

6 (edytowany przez krypton_pl 2025-02-21 09:56:47)

Odp: Skrypt do automatycznego montowania partycji

plik ze skryptem trzeba umieścić w /etc/init.d i nadać mu atrybuty wykonywalności
potrzeba też doinstalować pakiet mount-utils

7

Odp: Skrypt do automatycznego montowania partycji

Dodałem to do /etc/init.d/test chmod 755
/etc/init.d/test start
/etc/rc.common: line 28: lsblk: not found

Zainstalowałem lsblk

W mnt jest pusty folder devices, w opt jest pusty folder p910nd_drivers

Zainstalowałem mount-utils ale bez zmian.

8

Odp: Skrypt do automatycznego montowania partycji

sprawdź co masz w logach systemowych:
tak powinno wyglądać:

Fri Feb 21 10:14:51 2025 user.info automount: Partition /dev/sdd1 (UUID: 405A88F95A88ECCA) successfully mounted at /mnt/devices/sdd1.

9

Odp: Skrypt do automatycznego montowania partycji

Mam takie coś

Fri Feb 21 09:47:40 2025 user.info automount: Starting automount service...
Fri Feb 21 09:51:12 2025 user.info automount: Stopping automount service...
Fri Feb 21 09:51:12 2025 user.info automount: Starting automount service...
Fri Feb 21 09:51:45 2025 user.info automount: Stopping automount service...
Fri Feb 21 09:51:49 2025 user.info automount: Starting automount service...

10

Odp: Skrypt do automatycznego montowania partycji

proszę wpisz polecenie mount, lsblk i odpisz co wyrzuca na ekran

11

Odp: Skrypt do automatycznego montowania partycji

root@OpenWrt:~# mount
/dev/ubiblock0_1 on /rom type squashfs (ro,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)
/dev/ubi0_2 on /overlay type ubifs (rw,noatime,assert=read-only,ubi=0,vol=2)
overlayfs:/overlay on / type overlay (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work)
tmpfs on /dev type tmpfs (rw,nosuid,noexec,noatime,size=512k,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,mode=600,ptmxmode=000)
debugfs on /sys/kernel/debug type debugfs (rw,noatime)
none on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,noatime,mode=700)

root@OpenWrt:~# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
mtdblock0    31:0    0  640K  1 disk
mtdblock1    31:1    0  512K  1 disk
mtdblock2    31:2    0  512K  1 disk
mtdblock3    31:3    0  768K  1 disk
mtdblock4    31:4    0    4M  1 disk
mtdblock5    31:5    0    4M  0 disk
mtdblock6    31:6    0  640K  0 disk
mtdblock7    31:7    0    5M  1 disk
mtdblock8    31:8    0    8M  0 disk
mtdblock9    31:9    0   29M  0 disk
mtdblock10   31:10   0   25M  0 disk
mtdblock11   31:11   0   50M  0 disk
mtdblock12   31:12   0  256K  0 disk
mtdblock13   31:13   0  128K  0 disk
mtdblock14   31:14   0  384K  0 disk
mtdblock15   31:15   0   64K  0 disk
mtdblock16   31:16   0   64K  0 disk
mtdblock17   31:17   0   64K  0 disk
mtdblock18   31:18   0  768K  0 disk
mtdblock19   31:19   0  320K  0 disk
ubiblock0_1 254:0    0    4M  0 disk /rom

12 (edytowany przez krypton_pl 2025-02-21 10:56:21)

Odp: Skrypt do automatycznego montowania partycji

wszystko co mogłoby zamontowane został już zamontowane wiec skrypt pominął, włóż pendrive/kartę pamięci/dysk usb.
skrypt montuje partycje, nie urządzenia blokowe.

13 (edytowany przez Focus 2025-02-21 12:34:03)

Odp: Skrypt do automatycznego montowania partycji

Doinstalowałem jeszcze
kmod-usb-storage
kmod-usb-storage-uas

/etc/rc.common: line 42: blkid: not found

doinstalowałem blkid

root@OpenWrt:~# block info | grep "/dev/sd"
/dev/sda1: UUID="896367d2-9ec2-af09-0f72-d8291b45b6c8" LABEL="PenDrive" VERSION="1.0" TYPE="ext2"

root@OpenWrt:~# ls -l /dev/sd*
brw-------    1 root     root        8,   0 Jan  1  1970 /dev/sda
brw-------    1 root     root        8,   1 Jan  1  1970 /dev/sda1

teraz cały czas w logu leci jak niżej

mount: mounting /dev/sda1 on /mnt/devices/sda1 failed: Invalid argument
mount: mounting /dev/sda1 on /mnt/devices/sda1 failed: Invalid argument
mount: mounting /dev/sda1 on /mnt/devices/sda1 failed: Invalid argument
mount: mounting /dev/sda1 on /mnt/devices/sda1 failed: No such file or directory
mount: mounting /dev/sda1 on /mnt/devices/sda1 failed: No such file or directory
rmdir: '/mnt/devices/sda1': No such file or directory
rmdir: '/mnt/devices/sda1': No such file or directory
rmdir: '/mnt/devices/sda1': No such file or directory
mount: mounting /dev/sda1 on /mnt/devices/sda1 failed: Invalid argument
mount: mounting /dev/sda1 on /mnt/devices/sda1 failed: Invalid argument
mount: mounting /dev/sda1 on /mnt/devices/sda1 failed: Invalid argument
rmdir: '/mnt/devices/sda1': No such file or directory

usunąłem to i zrobiłem reboot, bo nie chciało się zatrzymać jak zrobiłem
/etc/init.d/test stop

edit.
jeszcze raz lsblk

root@OpenWrt:~# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    1 115.5G  0 disk
└─sda1        8:1    1 115.5G  0 part

edit.2

Działa.

Zabrakło mi
kmod-fs-ext4
kmod-fs-vfat