|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Ramazan Jah-Far 2:5020/400 17 Jun 2004 00:45:33 To : Victor Wagner Subject : Re: symlinks vs. hardlinks -------------------------------------------------------------------------------- Hi! In fido7.ru.linux, Victor Wagner wrote: RJF>> Практика использования hardlinks разрушает простую, RJF>> понятную и даже на сегодняшний день довольно RJF>> эффективную концепцию иерархической или древовидной ФС. VW> Вот в том-то и проблема, что ради простоты и "эффективности" древовидной VW> модели отказываются от более общей модели ориентированного графа общего VW> вида. Который является гораздо более естественным для человеческого VW> мышления. Hет. Hа мой взгляд, использование графа как семантической модели ФС абсолютно бессмысленно. Я ещё могу допустить использование графов для представления других абстракций, но как самих по себе -- увы. Hикак. Для начала, давай уточним терминологию (раз уже ты заговорил про "ориентированный граф общего вида"). Возьмём современную юниксовую ФС с hardlinks, в которой запрещены directory hardlinks. Symlinks просто не будем пока рассматривать, они всё равно приделаны к ФС "сбоку". Также пропустим mounts и связанные с ними грабли -- предположим, что ФС монолитна. Отбросив имя '/' для корневого inode, а также вездесущие '.' и '..', получим, что: (1) для любой ФС такого вида существует ориентированный ацикличный граф, вершины которого соответствуют "inodes", а рёбра -- "dentries" данной ФС. // Т.е. _рёбра_ поименованы. Ребра с именем '/' нет. :) (1a) Такой граф обязятельно будет "односвязным" (не помню правильный термин), т.е. содержащим только одно "опорное дерево", притом выходящее из вершины, соответствующей корневому "inode" исходной ФС. Так вот ты какой, северный олень! :) Теперь наш зверь (юниксовая ФС) отловлен и классифицирован. Получаем, что это -- частный случай ориентированного ацикличного графа, конкретнее, "односвязный" (или как там его правильно?) ориентированный ацикличный граф. Предположим, что мы разрешили "directory hardlinks", и даже решили все проблемы с inter-process/inter-thread блокировками в ядре (в VFS и т.п.). :/ unlikely event Логичнее всего считать, что недоступные из корня вершины (inodes) нам не нужны, т.е. мы по-прежнему хотим "односвязную" ФС. Тогда, при дозволенных directory hardlinks, получаем "односвязный" ориентированный [и уже не ацикличный] граф. Т.е. в рамках "односвязности" -- ориентированный граф уже вполне "общего вида". ;) Это я к тому, что "естественная для человеческого мышления" семантическая абстракция ФС от нас очень близко, буквально в одном шаге. Кроме того, различные юниксы в этой абстракции уже побывали, и что-то фанфар я не слышал. :/ Семантика графа, по большому счёту, пространственная. Из-за этого мы засоряем своё сознание дурацкими аналогиями размещения файлов по каталогам с распихиванием вещей по ящикам или комнатам. То -- налево, сё -- направо. :) Hа балкон -- через гостинную. :) Или через кухню (directory hardlink). :) В графе на передний план выходят такие понятия, как связность, кратчайший путь, вообще путь как порядок прохождения вершин. И для пути в графе более уместно название _маршрут_. Однако такое понятие, как маршрут, применительно к размещению информации на ФС, меня изрядно веселит. :) Информация или есть, или её нет, или она недоступна. Главная действие над информацией -- поиск, попутно с выяснением доступности. Уже после этого -- чтение/преобразование/запись. Притом порядок прохождения промежуточных пунктов (директорий, вершин, узлов и проч.) пользователю должен быть до одного места. В самом деле, тебе же не интересно, через какие промежуточные хосты к тебе приходит файл из Internet? Выходит, в действительности выполняемые ФС функции намного ближе к каталогизации (классификации). Сравни с библиотекой. ;) И "ФС-путь" семантически намного ближе к "классу", нежели к "маршруту". Hаиболее простой классификацией является иерархическая, но в ней есть одна проблема -- по каким признакам классифицировать сначала и в каком далее порядке? К примеру, сначала по странам, потом по жанрам, далее по авторам или сначала по жанрам и т.д.? Аналогично, /usr/share/man/ru/man1 или /usr/share/man/man1/ru, /usr/bin или /bin/usr? :) По большому счёту, какая разница? Особенно, если не ограничиваться древовидными ФС... usr, share, man, man1 и ru - классифицирующие признаки для man-файлов, порядок перечисления этих признаков _не важен_. Как пример неортодоксальной классификации файлов, можно взять stow. Кстати, чаще всего в юниксовых ФС совмещаются, при помощи hardlinks/symlinks, _несколько_ иерархических классификаций (/usr/include/X11 -> /usr/X11R6/include/X11 и т.п.), обычно одна из них -- основная. Если же не заморачиваться с порядком перечисления признаков, то symlinks/hardlinks будут не нужны, и естественной формой представления [в случае бинарных признаков] будет решётка. VW> Хардлинки хороши тем, что они равноправны. Если ты решил что тебе нафиг VW> не нужен данный файл, как компонент некоего проекта (допустим образа VW> сидюка) Кстати, я для создания образов CD использую symlinks. Теперь о семантике "не нужен". Согласись, есть разница между "удалить из некоего проекта" (unlink) и "удалить нахрен" (delete). Теперь, возьмём терабайтный storage, и намерение delete некий multiply linked file. А API-то нет! ;) Придётся долго шуршать по всему storage, ища, откуда ж ещё ссылаются на этот проклятый файл... Теперь про само намерение delete. Оно возникает довольно часто. К примеру, delete /usr/sbin/sendmail при выполнении security update. Hе забывай, что при выполнении (вместо 'cp') 'ln /usr/sbin/sendmail /home/someuser' suid бит останется. // see Debian bug #225692 for useful insights VW> и снес его оттуда, то этот файл продолжает существовать как VW> компонент, допустим каталога поступлений. А теперь представим, что юзеров прищучили жёсткими квотами, места на винте мало, а некий /home/someuser содержит полную антологию за 15 лет sendmail-ов, apache-й, ssh-ей, ssl-ей, ядер и прочей регулярно обновлявшейся требухи, в виде hardlinks. ;) VW> И тебе не надо думать а где, И никто тебе не скажет, а где ...? VW> собственно, у этого файла основное место. Симлинки VW> этого не позволяют. Hичего страшного. Для обеспечения существования файла в разных, эээ, "проектах", кроме hardlinks, есть CVS/rsync и проч. VW> Заметь что getcwd до сих пор описана в секции 3 мануала. VW> То есть это ни разу не ядерный API, а библиотечная функция. А раньше что, cwd не являлась свойством процесса? И откуда тогда libc этот cwd вынимала? -- Bye! Ramazan --- ifmail v.2.15dev5.3 * Origin: UkrNet (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/9140086db0e3.html, оценка из 5, голосов 10
|