atari-home.de - Foren

Non-ATARI => Software => Thema gestartet von: kernal am Do 19.11.2020, 21:02:53

Titel: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: kernal am Do 19.11.2020, 21:02:53
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:


#!/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
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: gh-baden am Do 19.11.2020, 22:42:30
Das klingt extrem praktisch, merci.
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: Arthur am Do 19.11.2020, 23:58:04
@kernal, welchen Namen hat dein Werk bzw Skript und könntest du grob erläutern was es tut?
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: kernal am Fr 20.11.2020, 09:29:05
@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:

DEVICE=/dev/sde
MOUNTPOINT=~kernal/stcard
MAXPARTSIZE=134217728

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.
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: RealLarry am Fr 20.11.2020, 10:38:45
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 (https://xanmod.org)
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: Arthur am Fr 20.11.2020, 10:47:14
@kernal, besten Dank für die wirklich ausführliche Erklärung. Ich hätte nicht gedacht das es ausreicht dafür "nur" ein Skript zu schreiben. Eine wirklich tolle Idee. Ich bin auf meinem PC mit Windows unterwegs und werde es evtl. nicht verwenden. Manchmal starte ich jedoch eine Linux VM und dann könnte es sein das ich das Skript mal benötige oder einfach nur ausprobieren will.

Ich hab das Skript oben mal als stcard.txt angehängt. Ich hoffe das ist ok.


Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: czietz am Fr 20.11.2020, 11:37:09
Sehr professionell gemacht, danke fürs Teilen.

(Unter Windows muss ich mir in den Ausnahmefällen, in denen meine Atari-Medien keine PC-kompatible Partitionstabelle haben, immer mit den mtools (https://www.gnu.org/software/mtools/) behelfen, denen man mit der Syntax -i Gerätename@@Byte-Offset auch eine beliebige Partition vorgeben kann.)
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: kernal am Fr 20.11.2020, 15:23:38
Ich hab das Skript oben mal als stcard.txt angehängt. Ich hoffe das ist ok.

Ja, NP. Kannst Du die Endung .txt entfernen? Es ist ja keine Textdatei, sondern ein Script. Wenn Du unbedingt eine Endung haben möchtest, dann vielleicht .sh (für shell). Ich bevorzuge aber, für Skripte keine Endung zu benutzen. Wenn Du das Skript z.B. unter /usr/local/bin abspeicherst und ausführbar machst, musst Du es inkl. Endung aufrufen:

$ sudo scard.txt

"Fühlt" sich komisch an, ist aber nur Kosmetik.
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: Arthur am Fr 20.11.2020, 16:14:34
Normalerweise gibt das Forum ein paar Dateitypen vor... also jpg, pdf, txt, png etc.. Das scheint vor ein paar Tagen geändert worden zu sein. Früher wurden deshalb Dateien z.B. zip als zip.pdf hochgeladen. ich denke das jetzt auch ein zip ohne tricks angehängt werden kann. Habs oben ändern können und zip geht nun auch.
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: fiveofive am Fr 20.11.2020, 20:15:20
Super Sache, ich stehe nun schon Jahre vor genau diesem Problem. Das Script macht dann bestimmt vieles einfacher. Danke!
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: simonsunnyboy am Sa 21.11.2020, 10:47:24
Super Sache, ich stehe nun schon Jahre vor genau diesem Problem. Das Script macht dann bestimmt vieles einfacher. Danke!

Das geht mir genauso. Werde ich bei Gelegenheit mal ausprobieren!
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: kernal am So 29.11.2020, 18:31:14
Neue Version

Nun wo mein 1040STF mit TOS 1.04 läuft, habe ich noch ein bisschen versucht auszuloten, welche Partitionsgrößen ich sowohl auf dem Atari nutzen als auch unter Linux mounten kann - mit und ohne BigDOS.

In der ersten Version des Skriptes habe ich beruhend auf der Annahme, dass der Atari nur mit zwei Sektoren pro Cluster umgehen kann und anhand der maximalen Anzahl an Clustern der jeweiligen TOS-Version, aus der Partitionsgröße auf die Größe der Sektoren geschlossen.

Jetzt kam BigDOS ins Spiel, wo die Begrenzung auf zwei Sektoren pro Cluster aufgehoben ist. Meine erste Überlegung ging dahin, das Skript parametrisierbar zu machen. Man hätte dann die TOS-Version angeben müssen und mit einem zusätzlichen Parameter, ob BigDOS verwendet wird. Allerdings kann ich dann immer noch nicht die Sektorgöße berechen, da ich die verwendete Clustergröße nicht wissen kann.

Da das einzige Limit die 4096 Bytes pro Sektor in Linux sind, habe ich mir gedacht, ich müsste doch eigentlich nur die Sektorgröße direkt aus dem Dateisystem auslesen.  Genau das tut diese Version des Skriptes jetzt mithilfe von od. Es ist dadurch einfacher, kürzer und universeller geworden. od ist Bestandteil der Core-Uitilities uns sollte in jeder Distribution mitinstalliert sein, wodurch es keine zusätzlichen unaufgelösten Abhängigkeiten gibt.

Viel Spass mit der neuen Version!
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: Arthur am So 29.11.2020, 18:38:07
Kann es sein das du sie nicht angehängt hast?
Titel: Re: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen
Beitrag von: kernal am So 29.11.2020, 19:17:01
Jetzt schon. ;-)