Запишите тот же файл многократно в один файл с помощью dd

Существует компонент в ядре (названный виртуальной файловой системой или VFS, если коротко), который предоставляет универсальный интерфейс всем файловым системам. Это понимает вещи как типы файлов (регулярные файлы, каталоги, символьные ссылки, …), метаданные (времена, полномочия, …) и содержание файла.

Каждый процесс Linux живет в пространстве имен, которое указывает, где файловые системы смонтированы. Часто все процессы живут в том же пространстве имен; пространства имен главным образом предназначаются для поддержки виртуализации. Пространство имен является по существу набором путей с внутренней ссылкой файловой системы, связанной с каждым путем. Монтирование и размонтирование состоят из изменения того пространства имен.

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

Это - задание драйвера файловой системы для перевода команды в хранение данных или извлечения. Каждый тип файловой системы. Большинство драйверов файловой системы не взаимодействует непосредственно с аппаратными средствами, но только с другими драйверами. Драйвер для поддержанной диском файловой системы (ext4, btrfs, vfat, …) переводит команду в операции блочной системы хранения (чтение и секторы записи от раздела или другого блочного устройства). Драйвер для поддержанной сетью файловой системы (nfs, cifs, …) переводит команду в коммуникацию по сетевому каналу. Драйвер для внутренней файловой системы ядра (proc, sysfs, …) работает самостоятельно. Драйвер файловой системы FUSE передает команду на процесс пространства пользователя.

4
28.10.2014, 18:25
1 ответ

, отвечая на комментарии: conv=notrunc делает dd не усеченным, но не заставляет его искать конец. (При этом O_TRUNC не добавляется O_APPEND в системный вызов open(2)).

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

dd if=src bs=128k count=$count of=/dev/stdout >> dest 2>> log

Также, если вы пытаетесь фрагментировать диск, вы можете сделать кучу распределений fallocate(1), чтобы использовать пространство, а затем начать использовать dd, как только диск будет почти полностью заполнен. Программа фаллокации util-linux представляет собой простой фронт-окончательный вариант системного вызова fallocate(2). Например,

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

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

1
27.01.2020, 21:01

Теги

Похожие вопросы