Non-ATARI > Software
SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
kernal:
Hi Forum,
ich benutze auf meinem PC fast ausschliesslich Manjaro-Linux (ein Arch-Derivat). Leider kompilieren die Maintainer keine Unterstützung für ATARI-Partitionen in den Kernel. Da ich keine Lust habe bei jedem Kernel-Update einen eigenen Kernel zu backen, habe ich ein kleines Bash-Skript geschrieben, welches eine SD-Karte einhängt. Sollte die SD-Karte eingehängt sein, hängt das Script die Karte aus.
Einzig parted muss installiert sein. Ansonsten sollte es keine Abhängigkeiten geben.
Vielleicht kann es ja noch jemand gebrauchen:
--- Code: ---#!/bin/bash
#
# stcard - Mount Atari partitions from SDCARD
# by "Genral Failure" (c) 2020
#
# This script acts like a toggle switch. The first call mounts
# an SDCARD, the second call umounts the SDCARD, and so forth...
#
# Change DEVICE, MOUNTPOINT and MAXPARTSIZE to your needs
#
# MAXIMUM PARTITION SIZES
# - Phys. sector size is always 512 Bytes/Sector
# - TOS has a fixed cluster size of 2 sectors (sic)
# - Linux can only mount partions with a sector size of max. 4KB
# - Max. mountable size = MaxNumberOfClusters * 2 * 4096
#
# TOS 1.02
# - Max. number of cluster limit of 2^14 = 16384 Clusters
# - Max. size = 16384 * 2 * 4096 = 134217728
#
# TOS 1.04
# - Max. number of cluster limit of 2^15 = 32768 Clusters
# - Max. size = 32768 * 2 * 4096 = 268435456
#
# TOS 3+
# - I'm too lazy right now. Google it.
DEVICE=/dev/sde
MOUNTPOINT=~kernal/stcard
MAXPARTSIZE=134217728
# Check for root permission
if [ "$EUID" -ne '0' ]; then
echo "ERROR: root permission required."
echo " Run stcard as root or run with sudo"
exit
fi
# If card is mounted, unmount it and remove mountpoints
for FOLDER in $(find $MOUNTPOINT -maxdepth 1 -mindepth 1 -type d); do
umount -q $FOLDER && rmdir $FOLDER
done
# If there are loop devices from previous calls, remove them and quit
LOOPDEVS=($(losetup --raw -O BACK-FILE,NAME | grep "^$DEVICE /dev/loop"))
NUMLOOPS=${#LOOPDEVS[@]}
if [ $NUMLOOPS -gt 0 ]; then
for (( i=0; i < $NUMLOOPS; i++ )); do
((i++))
losetup -d ${LOOPDEVS[i]}
done
sync
exit
fi
# Prepare mountpoint
mkdir -p $MOUNTPOINT
chown --reference ${MOUNTPOINT}/.. $MOUNTPOINT
MOUNTUID=$(stat -c '%u' $MOUNTPOINT)
MOUNTGID=$(stat -c '%g' $MOUNTPOINT)
PARTITIONS=($(parted -m $DEVICE unit B print | awk -F : '/^[1-9]/ {print int($2),int($4)}'))
NUMPARTS=${#PARTITIONS[@]}
# Process partitions
for (( i=0; i < $NUMPARTS; i++ )); do
PARTSTART=${PARTITIONS[$i]}
((i++))
PARTSIZE=${PARTITIONS[$i]}
# Create loop device only, when it not already exists
if ! losetup --raw -O BACK-FILE,OFFSET,SIZELIMIT,NAME | grep -q "^$DEVICE $PARTSTART $PARTSIZE /dev/loop"; then
LOOPDEVICE=$(losetup --find --show --offset $PARTSTART --sizelimit $PARTSIZE $DEVICE)
MOUNTDIR=${MOUNTPOINT}/${DEVICE##*/}$((i/2+1))
if [ $PARTSIZE -le $MAXPARTSIZE ]; then
mkdir -p $MOUNTDIR
chown --reference $MOUNTPOINT $MOUNTDIR
mount -t msdos -o uid=$MOUNTUID,gid=$MOUNTGID $LOOPDEVICE $MOUNTDIR
fi
fi
done
--- Ende Code ---
goetz @ 3rz:
Das klingt extrem praktisch, merci.
Arthur:
@kernal, welchen Namen hat dein Werk bzw Skript und könntest du grob erläutern was es tut?
kernal:
@Arthur, was das Skript tut hatte ich ja schon geschrieben. Ich nenne das Skript stcard. Es ist dem Skript aber egal, unter welchem Namen Du es abspeicherst. ;) Vergiss nicht es ausführbar zu machen (chmod +x stcard).
Das wesentliche steht eigentlich schon im Header des Skriptes. Aber nun gut, erläutere ich etwas genauer.
Heutzutage haben vermutlich die meisten ATARI ST-Nutzer irgendeinen Festplattenemulator auf SD-Karten-Basis - z.B. Gigafile, Satan oder Ultrasatan um nur einige zu nennen. Nun bietet es sich an diese Karten auch am PC unter Linux zu Lesen und/oder zu beschreiben. Da nicht in jeder Linux-Distribution das Kernel-Modul zur Unterstützung von ATARI-Partitionen mitkompiliert wird, funktioniert das auf Systemen mit solchen Distributionen erstmal nicht. Man kann jetzt hergehen und sich einen eigenen Kernel mit der Unterstützung für ATARI-Partitionen kompilieren oder aber, man umgeht die Partitionstabelle und benutzt loop-devices für die einzelnen Partitionen und mountet das darin enthaltene Dateisystem direkt in bereitgestellte Ordner. Letzteres tut mein Skript. Da mein Skript mithilfe von parted die Partition auswertet aber das Einhängen und der Zugriff auf das Dateisystem wieder ganz normal über den Linux-Kernel läuft, gelten die üblichen Einschränkungen, insbesondere eine maximale Sektorgröße von 4096 bytes. Die maximalen Partitionsgrößen die damit unterstützt werden und den Rechenweg dahin habe ich für TOS 1.02 und TOS 1.04 im Header des Skriptes dokumentiert.
Am Anfang des Skriptes werden drei Variablen definiert:
--- Code: ---DEVICE=/dev/sde
MOUNTPOINT=~kernal/stcard
MAXPARTSIZE=134217728
--- Ende Code ---
Das solltest Du auf jeden Fall ändern. DEVICE ist die Gerätedatei zur SD-Karte. Das kann aber auch gerne ein Image-File einer SD-Karte sein. Meine SD-Karten melden sich immer als /dev/sde an. Das musst Du aber selbst herausfinden, welches das bei dir ist. Hilfreich dabei sind z.B. lsblk, disktype und parted.
MOUNTPOINT steht für das Zielverzeichnis, in dem die Partitionen eingehängt werden sollen. Bei mir wären das mit obiger Konfiguration und einer SD-Karte mit zwei Partitionen /home/kernal/stcard/sde1 und /home/kernal/stcard/sde2.
MAXPARTSIZE ist die maximale Partitionsgröße, die sich aus dem kleinsten gemeinsamen Nenner der jeweiligen Systemlimits von TOS und vfat (bzw. DOS) ergeben. Wie gesagt stehen die Werte für TOS 1.02 und TOS 1.04 im Header des Skriptes. Wie man leicht erkennen kann nutze ich noch TOS 1.02. TOS 1.04 ROM-Module habe ich bestellt und sind auf dem Weg. :D
Im Kern kombiniert das Skript parted zum Ermitteln der Partitionsanfänge und -längen, losetup zum Anlegen von Loop-Devices mit den ermittelten Partitionsgrenzen und mount.vfat zum mounten der Loop-Devices.
Ich hoffe, das ist nun Erläuterung genug. Wenn nicht, kannst Du gerne noch spezifische Fragen stellen. Ich baue auch gerne vorgeschlagene Bugfixes und/oder Erweiterungen ein (z.B. Parametrisierung) und veröffentliche dann neue Versionen hier.
RealLarry:
Vielen Dank für das Skript, @kernal, das werde ich bestimmt noch gut gebrauchen können.
Ich hatte auch das Problem, dass das Kernel-Modul für Atari-Dateisysteme nicht zur Verfügung stand (Arch Linux), habe dann aber auf den XanMod-Kernel gewechselt, dort ist es nämlich drin (wie auch das Kernel-Modul für das Amiga-Dateisystem). XanMod steht für alle Debian-/APT-basierenden Linuxe zur Verfügung, aber auch eben für Arch Linux und Gentoo.
https://xanmod.org
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln