Autor Thema: Sicherheitskonzept VFS/Aufbau Wurzelverzeichnis "/"  (Gelesen 17140 mal)

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 16. July 2011, 12:24 »
Hallo,

Ich hab nicht behauptet, das man nicht auch Programme selber installieren kann. Dazu ist /usr/local und /opt ja da. Was ich kritisiert habe, das man das an apt vorbeimachen muss.
Naja, das liegt in der Natur der Dinge: Entweder du nutzt ein Paketverwaltungssystem oder du nutzt es eben nicht. Wenn du es (für ein Programm) nicht nutzt, dann weiß es auch nicht, was du tust...

Ich stell mir ne Methode vor, bei der man eine Metadatei an apt übergibt, das dann unter zuhilfenahme der in der Respo und der in der Metadatei enthaltenen Pakete das Programm samt allen Abhängigkeiten installiert.
Das ist möglich, indem du lokal ein Repository aufziehst, schließlich ist ein Repository nichts besonderes, sondern eben nur Metadaten plus Pakete. Andererseits müsstest du die Abhängigkeiten in jedem Programm im distributionsspezifischen Format wissen und damit im Buildsystem der Programme jede Distribution mit ihren Abhängigkeiten vermerken. Das wird nichts, deswegen werden die Repositories ja von den Distributionen gewartet und gerade nicht von den Entwicklern.

Zudem hängen die Abhängigkeiten offensichtlich von der Konfiguration ab (Qemu geht auch ohne SDL). Binärverteilung erzwingt dann bestimmte Abhängigkeiten.

Guck dir mal pkgsrc an (ist portabel, geht auch unter Linux) - das ist das Paketsystem von NetBSD. Das dürfte für ein Hobby-OS auch angenehmer sein, weil du keine Binaries warten musst. Das dürfte eher in deinem Sinne sein.

Ansonsten habe ich an deinem System zu bemängeln, dass die Suche nach z.B. einer Lib dazu führt, dass sämtliche Verzeichnisse unterhalb von /ear/lib/* vom Loader durchsucht werden müssen und dass es prinzipiell mehrere gleichnahmige Dateien geben kann.
Wieso ich hab doch deshalb extra diese <name>-<version> Form eingeführt. Der Libname sollte halt in den Include-Header Dateinen gescheit vermerkt werden.
Das ist eine gaaanz schlechte Idee.

Ich möchte in meinen Quelltexten ein "#include <SDL.h>" machen und dann die aktuelle SDL-Version benutzen und nicht bei jeder neuen (100% kompatiblen) SDL-Version meine Sourcen anpassen müssen. Das wäre Ärger zur Compilezeit. Zur Laufzeit würdest du also immer gegen eine fixe Lib-Version linken, was Library-Updates unmöglich macht. Wenn du stattdessen ein "nimm die aktuellste Version der Lib" möchtest, dann muss dein Runtime-Loader trotzdem /ear/lib/* traversieren und ziemlich viel Stringmatching machen.

Eine Möglichkeit wäre, in /ear/lib/* nur Symlinks auf die jeweils aktuellsten Versionen zu haben, die dann in /ear/lib/libs/libname-version/libname-version.so liegen. Aber dann kannst du die auch gleich das Unixprinzip "/ear/lib/libname.so -> /ear/lib/libname.so.version" benutzen...

Alles in Allem Danke ich dir aber für deine konstruktive Kritik. Ich versuche halt nur, das Ein-Programm = Ein-Ordner-System (welches ich persönlich bevorzuge) mit den Ansprüchen, die bei Linux vorherrschen (Gemeinsame Bibliotheken, Einfache Nutzung über's Shell, etc.) zu verbinden.
Das geht einfach nicht, weil es zwei völlig unterschiedliche Paradigmen sind. Der einzige Ansatz, den ich da habe wäre eine doppelte Verwaltung: Also Programme werden in ihren eigenen Ordner nach /apps/appname/* installiert, aber installieren Symlinks nach /usr/bin, Manpages nach /usr/share/man, Konfigurationen nach /etc, ...). Wenn man regelmäßig nach toten Symlinks sucht, wird man die Reste auch wieder zuverlässig los.

Deine letzte Bemerkung halte ich für nützlich. Vielleicht ist es besser /usr doch nicht abzuschaffen und dafür die zusätzlichen Ordner /app mit den Unterverzeichnissen. /app/proc für proc für Programme und /app/run für die Executivdeskriptoren einzuführen.
Schwierig. Ich bin dafür, /usr unter Linux abzuschaffen, weil es keine besondere Bedeutung mehr hat. Ursprünglich galt ja, dass / nicht von der Paketverwaltung verwaltet wird (Basissystem), /usr hingegen schon und /usr/local wieder nicht. Inzwischen werden / und /usr beide verwaltet, ein shared-usr ist mit heutigen Distributionen nur noch schwierig (Xorg legt die Standardkonfig unter /usr/share/X11 ab, noch geht aber /etc/X11!) und die Vorteile nutzt nahezu niemand mehr.

Ansonsten habe ich mir noch keine Gedanken zu einer optimalen Struktur gemacht, das hier sind alles nur Gedankensplitter (deswegen auch kein vollständiger Vorschlag). ;)

Gruß,
Svenska

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 16. July 2011, 22:03 »

Das ist eine gaaanz schlechte Idee.

Ich möchte in meinen Quelltexten ein "#include <SDL.h>" machen und dann die aktuelle SDL-Version benutzen und nicht bei jeder neuen (100% kompatiblen) SDL-Version meine Sourcen anpassen müssen. Das wäre Ärger zur Compilezeit. Zur Laufzeit würdest du also immer gegen eine fixe Lib-Version linken, was Library-Updates unmöglich macht. Wenn du stattdessen ein "nimm die aktuellste Version der Lib" möchtest, dann muss dein Runtime-Loader trotzdem /ear/lib/* traversieren und ziemlich viel Stringmatching machen.

Eine Möglichkeit wäre, in /ear/lib/* nur Symlinks auf die jeweils aktuellsten Versionen zu haben, die dann in /ear/lib/libs/libname-version/libname-version.so liegen. Aber dann kannst du die auch gleich das Unixprinzip "/ear/lib/libname.so -> /ear/lib/libname.so.version" benutzen...

Wieso. Es ist dir doch egal ob die Headerdatei SDL.h die Bibliothek /ear/lib/SDL.so oder /ear/lib/SDL-3.5.6/bin/SDL.so (Version ist jetzt zufällig) anfordert (das steht ja im Header). Und die Headerdatei findest du ja nicht irgendwo sondern in /ear/include/c/. Wenn du eine explizit ältere Version von SDL benutzen willst musst du halt z.B. /ear/include/c/version/SDL-3.4.2.h" benutzen. Die aktuelle Version ist als Symlink auf die aktuelle gestaltet.

Alles in Allem Danke ich dir aber für deine konstruktive Kritik. Ich versuche halt nur, das Ein-Programm = Ein-Ordner-System (welches ich persönlich bevorzuge) mit den Ansprüchen, die bei Linux vorherrschen (Gemeinsame Bibliotheken, Einfache Nutzung über's Shell, etc.) zu verbinden.
Das geht einfach nicht, weil es zwei völlig unterschiedliche Paradigmen sind. Der einzige Ansatz, den ich da habe wäre eine doppelte Verwaltung: Also Programme werden in ihren eigenen Ordner nach /apps/appname/* installiert, aber installieren Symlinks nach /usr/bin, Manpages nach /usr/share/man, Konfigurationen nach /etc, ...). Wenn man regelmäßig nach toten Symlinks sucht, wird man die Reste auch wieder zuverlässig los.
Das halte ich für eine gute Idee (deinen Vorschlag)
Schwierig. Ich bin dafür, /usr unter Linux abzuschaffen, weil es keine besondere Bedeutung mehr hat. Ursprünglich galt ja, dass / nicht von der Paketverwaltung verwaltet wird (Basissystem), /usr hingegen schon und /usr/local wieder nicht. Inzwischen werden / und /usr beide verwaltet, ein shared-usr ist mit heutigen Distributionen nur noch schwierig (Xorg legt die Standardkonfig unter /usr/share/X11 ab, noch geht aber /etc/X11!) und die Vorteile nutzt nahezu niemand mehr.
Naja, ich find eine Trennung zwischen Systemtools (/bin) und root-Systemtools (/sbin), die beim Start vorhanden sein müssen, sowie "normalen" Programmen (/usr/bin) schon sinvoll. Wobei dir entgegen kommt, das es /usr in der FHL nicht gibt.

Ansonsten hast du recht. Wenn man erst bei der GDT ist, braucht man sich über das Datensystem keine Gedanken machen.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 16. July 2011, 22:30 »
Hallo,

Wieso. Es ist dir doch egal ob die Headerdatei SDL.h die Bibliothek /ear/lib/SDL.so oder /ear/lib/SDL-3.5.6/bin/SDL.so (Version ist jetzt zufällig) anfordert (das steht ja im Header).
Moment, ich glaub du würfest da grad was durcheinander.

Zur Compilezeit wird die SDL.h in den Code eingebunden und das Ergebnis mit einer SDL.a zusammengelinkt. Beide müssen die gleiche Version haben. Dann steht im Binary ein Verweis auf die SDL.so.0, die benutzt wird (die letzte Null steht für die Major-Versionsnummer und erlaubt mehrere inkompatible Versionen nebeneinander, wie früher beim Umstieg von libc4 auf glibc).

Der Runtime-Loader sieht also nur die Datei "SDL.so", die er laden muss, da ist keine Versionsinformation mehr drin. Der Linux-Weg ist also, die /usr/lib/SDL.so.0 zu laden, die ein Symlink auf die reale /usr/lib/SDL.so.3.4.5 ist.

Und die Headerdatei findest du ja nicht irgendwo sondern in /ear/include/c/. Wenn du eine explizit ältere Version von SDL benutzen willst musst du halt z.B. /ear/include/c/version/SDL-3.4.2.h" benutzen.
Zur Compilezeit wird das ein bisschen schwierig, da /ear/include/c/version/SDL-3.4.2.h einmal nicht SDL.h heißt und zum anderen auch nicht im Compiler-Suchpfad liegt...

Die aktuelle Version ist als Symlink auf die aktuelle gestaltet.
Dann kannst du auch einfach den Unix-Weg komplett nehmen, wenn du schon keine grundlegenden Unterschiede mehr machst. ;-)

Übrigens finde ich die Bezeichnung "ear" ganz schlecht. Da denke ich immer an Ohren. :-P Außerdem gilt immer: Je weniger du vom ausgetretenen Pfad abweichst, umso einfacher wird es später. Wie man z.B. im Nachbarthread zur Frage der fork-Emulation in der libc sieht. Wenn der Kernel das einfach könnte... ;-)

Naja, ich find eine Trennung zwischen Systemtools (/bin) und root-Systemtools (/sbin), die beim Start vorhanden sein müssen, sowie "normalen" Programmen (/usr/bin) schon sinvoll. Wobei dir entgegen kommt, das es /usr in der FHL nicht gibt.
Im FHS kommt /usr vor (der Wikipediaartikel ist missverständlich formuliert; die Deutung "unix system resources" steht da nicht). Ich finde diese Trennung auch sinnvoll, da sie bei aktuellen Distributionen aber keinen Sinn mehr macht, kann sie als Altlast ruhig abgeschafft werden. Eine aktuelle Distribution funktioniert ohne /usr kaum noch. Und wenn /usr zerstört ist, muss man die meisten Distributionen eh neuinstallieren (und dazu wird /usr benötigt, z.B. habe ich ein /usr/bin/dpkg... nicht /bin/dpkg).

Im Endeffekt steht und fällt der Punkt mit der Frage, ob es ein Kernbetriebssystem gibt oder nicht. Linux-Distributionen haben keins, denn jedes Userland-Tool gehört zur Distribution, ob es nun kritisch ist oder nicht; eine Trennung zwischen /bin und /usr/bin ist da recht willkürlich(*). Die BSDs haben einen definierten Satz an Userspace, da lohnt sich das eher.

(*) Beispiel: Gehört der "cardmgr" aus dem Paket "pcmcia-cs" nach /sbin oder nach /usr/sbin? Das System funktioniert für den Rescue-Modus prima ohne ihn; zumindest solange das Root-Dateisystem nicht via NFS und einer PCMCIA-Netzwerkkarte oder eine PCMCIA-SCSI-Festplatte erreichbar ist... die Trennung ist also schwierig.

Ansonsten hast du recht. Wenn man erst bei der GDT ist, braucht man sich über das Datensystem keine Gedanken machen.
Das sowieso.

Gruß,
Svenska

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 17. July 2011, 12:02 »
Hallo,


Außerdem gilt immer: Je weniger du vom ausgetretenen Pfad abweichst, umso einfacher wird es später.
Das ist dann aber das ende der Evolution! Jegliche Form von Entwicklung erfordert das man ab und an auch mal einem anderen Pfad folgt!

Was die SW-Verwaltung angeht finde ich den Linux-Weg aber gar nicht so verkehrt. Wenn man sich die Pfade aussucht sollte man das schon mit viel Besonnenheit tun.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 24. July 2011, 14:02 »
Außerdem gilt immer: Je weniger du vom ausgetretenen Pfad abweichst, umso einfacher wird es später.
Das ist dann aber das ende der Evolution! Jegliche Form von Entwicklung erfordert das man ab und an auch mal einem anderen Pfad folgt!
Richtig. Ich muss aber nicht alle vorhandenen Pfade gleichzeitig wegschmeißen, denn das ist fahrlässig.

Gruß,
Svenska

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 24. July 2011, 17:04 »
Hallo,


Ich muss aber nicht alle vorhandenen Pfade gleichzeitig wegschmeißen, denn das ist fahrlässig.
Das hängt sehr von Ziel ab, es gibt sicher auch Ziele für die musst Du alle vorhandenen Wege verlassen.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 24. July 2011, 22:19 »
Hallo,

Ich muss aber nicht alle vorhandenen Pfade gleichzeitig wegschmeißen, denn das ist fahrlässig.
Das hängt sehr von Ziel ab, es gibt sicher auch Ziele für die musst Du alle vorhandenen Wege verlassen.
Das bezweifle ich, solange du nicht eine komplett neue Wissenschaft erfindest.

Auch du bleibst mit deiner Architektur auf den ausgetretenen Pfaden der FPGA-, Logik- und Elektronikwelten. Inklusive MMU. :P

Gruß,
Svenska

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 25. July 2011, 09:51 »
Hallo,


Das bezweifle ich, solange du nicht eine komplett neue Wissenschaft erfindest.
Okay, solange keiner von uns unser Universum, und damit den Gültigkeitsbereich der uns bekannten Naturgesetze, verlassen kann bleiben natürlich auch immer gemeinsame Wurzeln. So ganz "allumfassend" hatte ich meinen Satz nun auch wieder nicht gemeint. :-D
Langsam kann ich mit taljeth mitfühlen. :(

Auch du bleibst mit deiner Architektur auf den ausgetretenen Pfaden der FPGA-, Logik- und Elektronikwelten.
Ja.
Inklusive MMU.
Nein!


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 25. July 2011, 15:14 »
Langsam kann ich mit taljeth mitfühlen. :(
:?

 

Einloggen