Jak wymusić względne, aby być absolutnym w Linuksie?

1

Mam oprogramowanie trzeciej części z konfiguracją zewnętrzną, która przyjmuje „ścieżkę do pliku” jako parametr wejściowy. Niestety, to oprogramowanie łączy ścieżkę z określoną ścieżką. Na przykład oczekuje „danych / obrazów” jako parametru i użyje „/ Users / someuser / work / source / data / images”. Chcę określić i bezwzględną ścieżkę, ale podanie czegoś takiego jak „/ tmp / images” do tego oprogramowania spowoduje po prostu użycie nieistniejącej ścieżki „/ Users / someuser / work / source // tmp / images” :(. sztuczka ścieżki, której mogę używać obok '..', więc mogę dać oprogramowanie something spowoduje to bezwzględną ścieżkę po powiązaniu oprogramowania ze wstępnie zdefiniowanym. Używanie „..” działa, ale nie jest to bardzo dobre rozwiązanie, ponieważ konfiguracja ścieżki jest statyczna, a predefiniowane użycie oprogramowania ścieżki może się zmienić.

grigoryvp
źródło

Odpowiedzi:

2

Istnieje mnóstwo możliwości do wykonania /Users/someuser/work/source/XXX wskazać gdziekolwiek chcesz w Linuksie:

  • Użyj dowiązań symbolicznych - robiąc coś takiego:

    ln -s /wherever/you/want /Users/someuser/work/source/XXX
    

    zrobiłby /Users/someuser/work/source/XXX pojawiać się jako katalog. Gdyby jakieś oprogramowanie podróżowało tam i / lub zapisywało tam pliki, trafiałyby do niego /wherever/you/want.

  • Zamontuj inny system plików w XXX, tj.

    mount /dev/something /Users/someuser/work/source/XXX
    

    W ten sposób otrzymasz urządzenie / dev / coś zamontowane bezpośrednio w katalogu, do którego aplikacja będzie zapisywać.

  • Wykonaj „bind mount”, czyli ponownie powiąż część innego systemu plików (już zamontowanego) z XXX:

    mount -o bind /wherever/you/want /Users/someuser/work/source/XXX
    

    Działa podobnie jak dowiązanie symboliczne, ale jest znacznie trudniejsze do wykrycia przez aplikację. Aplikacja może łatwo sprawdzić, czy katalog docelowy jest dowiązaniem symbolicznym i odmawia tam zapisu, podczas gdy metoda bind mount zapewnia normalny katalog, ale jego zawartość

  • Użyj systemu plików podobnego do unionfs, takiego jak unionfs lub aufs - w ten sposób można „unifikować”, tj. montować jednocześnie kilka systemów plików w jednym katalogu (tj. XXX )

  • Odtwórz kilka sztuczek za pomocą LD_PRELOAD i bibliotek, które zastępują metody, takie jak open(), fopen(), itp. - najważniejszym jest bezpiecznik , a mianowicie, możesz chcieć sprawdzić Unijne systemy plików dla FUSE .

GreyCat
źródło
0

Jeśli dowiązanie symboliczne /Users/someuser/work/source/ do / (korzeń)

work$ ln -s / source

Każda ścieżka będzie oparta na katalogu głównym:

/Users/someuser/work/source/tmp/images 

wskaże

/tmp/images

które możesz sprawdzić

work$ ls source/tmp/images
sanmai
źródło
Może nazwać to czymś w rodzaju rootdir zamiast source.
tripleee
Jak już wcześniej zauważyłem, użycie oprogramowania ścieżki jako root jest dynamiczne, więc dowiązanie symboliczne będzie trudne.
grigoryvp
Jak możecie przeczytać z mojej odpowiedzi, jeśli dowiązujemy się do dowiązania symbolicznego do katalogu głównego FS , nic nie jest trudne. Przeczytaj jeszcze raz moją odpowiedź. mount --bind oparte na rozwiązaniach nie są tak elastyczne jak moje.
sanmai