Come creare un collegamento reale a un inode (ext4)?


17

Se conosco il nodo indice (inode) di un file, ma non conosco il suo percorso (o alcuno dei suoi percorsi), è possibile creare direttamente un collegamento reale a tale inode?

Potrei trovare il file usando sudo find / -inum 123546e quindi creare un collegamento fisico, ma sarebbe troppo lento per la mia applicazione.

NB Sto usando un filesystem ext4.


1
Strettamente correlato: rimozione o ridenominazione di un file tramite il suo inode (entrambi i quali sono ugualmente impossibili da eseguire direttamente).
Gilles 'SO- smetti di essere malvagio' il

Risposte:


23

AFAIK, non con l'API del kernel. Se esistesse un'interfaccia del genere, dovrebbe essere limitata al superutente in quanto altrimenti consentirebbe a chiunque di accedere ai file nelle directory a cui non ha accesso alla ricerca.

Ma potresti usarlo debugfssul file system (una volta smontato) per farlo (supponendo che tu abbia accesso in scrittura al dispositivo a blocchi).

debugfs -w / dev / block / device

(sostituire /dev/block/devicecon il dispositivo a blocchi effettivo nel quale risiede il file system).

Quindi, al prompt di debugfs, immettere

stat < 123 >
(con le parentesi angolari, sostituendo 123 con il numero di inode effettivo) per verificare l'esistenza del file (inode ha un conteggio dei collegamenti maggiore di 0) e non è una directory.

Se tutto va bene, inserisci:

< 123 > path / to / newfile
per creare il collegamento fisico (si noti che il percorso è relativo alla radice del file system). Seguito da:

mi < 123 >
per aumentare il conteggio dei collegamenti (premere Enterper tutti i campi tranne il conteggio dei collegamenti in cui si desidera aggiungere 1 al valore corrente).


6
Tale interfaccia dovrebbe anche verificare che il file abbia un conteggio di collegamenti diverso da zero, altrimenti sarebbe possibile risorgere un file cancellato ma ancora aperto, che IIRC è stato rifiutato perché viola gli invarianti del kernel.
Gilles 'SO- smetti di essere malvagio' il


1
@PhilipCouling, il bit di autorizzazione di esecuzione in una directory si traduce in autorizzazione di ricerca . Ho già detto nelle directory quindi non ho accesso alla ricerca .
Stéphane Chazelas,

3
@OrangeDog, l' autorizzazione di ricerca è la terminologia utilizzata dallo standard POSIX.
Stéphane Chazelas,

1
@mosvy: quel controllo può essere rimosso dal kernel. Devi sistemare un paio di posti in VFS perché non si adatti da solo. L'ho fatto mentre lavoravo alla mia tesi anni fa.
Giosuè

3

A seconda del caso d'uso, un altro approccio potrebbe essere quello di raccogliere prima tutti i candidati di file in una directory collegandoli e quindi collegando i file a cui sei particolarmente interessato.

Ad esempio

mkdir -pm 0700 by-inode/{0..999}
find <path> ! -type d -printf "%i/%p\0" |
  while IFS=/ read -rd '' i n; do
    ln "$n" "by-inode/$((i/1000))/$i"
  done

(supponendo che i tuoi numeri di inode siano tutti inferiori a 1.000.000, crea più directory se necessario).

Successivamente, i tuoi inode vengono raggruppati in base al 1000 e raccolti by-inode/nell'albero. Da lì, puoi collegarli secondo necessità.

Si noti tuttavia che ciò significa che l'eliminazione dei file in <path>non recupererà lo spazio a causa di quel collegamento extra rigido.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.