Перемещение файла между двумя дисками на одном SSD - будет ли оно скопировано?

18

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

Итак, мой вопрос: что происходит, когда файл перемещается с одного диска на другой на одном и том же SSD, копируются ли байты и удаляются ли исходные данные, или обновляется какая-то таблица, тем самым уменьшая количество SSD?

Там уже дубликат вопрос здесь . Но оба ответа утверждают:

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

и

Разделение жесткого диска фактически обозначает физические области для каждого раздела. [и в комментарии:] SSD - все еще жесткий диск, у него просто нет диска.

Насколько я знаю, это неправильно. Смотрите здесь .

Так, скажет ли мне кто-то, кто знает больше о твердотельных накопителях, если они верны в своих оценках, несмотря на свою ошибку?

ispiro
источник
14
Принятый ответ там прав: у каждого раздела есть своя, независимая файловая система. Каждая файловая система сама решает, как она использует назначенные ей блоки. Чтобы сделать то, что вы предлагаете, прошивка SSD, файловая система (ы) и инструменты пользовательского пространства, такие как Linux mv, должны будут взаимодействовать, сильно смешивая слои абстракции.
Камиль Мачоровский
2
@ Камил: Если бы ОС реализовала это, на mvсамом деле нужно было бы делать меньше, чем сейчас, я подозреваю. (То есть ОС просто нужно убедиться, что кросс-файловая система rename () будет
успешной, а не ошибочной,
16
«2 диска на [SSD / HDD]» - я думаю, вы хотите сказать, 2 файловые системы или 2 раздела на одном SSD / HDD. Помните, что последняя буква «D» в обоих акронимах - «Drive», так что вы говорите «2 диска в 1», что не имеет смысла.
JoL
1
Возьмем, к примеру, диалог управления дисками. Это говорит Change Drive Letter and Pathsпри обращении к разделу / тому.
Испиро
4
@ispiro Это на Windows? Похоже, ужасный способ запутать пользователей. Я могу только догадываться, что они придумали термин «Буква диска» до того, как разделы диска были реализованы, а затем они представили разделы диска как отдельные «диски». Так что теперь вы можете иметь несколько «дисков» Windows, представляющих разделы одного аппаратного диска ...
JoL

Ответы:

38

Насколько я знаю, это неправильно

Приведенное описание наполовину правильно, наполовину неправильно. Но это также наполовину неправильно для жестких дисков.

Разделение диска обозначает логические области для каждого раздела. ОС вообще не заботится о физическом расположении - она ​​просто просит диск «прочитать логический блок # 31415926», и сам диск решает, где находятся данные. Это работает одинаково для магнитной и флэш-памяти.

Это на самом деле то же самое, что и с жесткими дисками за последние 20–25 лет: хотя в ранних операционных системах использовались места расположения физических цилиндров / головок / секторов, этого уже давно нет. Вы не знаете точно, где на каком блюде находится LBA # 1234. Жесткие диски даже автоматически перераспределяют поврежденные физические сектора, поэтому один и тот же LBA может внезапно считываться из совершенно другой физической области - как и в случае с твердотельными накопителями.

Таким образом, как с жесткими дисками, так и с твердотельными накопителями, ОС просто имеет диапазон LBA (например, 0–999999) для чтения и записи данных. Цель разделения состоит в том, чтобы выделить в нем поддиапазоны - например, раздел A получает 10–499999, раздел B получает 500000–999999. Каждый раздел имеет независимую файловую систему, и файловые системы внутри каждого раздела не могут ссылаться на данные вне его - они не могут пересекать границы раздела. (Например, раздел А не может иметь файл, данные которого хранятся в секторе # 600000.)

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

(Тем не менее, теоретически ОС может попросить сам диск скопировать данные из одной области в другую (например, «скопировать LBA # 1234 в # 567890»), не копируя их в основную память, а затем обратно, и, конечно, это могло бы полностью обойти границы раздела. Это могло бы использовать, например, «слой флэш-трансляции» SSD. Но на практике, насколько я знаю, это не делается.)

user1686
источник
Я полагаю, вы правы. Однако обратите внимание, что есть еще один вариант. Накопитель может решить, что сектор № 001 на накопителе № 1 теперь будет переключаться с сектором № 123 на накопителе № 2 (т.е. сектор № 001 на накопителе № 1 теперь будет ссылаться на физические данные, которые раньше назывались сектором № 123 в диск № 2) тем самым перемещая файл без необходимости копировать байты. Таким образом , перемещение Тб данных может быть в принципе почти мгновенно.
Испиро
15
Накопитель не знает о файлах или файловых системах и поэтому не может самостоятельно принимать такие решения. Для этого нужно получить запрос от ОС. Как я уже упоминал в последнем абзаце, это, безусловно, технически возможно, но операционные системы обычно не беспокоятся об этом для копий с несколькими файловыми системами, и я сомневаюсь, что они также действуют и для копий с той же файловой системой (чаще это делается на уровне FS).
user1686
6
Некоторые твердотельные накопители реализуют дедупликацию на уровне блоков. Например, Sandforce ( en.wikipedia.org/wiki/SandForce#Technology ) были одними из первых, кто реализовал это, и их контроллеры попали в продукты нескольких производителей SSD. Контроллеры Sandforce имели коэффициент усиления записи менее единицы, что означает, что они записывали на флэш-память меньше данных, чем то, что ОС отправляла на диск. Для сравнения, твердотельные накопители обычно имеют коэффициент усиления записи больше единицы.
Ходжусарам
2
@hojusaram: Да, но дедупликация по-прежнему остается прежней - сокращение объема флэш-записи, но данные по-прежнему считываются, копируются с диска в память ОС и затем обратно на контроллер диска. То, что имел в виду ispiro, я думаю, это SSD-эквивалент «reflink» или «copy on write» (например, cp --reflink), который ОС может явно просить диск выполнить самостоятельно.
user1686
1
Было бы интересно узнать, как APFS справляется с этим, поскольку границы разделов больше не являются фиксированными, они могут изменяться без вмешательства пользователя.
Тецудзин
9

То, что происходит, когда данные записываются на твердотельный диск, достойно нескольких статей (хорошее резюме здесь ), потому что это очень сложно и зависит от базовой технологии. Короткая история заключается в том, что твердотельные накопители вообще не могут записать нулевые биты в память. Вместо этого они должны обнулить (стереть) целый раздел памяти, а затем они могут хранить данные после этого, просто записывая их в него. Как правило, в наши дни они записывают блоки по 512 байт, но стирают страницу из 8 блоков, что составляет 4096. Это и тот факт, что каждый цикл записи / стирания вызывает некоторый физический износ памяти, а память со временем изнашивается, делают SSD очень разными чем вращающиеся магнитные жесткие диски.

Кроме этого, диски SATA (и диски AFAIK SAS) не реализуют встроенную команду для копирования данных из одного сектора в другой. (Или, по крайней мере, в спецификации SATA или SAS этого не требуется, поэтому ОС не может рассчитывать на то, что такая команда будет доступна.) Таким образом, при копировании файла через раздел будет происходить считывание данных из одного сектора диска в память хоста, а затем запись это обратно на диск в другом секторе.

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

Кроме того, файловая система (HFS +, NTFS, ext3 и т. Д.) Представляет собой набор структур данных, которые устанавливают порядок в наборе логических блоков. Эти структуры данных реализуют «файлы», «имена файлов», «каталоги», «разрешения» и т. Д. Итак, да, когда вы перемещаете файл из одного каталога в другой, он не копируется; обновляются только данные файловой системы, указывающие, в каком каталоге находится файл.

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

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

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

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

Внутри SSD это немного другая история. Хотя операционная система не сообщает накопителю, что копирует данные из одного места в другое, запись на твердотельные накопители настолько дорога (и сложна), что контроллеры твердотельных накопителей выполняют большую работу, чтобы минимизировать объемы записи. Некоторые SSD пытаются обнаружить, когда сектор, записываемый в хранилище, соответствует уже сохраненному сектору, и пометить этот физический фрагмент памяти как теперь отображающийся на 2 различных логических секторах, а не копировать его, делая на уровне внутреннего диска то, что ОС не смогла.

Но не рассчитывай на это.

Старый Про
источник
1
Разве ваш последний абзац не подразумевает, что файловая система должна быть такой же? Я бы предположил, что SSD не знает, какая файловая система работает на вершине. Если, например, один раздел использует сжатие, а другой - нет, копия SSD может повредить файл.
Blablabla
@blablabla В последнем параграфе предполагается, что обе файловые системы хранят фактическое содержимое файла на диске без изменений. Я сделал это прямо сейчас.
Старый Pro