Ответы пользователя по тегу Файловые системы
  • Почему некорректно работает квота на папку?

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

    в каталоге \users размещаются профили пользователей windows, там символические ссылки используются активно, удалить их нельзя
    Ответ написан
    Комментировать
  • Как проверить наличие слова в файле txt (fs)?

    @rPman
    Что значит сверять, давать ответ есть/нет? слово это строка с любыми символами (пробелы, знаки препинания) или набор букв на каком то языке с игнорированием регистра и вспомогательных символов (встречаются в других языках), а кодировка у файла?

    Если просто строка без учета всего иного, то читаешь файл в память fs.readFileSync(filePath, 'utf8'); где utf8 - ожидаемая кодировка файла. Наличие слова в этой строке можно простым регулярным выражением new RegExp(`\\b${targetWord}\\b`, 'gi') и методом regexp.test(строка_с_содержимым_файла). Соответственно fs подключить require('fs').

    Если пользователь будет вводить что угодно (а не слово, например символы \ которые часть регулярного выражения), то можно ограничить его ввод дополнительным регулярным выражением, проверяя и ругаясь соответственно.
    Ответ написан
    Комментировать
  • Как создавать файл блокировки на диске?

    @rPman
    При открытии файла fopen с режимом "x" если файл существует - будет возвращена ошибка.

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

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

    На самом деле тут несколько проблем, каждая из которых решается разными способами:
    * сбои в железе, т.е. буквально смерть диска или флешки (нельзя на них работать, никак нельзя), в частых случаях это решают резервированием, спасибо для дисков существует RAID5, когда за счет добавление 1 диска к массиву (начиная с 3 дисков до 32 шт) обеспечивает работоспособность при потере любого 1 диска, а при добавлении 2-ух дисков, соответственно переживает потерю любых двух дисков.
    * сбои в электропитании - качественный бесперебойник и настройка на автоматическое сохранение работы. Система резервного электропитания - отдельный большой разговор и дешевым это не будет, в зависимости от того, какие бывают сбои, может оказаться что единственный вариант - дорогой online ups + дизельный генератор.
    Для рабочих windows и иногда и linux можно настроить hibernation по сигналу с UPS, это как минимум спасет не только файловую систему но и не сохраненную работу.
    Так же есть механизмы у систем виртуализации, если гостевая операционная система не умеет hibernation, то это сможет сделать сервер виртуальной машины (кажется любой)
    * сбои в софте и кривые руки пользователя - самый интересный сбой, когда по ошибке одним движением пользователь уничтожает важные данные, ошибка конфигурации отправляет базу в ноль или безвозвратно портит данные. На это тоже есть два решения, в обычном случае это регулярные бакапы, причем если есть база данных то можно сделать очень оперативный инкрементальный бакап прямо средствами БД (что то типа прерванной репликации например) и регулярные снапшоты (как еще одна форма бакапа, только не покидающая машину).
    И вот тут выбор файловой системы может сильно помочь, например cow fs типа btrfs или zfs умеют делать снапшоты бесплатно, без деградации скорости работы (до этого был lvm но его снапшоты кратно! замедляли запись, пока снапшот не удалишь), у windows ntfs тоже есть shadow copy но там какие то особенности есть, не делающие это чистым снапшотом, т.е. пользовательские файлы так резервируются а система не всегда, ну через нее делают бакап перед установкой обновлений.
    Можно настроить буквально поминутные снапшоты с удалением тех что старее часа/суток/... и фоновым переносом их на бакап сервер, т.е. это сочетание системы резервного регулярного и оперативного копирования
    Ответ написан
    Комментировать
  • Что почитать про диски (HDD, SSD) и файловые системы, желательно какое-то системное описание?

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

    1. Случайный и многопоточный доступ - принципиальная необходимость задумываться об этом исходит из физической особенности накопителей, последовательный доступ от случайного (имеется в виду как у hdd так и у ssd (в меньшей степени, зависит от размера читаемого блока кластера, потребительскиее ssd это 256кб) значительно отличаются (на порядок или даже два) по времени. Аппаратные контроллеры на материнской плате и даже на диске (или драйвера и планировщик ос) могут физически считывать данных больше чем потребуется (read ahead), делая это фоном, после запроса и сохраняя в своей памяти.
    Если несколько приложений одновременно потребуют данные с разных областей устройства хранения, специальный планировщик ос может приостанавливать работу этих приложений, собирая как можно больше запросов на данные, сортируя их для оптимальной их обработки. Пользовательское приложение может делать это значительно эффективнее, если заранее озаботится о том, как именно данные будут храниться на диске (обычно речь идет о хранении данных минуя файловую систему).

    2. Кеширование чтения - в подавляющем большинстве случаев хватает функционала операционной системы, операционные системы используют разные стратегии (fifo или к примеру на основе частоты запросов), системные вызовы ОС позволяют управлять стратегией кеширования, в т.ч. полное ее отключение (это может быть недоступно для некоторых файловых систем, например fuse в linux, если об этом не позаботился их разработчик), с целью перенести логику выбора кеширования данных в приложение.

    3. Кеширование (буферизирование) записи - приложение может управлять, стоит ли ждать окончания физической записи данных на диск или это можно сделать фоном или даже отложить на потом. Например fflush позволяет принудительно сбросить буфера при использовании fwrite (и других от stdlib), более низкоуровневые вызовы позволяют точнее управлять процессом. Помимо инструментов управления кешированием на уровне приложения есть способы настроить это на уровне ОС (например ext4 позволяет настроить стратегию записи data=writeback, это делает файловую систему уязвимой к сбоям но значительно ускоряет запись, так как даже fflush из приложения не будет ждать окончательной записи), так же разные сетевые файловые системы могут накладывать дополнительные ограничения (точно помню что nfs обрабатывает fwrite по другому в отличии от локальных записей, делая больше лишних действий на диске)

    p.s. про mmap, меанизмы ОС (как linux так и windows) позволяет вместо работы с файлом по кусочкам (fopen/fread/fwrite/...) 'замапить' указанный файл или даже раздел/диск на область памяти, при доступе к которой прозрачно будут совершаться чтения и записи на диск. Этот способ работы с файлами зачастую самый производительный (кстати по умолчанию используются на исполняемый файл приложения и .dll/.so) и очень часто еще и удобнее, так как кеширование данных будет произведено средствами ос, и при повторном запуске приложения данные уже будут в памяти (при обычном fopen их пришлось бы считывать в память, т.е. копировать что дает 2x накладные расходы на процессор).

    -------------

    4. Файловые системы это уровень абстракций ОС, значительно добавляет накладные расходы на работу с данными но за счет удобства (например возможность расширить хранилище без полного копирования данных, просто увеличив размер раздела или добавив новый накопитель, как это позволяют файловые системы - комбаины типа btrfs/zfs), разные файловые системы организуют хранение по разному, что значительно влияет на скорость как записи так и чтения.
    Например cow файловые системы (xfs/zfs/btrfs) каждое последующую запись делают последовательно, даже если записываемые чанки/кластеры принадлежат разным файлам, даже если это модификация а не добавление в конец, что благосклонно сказывается на скорость записи но отвратительно фрагментирует размещение файлов на диске (там есть механизмы борьбы с этим), т.е. для хранилище файлов разного размера, считываемых/изменяемых целиком такие файловые системы идеальны, но для баз данных наоборот очень неэффективны (в таких фс можно принудительно отключить cow для определенных файлов). btrfs/zfs за эти накладные расходы (незначительные) дают бонусом функционал быстрых снапшотов (почитай про btrfs snapshot incremental backup) и высокую устойчивость к сбоям.
    Еще пример, файловые системы, с целью защитить данные от сбоев, добавили к функционалу понятие журнал, промежуточное место, куда записываются данные (метаданные) до тех пор пока приложение не зафиксирует изменения (закрытие файла или fflush), в нормальных ОС существует возможность разместить этот журнал на отдельном, более быстром, накопителе (например ext3/ext4) или отключить полностью. Это позволяет заметно ускорить запись и не покупать на весь объем данных быстрый и дорогой накопитель.
    Было время, когда можно было буквально (кажется у xfs но я могу ошибаться) указать разные накопители для метаданных (информация о том как файл размещен на диске и информация о атрибутах файлов) и самих данных, что тоже в условиях значительного отличия скорости работы емких hdd и быстрых но не емких ssd, сэкономить на построении хранилища.

    5. Сжатие данных на лету - некоторые файловые системы позволяют прозрачно для приложений пропускать данные через библиотеку сжатия (в пределах кластера или даже нескольких соседних), например ntfs использует compress, а btrfs позволяет выбирать, например zstd (один из лучших по соотношений скорость/сжатие), было время когда включение сжатия на медленных накопителях давала двух-трех кратное ускорение скорости чтения практически бесплатно (а запись почти не замедлялась но повышалась нагрузка на процессор), на современных же накопителях процессор может не поспевать (но есть дорогие контроллеры с таким функционалом).
    Еще есть тип сжатия - sparse files (дырявые файлы), части файла, в которые не производилась запись, физически не занимают место (фактически тратится место только крохотная часть в области метаданных файловой системы), при чтении таких частей будут возвращены нули, так же есть функции по замене ранее записанных частей файла на такие дырки. Такие файлы могут понадобиться, например, когда нужно хранить огромные разряженные матрицы с индексацией по позиции, индекс тут будет использоваться от файловой системы но выигрыш по производительности сомнителен и требует измерений под ваши данные.

    p.s. любая сторонняя библиотека, добавляющая еще один уровень абстракции к хранилищу, может дать выигрыш только если стратегия работы с данными совпадает с той, на что заточена эта библиотека. Например реляционные базы данных дают готовый и обширный функционал по индексированию данных, многопользовательских транзакций но за счет больших накладных расходов на их поддержание. Помню был тут вопрос про хранение терабайтов данных числовой ключ -> крохотное значение (несколько байтов хеш), так вот майкрософтовская sql уже с миллионами записей могла до секунды на запись диском шерстить (тысячи iops), когда как самодельный и примитивный велосипед с одноуровневым индексом по хешу от значения мог дать скорость доступа и записи 1к1 iops накопителя (от 1 вызов к диску на запрос чтения и от 2 - на запись).
    Ответ написан
    9 комментариев
  • Как хранятся данные на диске?

    @rPman
    Вы зачем свою ОС пишете? чтобы научиться? Пилите свою файловую систему, по проще.
    Файловая система это способ хранения файлов и информации о них (например имя и место размещения на диске).

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

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

    Написать ОС это значит написать минимально ядро и тулчейн по работе с ресурсами (процессы и файловые системы), например утилита по проверке и ремонту сломанной файловой системы или к примеру для дефрагментации - утилита исправляющая недостаток механизма хранения файлов на основе кластеров, когда один файл может быть раскидан по диску, что замедляет работу с ним.
    Ответ написан
    Комментировать
  • Как у python сохранить дание у файл котрий не сможет открить пользователь?

    @rPman
    Защищать данные локально можно только средствами ОС (например права доступа, запускать приложение от прав соответствующего пользователя), это достаточно успешно реализовано на android/macos, для получения доступа к данным там понадобится рут/взлом загрузчика, что сразу уменьшает список таких пользователей на пару порядков

    Полностью защитить локальные данные от получения к ним доступа невозможно, можно только усложнить - увеличить стоимость взлома (например обфускация алгоритмов и ключей шифрования критичных данных) и делать это лучше не на python (инструменты обфускации заточены обычно на c/c++)
    Ответ написан
    Комментировать
  • Как можно создать и редактировать файл VMDK в Python?

    @rPman
    у тебя 2 задачи:
    1. работа с файловой системой в raw образе (инструментарий зависит от выбранного типа файловой системы fat/ntfs/iso/ext4/...)
    2. конвертация raw образа в vmdk

    с этим справится утилита qemu-img из проекта qemu
    qemu-img create -f raw image.img 4G 
    # тут можно смонтировать файловую систему в linux с помощью mount
    qemu-img convert -f raw image.img -O image.vmdk
    # а тут в windows с помощью diskpart

    либо от virtualbox - VBoxManage

    нет нужды делать все самому, создаешь монтируешь

    python у тебя тут исключительно как инструмент запуска внешних команд
    Ответ написан
    1 комментарий
  • Форматирование смонтированного диска?

    @rPman
    Штатно операционная система не даст офторматировать файловую систему, если она примонтирована, но это не значит что ты не можешь в принципе что то туда записаь, root доступ это позволяет.

    Например можно проделать с помощью виртуализации, если диск передать как устройство внутрь файловой системы и уже из нее провести форматирование

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

    При монтировании в режиме только для чтения, проблем с отформатированным диском не будет, но чтение с этого диска начнет выдавать ошибки

    p.s. одновременно смонтированный на запись диск из хост и гостевой системы при использовании описанной схемой монтрования с помощью виртуализации, с очень высокими шансами повреждает структуры файловой системы и даже данные, в которые велась запись
    В одном моем конфиге был момент, когда внутри виртуальной машины использовался системный диск и если не успеть выбрать правильную ос, получалась одновременная загрузка одной и той же системы на хосте и в гостевой машине, данные на диске повреждались во всех случаях (потерялись даные mysql базы используемой какими то системными утилитами), это был 'временный конфиг' и даже тут успел напортачить, позже само собой для виртуалки был настроен отдельный grub, кстати совет, не размещать windows по соседству с linux, с очередным обновлением с высокой вероятностью приезжает что то ломающее загрузчик
    Ответ написан
    Комментировать
  • Чем объединить разнобойные диски с репликацией данных?

    @rPman
    Самый удобный инструмент для решения этой задачи - btrfs, в нем есть нативная поддержка raid, нет дополнительного оверхеда инициализации и позволяет проводить операции с файловой системой на лету

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

    зеркало же на btrfs создавать относительно надежно.

    По теме вопроса, в похожей ситуации, я предварительно вручную составил план размещения данных на дисках (у меня были очень разные размеры от 350гб до 1тб, примерно 6 дисков), затем большего размера диски разбил на разделы, некоторые из которых были точно под размер маленьких дисков, и объединяя где диск целиком, где раздел, собрал все в несколько отдельных файловых систем. Очень важно сохранить карту дисков (удобно разрисуй в документе с картинками), какая файловая система какой диск и пометить физически жесткие диски символами, чтоб замена вышедших из строя была по проще.

    Сейчас у меня такого зоопарка нет, массив собираю на основе 3тб дисков, но все равно добавляю их не целиком, а поделив их емкость на 3 части и сделав несколько файловых систем (по 1тб так чтобы можно было добавить к примеру 1тб диск или наоборот, добавить к массиву 4тб диск не пересобирая весь массив), так же я отказался от raid5 btrfs, использую mdadm, но это больше ради перестраховки
    Ответ написан
    2 комментария
  • Что нужно модифицировать в Linux системе что бы время модификации\получения доступа к файлу заменялось каждый раз на случайное, вместо реального?

    @rPman
    Менять libc, или сразу ядро. Чуть проще драйвер файловой системы, самое простое запилить fuse прослойку, это пользовательский драйвер файловой системы в юзерспейсе.
    Ответ написан
    Комментировать
  • Какую файловую систему выбрать для жёсткого диска?

    @rPman
    большие файлы, линейное и редкое чтение - пойдет любая простая файловая система, начиная с ext4

    Я бы рекомендовал zfs и btrfs, но это системы для других задач, где нужны такие фишки как снапшоты без деградации производительности, дедупликация (кстати у btrfs ее не просто получить), сжатие на лету, удобный бакап или к примеру трансляция снапшота на другую машину по сети и куча мелочей... и главное, они не рекомендованы к использованию так как не достаточно стабильны!

    p.s. надежно это не про один диск, особенно если дешевые диски, к примеру за последние несколько лет из шести дисков (в основном самые дешевые 3тб тошиба и wd) три были поменяны по гарантии, и один диск вот стучит головками (полагаю проблема логического характера так как смарт странные вещи выдает)

    это значит что? правильно, пользуйтесь raid1 или raid5/6 т.е. нужно больше дисков, чтобы смерть одного диска не тянула за собой потерю данных и трату времени на их восстановление
    Ответ написан
    Комментировать
  • Как лучше реализовать работу с файлами?

    @rPman
    Храните файлы в сети (для медленных сетей и больших файлов у microsoft есть штатная синхронизация файлов локально, кажется даже работает без домена), либо воспользуйтесь сторонними инструментами синхронизации, настоятельно рекомендую что то типа syncting, самый бесплатный способ организации распределенного хранилища без знаний (есть лучше и надежнее но там нужны знания).

    Открывать файлы из браузера можно, но не всегда это будет правильно работать! попробуйте на своих проектах, ссылка должна выглядеть так: file:///c:/temp/
    Но будьте осторожны, это все равно с 99% вероятностью загрузка файла (зависит от того что и как зарегистрировано на его открытие в браузере).

    Если это ваше окружение (т.е. вы можете контролировать что устанавливать на машины пользователей) то напишите простейшее приложение (десктопное) запускаемое в виде сервиса или из автозапуска и подключающееся к серверу с идентификатором пользователя (не обязательно, если достаточно локального ip адреса), ожидающее команды на открытие файла и исполняющее что то типа start имя файла или explorer имя файла (например на php cli это 4 строчки кода). Тогда вы сможете делать ссылки, которые будут говорить серверу послать команду соответствующему сервису по управлению файлами пользователя на открытие файла. Этим же сервисом можно собирать данные о локальных файлах, если не хотите управлять ими централизовано.
    Ответ написан
    Комментировать
  • Насколько сильно LVM может тормозить работу PostgreSQL?

    @rPman
    у LVM сильные просадки скорости записи при использовании снапшотов, каждый новый уменьшает скорость почти в два раза.
    Ответ написан
    Комментировать
  • Права и владелец у SSHFS?

    @rPman
    у samba выше 3 точно есть механизмы маппинга пользователей windows на права unix, даже работает штатный windows-редактор прав в свойствах каталога.
    Ответ написан
    Комментировать