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.