Почему файлы не могут быть обработаны inode? - PullRequest
20 голосов
/ 05 января 2011

Почему вы не можете получить доступ к файлу, когда знаете только его индекс, без поиска файла, который ссылается на этот индекс?Жесткая ссылка на файл содержит только имя и номер, указывающие, где найти инод со всей реальной информацией о файле.Я был удивлен, когда мне сказали, что не было способа пользовательского режима использовать номер инода напрямую для открытия файла.

Это похоже на такую ​​безвредную и полезную возможность для системы предоставить.Почему это не предусмотрено?

Ответы [ 5 ]

17 голосов
/ 05 января 2011

По соображениям безопасности - для доступа к файлу вам необходимо разрешение на файл КАК ХОРОШО КАК разрешение на поиск во всех каталогах из корня, необходимых для получения файла.Если бы вы могли получить доступ к файлу с помощью inode, вы могли бы обойти проверки для содержащихся каталогов.

Это позволяет вам создать файл, к которому может обращаться набор пользователей (или набор групп), а некто-нибудь еще - создайте каталоги, к которым имеют доступ только пользователи (по одному каталогу на пользователя), а затем жестко свяжите файл со всеми этими каталогами - сам файл доступен любому, но на самом деле доступ к нему может получить толькокто-то, у кого есть разрешения на поиск в одном из каталогов, с которыми он связан.

16 голосов
/ 05 января 2011

Некоторые операционные системы делают имеют такую ​​возможность.Например, OS X нуждается в поддержке Carbon File Manager , а в Linux вы можете использовать debugfs.Конечно, вы можете сделать это на любом UNIX из командной строки через find -inum, но настоящая причина, по которой вы не можете получить доступ к файлам по inode, заключается в том, что это не особенно полезно.Он делает своего рода обход прав доступа к файлам, потому что если в папке, которую вы не можете прочитать или выполнить, есть файл, то открытие inode позволит вам его обнаружить.не очень полезно то, что вам нужно найти номер инода с помощью вызова *stat(), после чего у вас уже есть имя файла (или открытый файл) ... или вам нужно угадатьinum.

4 голосов
/ 05 января 2011

В ответ на ваш комментарий: для «передачи файла» вы можете использовать fd, передавая через сокеты AF_LOCAL с помощью SCM_RIGHTS (см. man 7 unix).

3 голосов
/ 30 сентября 2012

Btrfs имеет ioctl для этого (BTRFS_IOC_INO_PATHS , добавленный в этот патч ), однако он не пытается проверять разрешения на пути и просто зарезервирован для root.

2 голосов
/ 18 мая 2013

Конечно, если вы уже искали файл по пути, вам не нужно делать это снова и снова?

stat(f,&s); i=open(f,O_MODE);

включает в себя два обхода через структуру каталогов.Это приводит к потере циклов ЦП ненужными строковыми операциями.Да, хорошо спроектированный fs-кеш будет скрывать большую часть этой неэффективности от случайного конечного пользователя, но повторять работу без причины некрасиво, если не просто глупо.

...