Друзья мои, программисты и операторы, я бы хотел поговорить о том, как в Linux работает запись файлов.

Раньше я думал, что она устроена определённым образом, и как Джон Леннон, «I’m not the only one». Оказалось, операции записи работают совершенно иначе. То, как они работают, интересно и важно знать.

Позвольте начать с того, как я раньше думал о записи файлов.

  1. вы вводите команду echo "foo" > bar.txt

  2. (спустя несколько микросекунд) бум, всё готово, строка «foo» записана на диск.

Я думал так, потому что считал, что файлы находятся на диске, поэтому если выполняется запись в файл, то она выполняется на диск.

Но это так не работает, и описанная выше модель о нахождении файлов на диске ошибочна.

Давайте начнём с демонстрации того, почему ошибочна эта модель.

Файлы не находятся на диске

Логично думать, что файлы находятся на диске, потому что файлы — это то, с чем мы взаимодействуем при записи данных на диск.

Но дело в том, что на самом деле файл — это интерфейс. Операционная система использует этот интерфейс, чтобы мы могли сказать ей, чего хотим.

Пока всё это немного теория, поэтому позвольте повторить: файлы — это интерфейс, во многом похожий на экземпляр ООП с методами и атрибутами. Файлы — это не единицы на диске. Это всего лишь абстрактный интерфейс для них.

Но что же тогда находится на диске? Байты.

На диске находятся байты

Диск — это просто мешок с байтами. Разумеется, эти байты имеют структуру. В противном случае они были бы произвольными, и мы бы не смогли извлечь из них пользу. Конкретный способ упорядочивания байтов на диске называется inodeinode — это то, что в конечном итоге описывается при помощи файла.

Можно сравнить inode с jpeg: это способ упорядочивания байтов определённым образом. Например, inode указывает, что в определённом месте вашего мешка с байтами записывается размер файла. В другое место записывается время создания файла.

Но почему бы тогда просто не взаимодействовать с inode?

Зачем использовать интерфейсы

Напрямую выполнять запись на диск можно. Нужно точно знать, куда выполнять запись, и необходимо записывать эти байты напрямую. Вероятность ошибок крайне высока.

Поэтому гораздо удобнее просто попросить об этом операционную систему. Благодаря этому мы можем сосредоточиться на собственных приложениях.

И это одна из причин использования интерфейсов: мы абстрагируем задачи, которыми не хотим заниматься.

Ещё одна важная причина — это эффективность. Делегируя доступ к диску операционной системе, мы даём программистам операционной системы разрешение принимать множество эффективных решений.

Диски медленные

Давайте вернёмся к нашей гипотезе:

  1. вы вводите команду echo "foo" > bar.txt

  2. (спустя несколько микросекунд) бум, всё готово, строка «foo» записана на диск.

Она абсолютно ложна. Если бы она была верна, компьютеры бы казались ужасно медленными. Диски о-о-очень медленные.

Насколько медленные? Получение небольшой порции данных с SSD в тысячу раз медленнее, чем получение её из памяти. Получение тех же данных с жёсткого диска в миллион раз медленнее. Дисковый доступ на много порядков медленнее, чем доступ к памяти!

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

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

Как они это делают?

Как на самом деле работает запись?

Вот, как работает запись.

  1. вы вводите команду echo "foo" > bar.txt

  2. операционная система копирует «foo» в особое место памяти под названием страничный кэш

  3. (несколько микросекунд спустя) операционная система сообщает, что запись успешно выполнена

  4. (асинхронно, спустя до тридцати секунд) операционная система на самом деле записывает «foo» на диск

Если вы привыкли к мысленной модели «файлы находятся на диске», то это вас потрясёт. Лично я привык считать, что запись на диск происходит мгновенно, но на самом деле она выполняется спустя тридцать секунд!

Зачем нужна такая асинхронность?

Допустим, вы сделали приложение для публикации фотографий с кнопками Like. Лайки под фото сохраняются в базе данных. Однако если бы вы лично проектировали это приложение, то предпочли бы…

  1. Чтобы сердечко лайка появлялось как только пользователь нажмёт на кнопку Like?

  2. Чтобы сердечко появлялось только после того, как лайк был сохранён на диск?

Разумеется, вы выбрали бы вариант 1, потому что отзывчивость UI очень важна.

Это пример защиты пользователя от медленной работы при помощи асинхронности: мы сообщаете пользователю, что сделали это, но на самом деле, делаете это позже, когда он не смотрит.

С Linux ситуация почти такая же. Он защищает приложение от медленности диска, просто выполняя запись на диск позже. Это называется неблокирующим вводом-выводом: мы не заставляем приложение ждать медленные диски.

Однако это не единственная причина асинхронности записи.

Буферизация также ускоряет запись на диск

Важно уяснить следующее: асинхронность позволяет использовать буферизацию.

Позже я исследую эту тему глубже, а пока скажу, что меня потрясло то, насколько часто встречаются буферы и очереди в computer science. Не сказать, что это какой-то секрет, но они важнее для эффективных вычислений, чем я думал.

Очереди и буферы также повышают эффективность записи на диск.

Например, каждая запись на диск связана с тратой дополнительных ресурсов. Учитывая эту трату, мы лучше выполним одну большую операцию записи на 1 мегабайт, чем сто небольших записей по 10 килобайтов каждая. Буферизация записей на диск позволяет операционной системе объединять эти небольшие записи в более крупные.

Так как операционная система отделяет запись в файл от настоящей записи на диск, то если вы быстро выполняете серию записей файлов, то они объединятся в небольшую очередь. Затем операционная система может их объединить.

На самом деле, существует гораздо больше трюков, позволяющих повысить скорость записей, и все они становятся возможными благодаря этой асинхронности. Возможно, я расскажу о них в другой статье, но если вам не терпится, крайне рекомендую прочитать главы «File System» и «Disk» книги Брендана Грегга «Systems Performance».

Как бы то ни было, мы теперь понимаем, что асинхронные записи на диск дают нам огромный рост скорости, но здесь есть ещё один аспект: какой же ценой?

Компромисс между эффективностью и надёжностью

Что произойдёт, если вы отключите компьютер прежде, чем операционная система запишет данные на диск? Всё очень просто: данные будут потеряны.

Мне бы хотелось найти обсуждение, в котором намеренно было принято это решение, но у такого варианта как будто и не было альтернатив: до недавнего времени запись на диск была в миллион раз медленнее, чем доступ к памяти. Разумеется, по умолчанию запись выполнялась асинхронно.

Но что, если мы хотим сделать наши операции записи надёжными?

O_SYNC и sync: делаем записи надёжными

Хотя лично меня удивил факт асинхронности записей, многие программисты, и, в частности, программисты баз данных, хорошо о нём знают.

Существует множество способов сделать записи надёжными. Я расскажу о двух из них.

Системный вызов sync

Существует системный вызов под названием sync, который можно совершить в любой момент. Он означает «операционная система, немедленно сбрось всё из страничного кэша на диск!» И операционная система сделает это. Вы даже можете прямо сейчас ввести эту команду в шелл, чтобы проверить.

В программах часто встречаются последовательности записей, перемежаемые вызовами sync. Например, через каждые n записей выполняется вызов sync. Это позволяет приложениям тонко настраивать баланс между надёжностью и скоростью записи.

Файловый режим O_SYNC

Также программисты могут открывать файл в режиме O_SYNC. Это действие гораздо ближе к модели, изложенной в начале статьи: запись завершается только тогда, когда данные были сохранены на диск.

Демонстрация асинхронных записей

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

В шелл я вставлю следующие команды:

echo "foo" > example.txt
dd if=example.txt

Ниже показан результат выполнения bpftrace, позволяющей отслеживать события ядра.

В частности, мы будем отслеживать моменты завершения vfs_read и vfs_write (вам достаточно знать, что это функции, вызываемые при чтении и записи в файл). Также мы будем отслеживать block_rq_issue, которая вызывается, когда драйвер диска на самом деле выполняет запись на диск.

# запись начинается
11:32:05 kfunc:vmlinux:vfs_write
запись заканчивается
11:32:05 kretfunc:vmlinux:vfs_write
считывание начинается
11:32:05 kfunc:vmlinux:vfs_read
считывание заканчивается
11:32:05 kretfunc:vmlinux:vfs_read
5 секунд спустя действительная запись "foo" на диск!
11:32:10 tracepoint:block:block_rq_issue

Обратите внимание, что мы даже никогда не считываем с диска, хотя и считываем файл. Так происходит, потому что чтение выполняется из страничного кэша!

Особенность: это поведение не универсально

Использование или неиспользование страничного кэша для считывания и записи на самом деле зависит от файловой системы. Однако самые распространённые файловые системы Linux (ext4, btrfs, XFS) используют страничный кэш. С ZFS ситуация чуть сложнее. Хотя в ней используется страничный кэш, у неё также есть собственный относительно сложный механизм кэширования.

Заключение

Надеюсь, это помогло вам привести свою мысленную модель в соответствие с реальностью. На диске находятся не файлы, а байты. Файлы просто описывают эти байты. Это расхождение упрощает программирование и позволяет операционной системе защитить наши быстрые приложения от медленных дисков.

Эта тема гораздо шире — разница между файловым и дисковым вводом-выводом намного глубже. Например, какой объём будет записан на диск при записи 1 байта в файл? Удивитесь ли вы, если я скажу, что запись 1 байта вызывает запись на диск 65 тысяч байтов? И существует ещё множество таких тонкостей.

Комментарии (93)


  1. lovecraft
    27.07.2023 12:50
    +29

    Хорошая статья, но эта кроличья нора очень глубока

    • Могут быть баги в ядре и драйверах, из-за которых данные меняются в процессе записи https://habr.com/ru/articles/263893/

    • Могуи быть странности изменением данных во время сбороса страниц на диск https://habr.com/ru/articles/219295/comments/#comment_7493865

    • Даже у HDD сейчас есть свой кэш, который может жить своей жизнью (не говоря уж о SSD)

    • Нехорошие прошивки контроллеров могут возвращать управление после SYNC, не дожидаясь записи на диск

    • Прошивки СХД могут вообще игнорировать SYNC, надеясь на батарейную (суперконденсаторную) защиту кэша

    • И т.д.


    1. MTyrz
      27.07.2023 12:50
      +42

      Статья плоха даже для журнала "Мурзилка". И это точно не уровень хабра (хотя и по отличным от "Мурзилки" причинам). Хотя… медиахолдинг, говорите? Ну да, ну да...



  1. igorzakhar
    27.07.2023 12:50
    +2

    Что произойдёт, если вы отключите компьютер прежде, чем операционная система запишет данные на диск? Всё очень просто: данные будут потеряны.

    А как же журналируемые файловые системы?


    1. Ritan
      27.07.2023 12:50
      +9

      Так журнал не защищает от потери данных, он защищает от повреждения фс


    1. lorc
      27.07.2023 12:50
      +7

      Журналируемые ФС спасают от повреждения того что уже было записано. Грубо говоря, если нет журнала и свет пропадает во время обновления метаданных ФС, то у вас может посыпаться вся ФС и вы потеряете вообще все. Журнал спасает от этого.

      Но если данные никогда не попали из памяти на диск, то чем журнал поможет то?


    1. saboteur_kiev
      27.07.2023 12:50
      +2

      Журнал нужен для контроля консистентности файловой системы, а не сохранения ваших файлов.

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


      1. mvv-rus
        27.07.2023 12:50
        +2

        По умолчанию, да, журналируемая файловая система целостность содержимого обычных файлов от сбоев при их записи не защищает.
        Однако журналируемая файловая система может предоставлять сервис, позволяющие приложению сохранять файлы транзакционно, по принципу "все или ничего". Такой сервис, в частности, в Windows предосталяет NTFS, начиная с Vista: TxF,


        1. alan008
          27.07.2023 12:50

          По поводу TxF - спасибо за упоминание, впервые услышал о таком! Это действительно кроличья нора )


          1. saboteur_kiev
            27.07.2023 12:50

            И в первом же абзаце указано, что возможно будущие версии виндовс могут не поддерживать транзакции...


        1. saboteur_kiev
          27.07.2023 12:50

          Интересно, но по сути это практически ничего не меняет.
          В журнал пишется начало операции, потом в журнале пишется что операция завершена.
          Какая именно это была операция - запись файла, удаление, перемещение, компрессия, шифрование, создание снапшота - это уже вторично.
          Если операция прервется по какой-либо причине, основной способ все починить - подчистить все шаги незавершенной операции.


    1. RolexStrider
      27.07.2023 12:50
      -1

      del


  1. Komrus
    27.07.2023 12:50

    А давайте вспомним ещё первые Windows и запись на дискету...
    Тоже много чудес с потерей данных было из-за кешей...


    1. MTyrz
      27.07.2023 12:50
      +5

      smartdrv.exe
      И (для особых эстетов) с какой скоростью без него ставилась NT 4.0


      1. lamerAlex
        27.07.2023 12:50
        +1

        Ой ... Установка NT запускалась из DOS?


        1. MTyrz
          27.07.2023 12:50
          +2

          Скажем так: сам я грузился с досовой дискеты с драйвером CD-ROM (смартдрайв я в autoexec прописал, чтобы не забывать), потом переходил на CD, запускал файл, емнип, winnt.exe — и вперед. Но у меня был… хм… неофициальный дистрибутив.

          Официально же… беглый гуглеж показывает примерно такое:

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

          Если у вас есть компакт-диск, но нет стартовых загрузочных дискет, то они могут быть получены на начальной стадии инсталляции. Возможен также вариант инсталляции вообще без загрузочных дискет — для этого необходимо стартовать программы winnt.exe или winnt32.exe с ключом /B.
          Похоже, что да, своего загрузчика там могло и вообще не быть. Но в точности я не знаю.


          1. lamerAlex
            27.07.2023 12:50

            Посмотрел дистрибутив XP - действительно есть winnt.exe и судя по отказу запускаться действительно досовый или по кр. мере 16-битный. Вы правы.


            1. MTyrz
              27.07.2023 12:50

              Ну, ХР — это уже чертовски поздняя штука, смартдрайв ей точно не был нужен (а вот насчет 2к, кстати, меня берут некоторые сомнения), и она точно умела грузиться с собственного диска. Хотя могла и пытаться обновлять 9х: скорее всего, winnt.exe там для этого.


              1. mvv-rus
                27.07.2023 12:50

                Загрузка в XP/2K3 Server (в том числе и при первой инсталляции) была практически без изменений перенесена из исходной версии (с ntldr и boot.ini с его ARC-путями).
                Изменение загрузчика произошло при переходе на Vista/2K8 Server.


              1. K0styan
                27.07.2023 12:50
                +1

                С 2000, насколько помню, такая же история, как с NT 4 была. Во всяком случае с 4 я дела не имел, а предостережение про смартдрайв в памяти сидит)


        1. saboteur_kiev
          27.07.2023 12:50
          +3

          Ой ... Установка NT запускалась из DOS?

          Установка NT могла запуститься из дос и из виндовс.


        1. truthseeker
          27.07.2023 12:50

          Или с Windows NT предыдущих версий с помощью winnt32.exe. В любом случае, чтобы установить Windows NT 4.0, нужно было иметь загрузочную дискету(а тогда она была у всех, кто устанавливал продукцию от MS), или одну из подходящих предыдущих ОС от MS.

          Кстати, установка Windows 9.x тоже запускалась, по сути, из DOS. Или с предыдущей версии Windows 9.x. Емнип, так до самого ME включительно было. Стандартная, по тем временам, практика.


          1. saboteur_kiev
            27.07.2023 12:50

            Или загрузочный CD-rom
            или просто сделать загрузочный HDD с DOS другого HDD - в процессе установки NT оно предлагало конвертнуть файловую систему в NTFS


    1. MountainGoat
      27.07.2023 12:50
      +2

      Зачем вспоминать? С флешками до сих пор всякая муть творится.


      1. net_racoon
        27.07.2023 12:50

        В линуксах да. Отмонтировал флешку и ждешь когда он засинкается. А почему, кстати, нельзя ее монтировать с O_SYNC?


        1. DaemonGloom
          27.07.2023 12:50

          Можно монтировать хоть с sync (будет значительно медленнее работать), хоть с flush (быстрее sync, но медленнее обычного кэширования).
          На windows флешки с ntfs тоже будут работать с кэшем и медленно отключаться (или говорить, что устройство занято и пока извлечь нельзя).


          1. net_racoon
            27.07.2023 12:50

            Ну вот тут непонятно, зачем на флешке кэш? Мы же там данные приложений не храним, а качаем/заливаем файлы. Почему не делать это напрямую?


            1. garwall
              27.07.2023 12:50

              все сложнее. одноплатники часто грузятся с флэшек, лайв-образа с persistent storage тоже дело привычное.


            1. Naves
              27.07.2023 12:50

              Ну вот предположим, что пользователь редактирует документ, расположенный на флешке через обычный MS Word. Редактор при работе создает временный файл в каталоге с документом, и вот вдруг, мы уже там данные приложений храним.

              Пользовательский опыт, он такой.


      1. domix32
        27.07.2023 12:50

        Не сказать что я ими шибко часто пользуюсь, но за 15 лет их использования проблем с ними было пересчитать по пальцам. Во времена XP пару раз SD флешка вайпалась из-за неизвлеченности устройства, но с появлением семёрки у меня только одна бракованная флешка отъехала, остальные пусть медленно, но работали без проблем.


  1. Zara6502
    27.07.2023 12:50
    +9

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

    я о кешировании записи узнал в 1992 году на компьютере Искра 1030, чуть позже меня научили писать в NC по F2 команду сброса кеша smartdrv перед выключением ПК. А в нулевых мы вырубали кеш для флешек в Линуксе, ну не нравилось нам сидеть ждать когда данные запишутся после размонтирования тома.

    как может человек знать линукс на уровне глубже двойного клика по ярлыку и не знать про кеширование записи?


    1. poxvuibr
      27.07.2023 12:50
      +10

      как может человек знать линукс на уровне глубже двойного клика по ярлыку и не знать про кеширование записи?

      Это знание приходит после того, как он в первый раз выдёргивает из компа флешку, на которую скопировал файлик гига где-нибудь на 4 )))


      1. GospodinKolhoznik
        27.07.2023 12:50
        +8

        На эту тему есть даже древний анекдот:

        Начальник - секретарю:

        - Катенька, дорогая, перепиши месячную отчетность нашим партнерам, они сейчас к тебе подойдут.

        - Добрый день, это вам переписать oтчетность?

        - Добрый день, да, будьте так любезны, вот чистая дискета, можно на нее.

        - Да, конечно. Вставляет в дисковод. И....

        # mkfs -t vfat -c /dev/fd0h1440

        # mount -t vfat -o iocharset=koi8-r,codepage=866 /dev/fd0 /mnt/floppy

        # find / -noleaf -type f -name Otchet_april. [a-zA-Z] -exec cp '{ }'; /mnt/floppy \;

        # ls -la /mnt/floppy/Otchet_april. [a-z][A-Z] && sync && sleep 3

        - Возьмите пожалуйста!

        Партнеры. - Них..$%#@я себе!!!

        - Что такое?!... Я опять отмонтировать забыла?!


        1. poxvuibr
          27.07.2023 12:50
          +5

          Что такое?!... Я опять отмонтировать забыла?!

          Ничего страшного, sync не забыла, так что нормально всё будет ))


        1. gurux13
          27.07.2023 12:50

          Не, просто мы забыли, на дискете была очень важная информация, но вы же только скопировали на дискету, вы ж её не форматировали, хе-хе?

          А ещё, кажется, точка с запятой в find лишняя, не? Которая после '{}'.


          1. saboteur_kiev
            27.07.2023 12:50

            имхо там вообще кавычки потеряны. С -name все потенциально готово поломаться, поскольку если в текущем катаолге будет два подходящих по маске файла, будет синтакс еррор


      1. K0styan
        27.07.2023 12:50
        +2

        Хорошо раньше было, когда все флэшки со светодиодами были) Объяснить, что не надо выдёргивать, пока не перестанет моргать, обычно очень просто получалось.


  1. Reminded208
    27.07.2023 12:50

    Спасибо за статью. Интересно, отличаются ли подходы записи на диск в разных дистрибутивах?


  1. Wesha
    27.07.2023 12:50
    +3

    Учитывая эту трату, мы лучше выполним одну большую операцию записи на 1 мегабайт, чем сто небольших записей по 10 килобайтов каждая.

    Я сейчас взорву Вам мозг, но, ВНЕЗАПНО, диск не может записать один байт, он может прочитать 1024 байта (а сейчас — 4096, называется — "сектор", минимально адресуемая единица), изменить в них 1, и записать обратно {{1023|4095} старых + 1 новый}, причём уже при следующем обороте диска, потому что пока читали — сектор уже ушёл из-под головки, и надо ждать, пока он там опять появится.


    1. lorc
      27.07.2023 12:50
      +5

      Обычно размер сектора (блока) все же 512 байт.

      На флеш накопителях все еще сложнее, ибо там есть отдельное понятие erase block - минимальный блок который можно стереть. И он может быть вообще недетских размеров - например 256кб. Вот там перезаписать один байт может быть ОЧЕНЬ дорого.


      1. AlB80
        27.07.2023 12:50

        SSD прочитает сектор 4096 байт, запишет его в новый блок и поправит таблицу трансляции.

        Когда в старом блоке неиспользуемое место (стирание TRIMом или перезапись) превысит некий процент или SSD будет остро нуждаться в свободном месте для записи (нужны чистые блоки), то остатки информации с блока будут скопированы в новый и блок уйдёт на стирание.

        Итого: для SSD записать один байт не дороже HDD.
        По времени = чтение+запись сектора.
        По ресурсу = чтение+запись сектора.


        1. Naves
          27.07.2023 12:50

          Нет. Вы просто не сталкивались с ситуацией, когда после некоторого обьема записи данных, скорость SSD резко падает до совсем неприличных значений, и скорость записи SSD становится хуже древних HDD.

          Извините, но вы же сами себе противоречите: пишете про то, что требуются операции на работу с таблицой трансляции, и дефрагментации данных пользовательских секторов во внутренних блоках памяти. Но при этом "для SSD записать один байт не дороже HDD"


      1. saboteur_kiev
        27.07.2023 12:50
        +2

        Обычно размер сектора (блока) все же 512 байт.

        Это было ДО 2011 года. Все производители дисков перешли на 4к сектора. В промежуточном варианте могло быть что на уровне железа еще использовались 512-байтные сектора, но контроллер уже оперировал виртуальными 4к секторами.

        Ну и уже прошло более 10 лет. ВСЕ HDD уже нативно 4к.
        Флеш не знаю, там могут быть эксперименты, но я уверен что только в бОльшую сторону

        и да "сектора (блока)" - не путайте блок и сектор. Блок или кластер - это уровень файловой системы. Сектор - низкоуровневый, туда уже не лазят с тех пор как контроллер переехал с материнки в диск.


        1. DaemonGloom
          27.07.2023 12:50
          +1

          Если вы купите сейчас диск и спросите его о геометрии — то в большинстве случаев вам скажут что-то подобное. И не важно, кто там производитель.
          "Sector size (logical/physical): 512B/512B"
          Впрочем, ничего не скажу по SMR дискам — предпочитаю стандартные.


          1. saboteur_kiev
            27.07.2023 12:50

            Парочка аргументов.

            1. Переход из 512байтных секторов в 4кбайтные сектора позволяют сэкономить примерно 10% дискового пространство только на служебных данных.
              То есть ты просто ничего не делаешь, не упихиваешь плотность магнитной записи, не калибруешь головки чтобы впихнуть еще одну дорожку, просто правишь в прошивке немного софта и получаешь +10% объема на том же диске.
              И вы хотите сказать есть еще производители, которые готовы сказать что их диск меньше чем у конкурентов?

            2. Терабайтные диски это больше чем гигабайтные. В среднем размер одного файла давно вырос до того, чтобы оперировать 4кбайтными блоками было выгоднее, чем 512байтными - это вообще еще в 90е исследования вели. Подавляющее большинство файловых систем давно могло использовать 4к блоки по дефолту, разве что ты специально установишь другой размер. Вдобавок 4к это размер страницы памяти.
              Иметь сектор и кластер разного размера - проблемы с перформансом, а рейтинги дисков со статистикой очень быстро публикуются различными блоггерами. Поэтому сейчас просто глупо не поддерживать AF под дефолту

            3. Прям даже не знаю каким образом вы спрашиваете диск о "Геометрии". Геометрия это IMHO в первую очередь CHS. Возможно вы проверили какой-то древний диск до 2011 года выпуска или проверяли это из старой ОС. Там были варианты которые могли внутри уже быть 4к, а контроллер наружу отдавал 512b для совместимости с WinXP и более старыми ОС.
              AF подерживается начиная с Windows Vista.
              В современных дисках можно смело читать датащит любого производителя. А некоторые все еще могут прямо писать AF или 4k native на наклейке.

              Advanced Format
              Advanced Format

            Кстати в те же времена (в районе 2010-2012 годов) практически у каждого производителя была доступна утилитка типа align (wd_align) и так далее. Вся задача которой была выровнять первый кластер загрузочного диска в соответствии с сектором. Потому что XP, не зная про AF, по дефолту могла создать раздел, начиная его не с кратного сектора. В результате при любом считывании/записи блока, контроллер диска сильно страдал - ему надо было считать два сектора/записать два сектора. Перформанс дико падал.

            Можете навскидку привести хотя бы парочку устройств, выпущенных за последние лет 5, где сектор 512б? Хотел бы убедиться что такое еще существует на массовом рынке.


            1. Naves
              27.07.2023 12:50

              >Можете навскидку привести хотя бы парочку устройств, выпущенных за
              последние лет 5, где сектор 512б? Хотел бы убедиться что такое еще
              существует на массовом рынке.

              Начал шариться по первым попавшимся серверам, HDD-диски да 512/4096
              Но вот есть SSD 512/512 почему и зачем?

              Hidden text
              === START OF INFORMATION SECTION ===
              Device Model:     SAMSUNG MZ7WD480HMHP-00003
              Firmware Version: DXV8003Q
              User Capacity:    480 103 981 056 bytes [480 GB]
              Sector Size:      512 bytes logical/physical
              Rotation Rate:    Solid State Device
              TRIM Command:     Available, deterministic, zeroed
              
              это китайская подделка
              === START OF INFORMATION SECTION ===
              Model Family:     Samsung based SSDs
              Device Model:     Samsung SSD 860 EVO 500GB
              Serial Number:    2022102100219
              Firmware Version: U0625A0
              User Capacity:    500 107 862 016 bytes [500 GB]
              Sector Size:      512 bytes logical/physical
              Rotation Rate:    Solid State Device
              Form Factor:      2.5 inches
              TRIM Command:     Available
              Device is:        In smartctl database [for details use: -P show]
              ATA Version is:   ACS-2 T13/2015-D revision 3
              SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
              Local Time is:    Sat Jul 29 01:19:29 2023 MSK
              SMART support is: Available - device has SMART capability.
              SMART support is: Enabled
              
              это оригинал
              === START OF INFORMATION SECTION ===
              Model Family:     Samsung based SSDs
              Device Model:     Samsung SSD 870 QVO 4TB
              Serial Number:    S5STNF0T205912B
              LU WWN Device Id: 5 002538 f4221d451
              Firmware Version: SVQ02B6Q
              User Capacity:    4 000 787 030 016 bytes [4,00 TB]
              Sector Size:      512 bytes logical/physical
              Rotation Rate:    Solid State Device
              Form Factor:      2.5 inches
              TRIM Command:     Available, deterministic, zeroed
              Device is:        In smartctl database [for details use: -P show]
              ATA Version is:   ACS-4 T13/BSR INCITS 529 revision 5
              SATA Version is:  SATA 3.3, 6.0 Gb/s (current: 6.0 Gb/s)
              Local Time is:    Sat Jul 29 01:20:31 2023 MSK
              SMART support is: Available - device has SMART capability.
              SMART support is: Enabled
              
              
              


              1. saboteur_kiev
                27.07.2023 12:50

                в SSD нет секторов как в hdd.

                Ибо нет намагниченных областей, для которых нужна разметка, gap, crc области.
                Такие вещи, как размер сектора и вообще смысл перехода с 512б на 4к формат в принципе нельзя применять к SSD накопителям, которые дискретны изначально.

                В SSD Есть микросхемы памяти, есть контроллеры этих микросхем. и SSD не может считать байт или кусок микросхемы, он читается целиком. Я сомневаюсь что минимальный размер физического чипа памяти там такой маленький. В современных условиях проще штамповать микросхемы наверное по мегабайту хотя бы, а наружу проецировать логические 512б для совместимости, ибо на перформансе это не сильно отражается. наверное.
                Но про потроха SSD я не готов говорить. Главное - Advanced Format не применим к SSD, там вообще смотреть на факторы влияющие на перформанс надо с другой позиции.


            1. DaemonGloom
              27.07.2023 12:50
              +1

              Хм, согласен, parted врёт. Если спросить smartctl, то система говорит про них "Sector Sizes: 512 bytes logical, 4096 bytes physical". И в описании пишут, что они 512e.
              WD6003FRYZ-01F0D, WD40PURZ, st12000nm001g-2mv103


              1. saboteur_kiev
                27.07.2023 12:50

                WD6003FRYZ - точно 512e (то есть физически 4к, логически поддерживается 512б для совместимости)

                https://documents.westerndigital.com/content/dam/doc-library/en_us/assets/public/western-digital/product/internal-drives/wd-gold/product-brief-wd-gold-hdd.pdf

                WD40PURZ (отсюда взял https://documents.westerndigital.com/content/dam/doc-library/en_us/assets/public/western-digital/product/internal-drives/wd-purple-hdd/product-brief-wd-purple-hdd.pdf)

                Все Purple поддерживают Advanced Format (AF)

                st12000nm001g aka Seagate Enterprise ST12000NM001G:
                Cache 256 MB, Standard Model FastFormat™ (512e/4Kn), 20 Pack, то есть логический 512, нативный 4k (https://icecat.biz/en-sa/p/seagate/st12000nm001g-20pk/enterprise-internal+hard+drives-st12000nm001g-79545808.html)


                1. mvv-rus
                  27.07.2023 12:50

                  Эта совместимость лет 10-15 назад была важна для Windows Server (как сейчас — не в курсе). Потому что движок ESE (транзакционный NoSQL движок БД от MS, сначала он был чисто внутренним, потом его сделали публичным) довольно долго не умел поддерживать сектора размером кроме 512 байт (потому что он старый, делался где-то в середине 90-х), а на этом движке были реализованы многие внутренние БД Windows Server (например, база AD), а также MS Exchange.
                  Так что мне чисто по работе приходилось тогда следить, какие диски закупаются и как конфигурируются.


    1. Naves
      27.07.2023 12:50
      +2

      А какой взрыв мозга начинается, если задуматься над тем, а что будет если выключить электричество именно в момент перезаписи физического сектора на диске.
      А если это SSD, у которого размер сектора на самом деле не 512 и не 4096 байт...


      1. vadimr
        27.07.2023 12:50
        +1

        Энергии в конденсаторах хватит для завершения операции.


      1. N1X
        27.07.2023 12:50
        +1

        А он не перезаписывает сектор, он его переносит в свободный с модификацией нужной части. После завершения - пометит старый, как подлежащий стиранию. Это нужно для выравнивания износа, иначе он в часто используемых местах дырку протрет. Соответственно более менее сносно всё. Но вот алгоритмы работы с флешем у всех производителей свои, и кеши сейчас объёмные, поэтому это тёмный лес, конечно...


      1. OlegZH
        27.07.2023 12:50

        А какой взрыв мозга начинается, если задуматься над тем, а что будет если выключить электричество именно в момент перезаписи физического сектора на диске.

        Подождите. А что делать с необходимостью экстренно парковать головки чтения-записи, при резком обрубании электричества. Раньше писали, что... Я уже и забыл, что именно. Короче! При штатном отключении головки паркуются куда надо. А что происходит при аварийном отключении? Даже и знать не хочется... :-(


        1. nidalee
          27.07.2023 12:50
          +1

          При штатном отключении головки паркуются куда надо. А что происходит при аварийном отключении?
          Тоже самое, ЕМНИП. У них хватает заряда припарковаться.


        1. Wesha
          27.07.2023 12:50
          +6

          что будет если выключить электричество именно в момент перезаписи физического сектора на диске.

          Ничего не будет. В разъёме ATX есть линия PWR_OK ("питание в порядке"). В нормальном рабочем состоянии на нём высокий уровень. При пропадании напряжения в сети уровень переключается на низкий, и все устройства получают команду "мы падаем, всем приготовиться". Винчестеры аварийно сбрасывают свои внутренние кэши на диск — энергии, запасённой коденсаторами блока питания, на это хватает. В крайнем случае у винчестера в расоряжении есть ещё и энергия вращающихся пластин — мотор шпинделя переходит в режим генератора. Когда дело сделано, отключаются электромагниты привода головок, и они под действием пружины сами отходят в парковочную позицию. Так что "партия всё предусмотрела, товарищи, вы полетите ночью" (c).


          1. Tarakanator
            27.07.2023 12:50

            Спасибо, не знал, что всё настолько круто.


            1. Wesha
              27.07.2023 12:50

              не знал

              "Так ведь, Петька, я и постарше тебя буду-то..." (c)


          1. Naves
            27.07.2023 12:50
            +2

            Это все городские легенды. (с)

            1) команду "мы падаем, всем приготовиться"

            а можно ссылочку на такую команду, что она успевает передаться? Совершенно непонятно, кто успевает ее отправить и каким образом.

            Я не спорю есть штатная команда, которая отправляется перед штатным выключением, но не в данном случае.

            2) Винчестеры аварийно сбрасывают свои внутренние кэши на диск — энергии, запасённой коденсаторами блока питания, на это хватает.

            Простите чьего блока питания? Китайского БП на 300 китайских ватт с высохшими конденсаторами? Внутри HDD блок питания условный, там просто стабилизаторы напряжения для рабочих напряжений электроники.

            4) сбрасывают свои внутренние кэши на диск

            кэши дисками не записываются при потере питания. Вам об этом даже в статье написали. Если хотите надежно записать данные на физический носитель, используйте при записи флаг SYNC, тогда данные сразу попадут на физическую ячейку памяти носителя.

            Но некоторые носители при определенных условиях могут игнорировать этот флаг, и сразу рапортовать о том, что записали. Например, так делают SSD c конденсаторами. НО не все SSD имеют конденсаторы, и некоторые SSD без конденсаторов ведут себя, как будто имеют резервный запас энергии, те банально обманывают систему, и в случае сбоя потеряют данные.

            Другой пример, есть RAID контроллеры с батарейкой. Некоторые думают, что это батарейка, для того чтобы диски успели записать данные. Так вот НЕТ. Эта батарейка для питания чипов памяти кэша контроллера. Данные из кеша будут записаны при следующем включении. И если питание не вернется через N-часов, то данные в кеше будут потеряны.

            И вот кстати, именно RAID контроллеры с батарейкой при настройках по умолчании игнорируют флаг SYNC предполагая, что батарея заряжена и работает штатно. Пока внезапно не выяснится, что самопроверка контроллера не выявила, что батарея не сохраняет заявленное количество энергии.

            5) мотор шпинделя переходит в режим генератора

            а можно ссылочку? имхо городская легенда. Если мотор переключить в режим генератора, диски еще быстрее остановятся, а у нас как бы обратная задача - успеть записать данные в режиме, когда скорость дисков уже невозможно поддерживать в штатных пределах.

            Из практики при выключении диска в момент записи, сектор успевается пометится как сбойный и увеличивается счетчик Current Pending Sector Count. При следующем чтении этого сектора, если все ок, то сектор возвращается в работу, а счетчик Pending уменьшается.


            1. Wesha
              27.07.2023 12:50

              а можно ссылочку на такую команду, что она успевает передаться?

              А в чём проблема-то? На всё про всё есть ещё примерно 0,1 секунды — это при 5400 RPM — порядка 90 оборотов шпинделя.

              кто успевает ее отправить и каким образом.

              Гуглите PWR_OK, и будет вам ЩАСТЬЕ. Сказано ж — это отдельная линия в ATX разъёме. Уровень меняется с высокого на низкий — матплата приступает к тушению света.

              Китайского БП на 300 китайских ватт с высохшими конденсаторами?

              С китайского БП все взятки гладки — скажет "ну не шмогла я".

              кэши дисками не записываются при потере питания.

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

              как бы обратная задача - успеть записать данные в режиме, когда скорость дисков уже невозможно поддерживать в штатных пределах.

              А какая разница, штатные там пределы или не штатные? Тут уже аварийная ситуация, поддержание обещанной спецификацией скорости обмена уже никого не волнует. А синхрометки с дисков никуда ведь не делись.


              1. Naves
                27.07.2023 12:50
                +2

                Я в курсе про PWR_OK. Насколько я помню, этот сигнал использовался для проверки готовности к старте системы, и если его коротнуть на землю, то система мгновенна уходила в ребут.

                Hidden text

                В интернете кто-то не прав.

                Давайте зафиксируем предмет спора.

                Те вы утверждаете, что при потере сигнала PWR_OK материнская плата каким-то образом передает сигнал по какой-то шине подключенным устройствам, что-то вроде "я потеряла питание, вы там как-нибудь сами".


              1. Naves
                27.07.2023 12:50
                -1

                >Внутренние кэши драйва — те, которые расположенвы на плате самого винчестера — насколько мне известно, таки записываются

                насколько мне известно, НЕ записываются. Особенно если это обычные потребительские диски, а не диски уровня enterprise.

                Смотрите, какой потрясающий пример.

                https://www.ibm.com/support/pages/disable-cache-best-practice-prevent-cache-data-loss-during-unexpected-power-outage-50-gb-sata-18-inch-non-hot-swap-ssd-ibm-bladecenter-hs22v

                SSD теряет данные из кэша при потере питания. И это не баг в прошивке, как может показаться на первый взгляд.

                This firmware will change the default write cache setting from enable to
                disable on the 50 GB 1.8-inch SATA Non Hot-Swap Solid State Drive.

                В следующей версии просто по умолчанию будет отключен кеш. и все. И нет никаких конденсаторов.


                1. Wesha
                  27.07.2023 12:50
                  +1

                  винчестера

                  SSD теряет данные

                  Вы совсем-совсем никаких несоответствий тут не видите? Точно?


                  1. Naves
                    27.07.2023 12:50

                    Обычные дешевые потребительские SSD не содержат конденсаторов, достаточных для записи из кеша.

                    Если уж SSD не успевает записать данные из кеша, то HDD тем более не сможет.

                    >Вы совсем-совсем никаких несоответствий тут не видите? Точно?

                    Не вижу. Точно.


                    1. Wesha
                      27.07.2023 12:50

                      Если уж SSD не успевает записать данные из кеша,

                      Простите, а в каком конкретно месте у SSD маховичный накопитель энергии?

                      то HDD тем более не сможет.

                      Ну да, конечно, HDD ж нужно стереть десяток окружающих дорожек, чтобы одну перезаписать...


              1. Naves
                27.07.2023 12:50

                >А какая разница, штатные там пределы или не штатные? Тут уже аварийная ситуация, поддержание обещанной спецификацией скорости обмена уже никого не волнует. А синхрометки с дисков никуда ведь не делись.

                Действительно никакой разницы, что головки и управляющий софт, рассчитаны читать и записывать на штатной скорости в определенных отклонениях.
                И теперь вы предлагаете "заинженерить некий алгоритм дозаписи данных" в аварийной ситуации?

                А вам инженеры ответят. Если хотите надежно писать, используйте флаг FUA. Наша задача обеспечить безопасность поверхности диска и головок в аварийной ситуации, а не безопасность ваших данных.

                FUA When set to one forces the data to be written to the storage media before completion status is indicated. When cleared to zero the device may indicate completion status before the data is committed to the media.

                https://sata-io.org/system/files/specifications/SerialATA_Revision_3_1_Gold.pdf


            1. DaemonGloom
              27.07.2023 12:50

              Другой пример, есть RAID контроллеры с батарейкой. Некоторые думают, что это батарейка, для того чтобы диски успели записать данные. Так вот НЕТ. Эта батарейка для питания чипов памяти кэша контроллера. Данные из кеша будут записаны при следующем включении. И если питание не вернется через N-часов, то данные в кеше будут потеряны.

              Чаще это батарейка для записи DRAM кэша во встроенный флэш. Да и ту уже чаще заменяют на ионистор, которого на запись точно хватает. Так что современный контроллер нормального производителя ничего не потеряет даже при долгом отсутствии питания.


            1. saboteur_kiev
              27.07.2023 12:50

              Совершенно непонятно, кто успевает ее отправить и каким образом.

              Проблема парковки головок сейчас отсутствует. Все производители HDD масс сегмента выпускают диски, которые могут нормально запарковаться в случае потери питания.
              Сохранить данные - тут уже вряд ли. В любом случае внутренняя память в дисках чаще служит для ускорения чтения, чем записи, и для записи обычно используется очень и очень кратковременно, на уровне расчета траектории перемещения головок, чтобы использовать параллельную запись, если такое есть


          1. mr_welk
            27.07.2023 12:50

            Когда деревья были большими, такого не было и наблюдать пропилы от головок на пластинах при аварийном отключении приходилось. Правда и диски тогда были с обьёмами по 40 мегабайт :)


            1. Wesha
              27.07.2023 12:50

              Было такое. Эх... "Искра-1030" с MFM-винчестером на то ли 20 мегабайт, то ли на 40, где передвижение блока головок производилось торчащим на всеобщее обозрение шаговиком... и перед отключением питания надо было запускать утилиту принудительной парковки головок...


        1. astenix
          27.07.2023 12:50

          Головки дисков просто падали на пластины, туда, где их застало отключение энергии. На диске появлялись порченные сектора. Сектор за сектором.


          1. Wesha
            27.07.2023 12:50
            +3

            В 1990 году примерно так и было, да.


    1. Tarakanator
      27.07.2023 12:50

        он может прочитать 1024 байта, изменить в них 1, и записать обратно

      С черепичной записью так уже нельзя
      Кроличья нора углубляется.


  1. Dolios
    27.07.2023 12:50
    +1

    Удивитесь ли вы, если я скажу, что запись 1 байта вызывает запись на диск 65 тысяч байтов?

    Нет, мы знаем про сектора. Еще вирусы под DOS умели себя в последнем секторе файла прятать, чему тут удивляться?


  1. ivanstor
    27.07.2023 12:50
    +3

    Главное, что я извлек из этой статьи: у автора, похоже, эпилепсия. Поскольку его постоянно трясет, с каждой новой страницей книги "Linux для полных дебилов".


  1. saboteur_kiev
    27.07.2023 12:50
    +6

    Удивитесь ли вы, если я скажу, что запись 1 байта вызывает запись на диск 65 тысяч байтов?

    Сильно удивлюсь.
    Ибо современный размер сектора - 4 кб, и в нормальной ситуации, запись выполняется по секторам.

    Может быть, из-за того, что у вас было несколько операций записи, которые закешировались на уровне ОС или контроллера диска, и очередная запись 1 байта наконец повлекла запись всей цепочки, но это вы тогда хитрите.

    Если же у вас запись 1 байта на диск провоцирует запись 64к байт, что-то пошло не так. Или кто-то экспериментирует с ssd/флеш дисками - там под капотом могут быть нюансы.

    P.S. Честно говоря, статья разочаровала. О банальных и давно известных вещах пишется во-первых с большим удивлением, во вторых с кучей неточностей и некорректностей, из-за чего новичок только запутается.


    Тот же "файл это интерфейс" - нет, интерфейс это интерфейс, например handler это интерфейс.

    А файл и директория - это термины, которые обозначают определенные сущности на хранителе информации. Та же iNode это тоже не интерфейс, а способ организации posix файловой системы. В других файловых системах могут быть другие способы, FAT, MFT..


    1. poxvuibr
      27.07.2023 12:50

      Ибо современный размер сектора - 4 кб

      Размер кластера в ФС тоже 4 килобайта по умолчанию. Но я, например в последнее время ставлю 64к, потому что на дисках в основном большие файлы. Вот тебе и запись минимум 64к )) . На одном диске вообще два мегабайта размер кластера. Там совсем большие файлы


      1. vadimr
        27.07.2023 12:50

        Кластер – это всего лишь единица распределения дискового пространства. Он не обязан записываться целиком.


      1. domix32
        27.07.2023 12:50

        Так больший размер сектора просто расширяет максимальное количество индексируемых данных. Ну и журнал вроде может поменьше сделать.


        1. saboteur_kiev
          27.07.2023 12:50

          не путайте сектор и кластер


      1. saboteur_kiev
        27.07.2023 12:50

        ну в вашем случае вы же не удивляетесь, вы же специально такой размер выбрали.
        Но насчет больших файлов - вопрос не в размере файла, а в размере операций записи/чтения. Если в этих файлах (например это базы данных) делаются мелкие изменения, то перфоманс вы себе таким образом ухудшили =)
        А вот при линейном копировании/чтении (например онлайн кинотеатр, где нужно тупо линейно читать и писать большие объемы данных) - там большой размер кластера прямая выгода.


  1. NutsUnderline
    27.07.2023 12:50

    начало вроде для совсем начинающих а потом бац, O_SYNC и sync, термины, и открываем файл уже как лютые программисты.


  1. placidity_master
    27.07.2023 12:50
    +1

    Насколько медленные? Получение небольшой порции данных с SSD в тысячу раз медленнее, чем получение её из памяти.

    прям в тысячу ? можно конкретные цифры ?

    смотрю википедию:

    Для памяти с эффективной частотой 3200 МГц (наибольшая частота,
    изначально определённая стандартом) максимальная пропускная способность
    составит 3200 × 8 = 25 600 МБ/c

    https://ru.wikipedia.org/wiki/DDR4_SDRAM

    Например, скорость диска Samsung 970 EVO Plus MZ-V7S250BW 250ГБ, M.2
    2280, PCI-E x4, NVMe (на картинке выше) на чтение – 3500 МБ/с, а на
    запись — 2300 МБ/с.

    https://selectel.ru/blog/ssd-m2-nvme/



    1. saboteur_kiev
      27.07.2023 12:50

      Это автор вообще не пытался работать с SSD и памятью. Кроме памяти есть еще пропускная способность шины, а там может выясниться что все совсем уже и не так радужно.

      Вдобавок, если брать не просто работу с памятью, а работу с каким-нить рамдиском, то его производительность вполне сопоставима с PCI-E NVMe, причем настолько сопоставима, что я отказался от использования рамдисков еще лет 5 назад.


      1. poxvuibr
        27.07.2023 12:50

        Вдобавок, если брать не просто работу с памятью, а работу с каким-нить рамдиском, то его производительность вполне сопоставима с PCI-E NVMe

        Возможно, если воткнуть nvme в слот, который находится "близко" к процессору, то скорость будет как-то сопоставима, но на чисто эмоциональном уровне я не верю )))

        К тому же tmpfs не использует кеш о котором столько сказано в тексте статьи, а значит в должна быть побыстрее хотя бы формально.

        И наконец, интесивная работа в tmpfs не истощает ресурс ssd ))

        Хотя, конечно, было бы неплохо проверить, какая там разница по скорости будет, я только не уверен как это сделать. Могу ядро скомпилировать, но не уверен, что это показательно


  1. voldemar_d
    27.07.2023 12:50

    А что, к Windows и другим ОС всё перечисленное не относится? Так с дисками только Linux работает?


    1. Wesha
      27.07.2023 12:50

      Относится — просто от Windows никто великих свершений и не ожидает :)


      1. mvv-rus
        27.07.2023 12:50

        Ну, или все знают, что Windows просто работает, а как именно — это вам знать не обязательно :-)


        1. toxicdream
          27.07.2023 12:50

          Знать не обязательно и вы не узнаете - это про МакОС. И когда сломается - сами ничего не сможете сделать.

          В Windows если что-то поломается, у пользователя появляется шанс узнать как это можно починить и возможно стать немного умнее.


  1. 0Bannon
    27.07.2023 12:50

    Спасибо. Наконец-то я понял что такое inode, зачем буфер нужен и многое другое. Вот что значит простым языком и примерами объяснить сложные вещи. А то сколько ни читал книжки и всякие статьи - всё заумным языком объясняется.


    1. saboteur_kiev
      27.07.2023 12:50
      +2

      вы поняли неправильно. Автор сам неглубоко вник в суть вопроса, и что такое iNode пояснил некорректно.

      iNode это просто метаинформация о записи в файловой системе, которая относится к конкретному файлу/директории или другой сущности файловой системы.

      В винде для таких целей есть тот же MFS и directory entry там содержит больше данных. в FAT использовались directory entry и file allocation table.

      Это просто потроха файловых систем, где хранятся данные о структуре и различных аттрибутах.

      В любом линуксе пиши
      stat <path>
      и тебе выдаст почти все что находится в конкретной iNode


      1. mvv-rus
        27.07.2023 12:50

        В винде для таких целей есть тот же MFS и directory entry

        В NTFS аналогом iNode является запись в MFT (Master File Table, полагаю, что у вас тут просто была описка). В элементе же каталога (directory entry) содержится ссылка на эту запись MFT для файла: в NTFS может быть несколько ссылок на один файл (то, что в Unix называется hardlink) по разным путям. В FAT ссылка всегда только одна, по единственному пути, информация о файле, включая первый назначенный ему кластер, содержится именно в элементе каталога по пути файла, а в FAT — односвязный список кластеров, назначенных файлу.


      1. Wesha
        27.07.2023 12:50
        +1

        iNode это просто метаинформация о записи в файловой системе

        Чтоб далеко не ходить
        struct inode {
                struct hlist_node       i_hash;              /* hash list */
                struct list_head        i_list;              /* list of inodes */
                struct list_head        i_dentry;            /* list of dentries */
                unsigned long           i_ino;               /* inode number */
                atomic_t                i_count;             /* reference counter */
                umode_t                 i_mode;              /* access permissions */
                unsigned int            i_nlink;             /* number of hard links */
                uid_t                   i_uid;               /* user id of owner */
                gid_t                   i_gid;               /* group id of owner */
                kdev_t                  i_rdev;              /* real device node */
                loff_t                  i_size;              /* file size in bytes */
                struct timespec         i_atime;             /* last access time */
                struct timespec         i_mtime;             /* last modify time */
                struct timespec         i_ctime;             /* last change time */
                unsigned int            i_blkbits;           /* block size in bits */
                unsigned long           i_blksize;           /* block size in bytes */
                unsigned long           i_version;           /* version number */
                unsigned long           i_blocks;            /* file size in blocks */
                unsigned short          i_bytes;             /* bytes consumed */
                spinlock_t              i_lock;              /* spinlock */
                struct rw_semaphore     i_alloc_sem;         /* nests inside of i_sem */
                struct semaphore        i_sem;               /* inode semaphore */
                struct inode_operations *i_op;               /* inode ops table */
                struct file_operations  *i_fop;              /* default inode ops */
                struct super_block      *i_sb;               /* associated superblock */
                struct file_lock        *i_flock;            /* file lock list */
                struct address_space    *i_mapping;          /* associated mapping */
                struct address_space    i_data;              /* mapping for device */
                struct dquot            *i_dquot[MAXQUOTAS]; /* disk quotas for inode */
                struct list_head        i_devices;           /* list of block devices */
                struct pipe_inode_info  *i_pipe;             /* pipe information */
                struct block_device     *i_bdev;             /* block device driver */
                unsigned long           i_dnotify_mask;      /* directory notify mask */
                struct dnotify_struct   *i_dnotify;          /* dnotify */
                unsigned long           i_state;             /* state flags */
                unsigned long           dirtied_when;        /* first dirtying time */
                unsigned int            i_flags;             /* filesystem flags */
                unsigned char           i_sock;              /* is this a socket? */
                atomic_t                i_writecount;        /* count of writers */
                void                    *i_security;         /* security module */
                __u32                   i_generation;        /* inode version number */
                union {
                        void            *generic_ip;         /* filesystem-specific info */
                } u;
        };