Autor Thema: SD-Karte unter Linux mounten ohne Kernelunterstützung von ATARI ST-Partitionen  (Gelesen 15144 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline kernal

  • Benutzer
  • Beiträge: 162
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
« Letzte Änderung: Do 19.11.2020, 21:14:59 von kernal »

Offline goetz @ 3rz

  • Benutzer
  • Beiträge: 2.053
Das klingt extrem praktisch, merci.
Wider dem Signaturspam!

Offline Arthur

  • Benutzer
  • Beiträge: 10.310
  • Mein Atari erinnert mich an die gute alte Zeit..
@kernal, welchen Namen hat dein Werk bzw Skript und könntest du grob erläutern was es tut?

Offline kernal

  • Benutzer
  • Beiträge: 162
@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.

Offline RealLarry

  • Benutzer
  • Beiträge: 365
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
Die Wirklichkeit ist bekanntlich nur eine Illusion, die durch den Mangel an Alkohol hervorgerufen wird.

Offline Arthur

  • Benutzer
  • Beiträge: 10.310
  • Mein Atari erinnert mich an die gute alte Zeit..
@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.


« Letzte Änderung: Fr 20.11.2020, 16:08:38 von Arthur »

Offline czietz

  • Benutzer
  • Beiträge: 3.687
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 behelfen, denen man mit der Syntax -i Gerätename@@Byte-Offset auch eine beliebige Partition vorgeben kann.)

Offline kernal

  • Benutzer
  • Beiträge: 162
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.

Offline Arthur

  • Benutzer
  • Beiträge: 10.310
  • Mein Atari erinnert mich an die gute alte Zeit..
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.

Offline fiveofive

  • Benutzer
  • Beiträge: 19
  • Atari demoscene activist
Super Sache, ich stehe nun schon Jahre vor genau diesem Problem. Das Script macht dann bestimmt vieles einfacher. Danke!

Offline simonsunnyboy

  • Benutzer
  • Beiträge: 1.807
  • Rock'n'Roll is the thing - Jerry Lee is the king!
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!
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

Offline kernal

  • Benutzer
  • Beiträge: 162
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!
« Letzte Änderung: So 29.11.2020, 19:16:39 von kernal »

Offline Arthur

  • Benutzer
  • Beiträge: 10.310
  • Mein Atari erinnert mich an die gute alte Zeit..
Kann es sein das du sie nicht angehängt hast?

Offline kernal

  • Benutzer
  • Beiträge: 162
Jetzt schon. ;-)