2013-12-20 2 views
1

Из this article, он сравнивает запись на обычной файловой системы:Как открыть файлы с помощью блочного устройства

fd = open("/media/mount1/file", O_SYNC); 

к записи на блочное устройство:

fd = open("/dev/sda", O_SYNC) 

Как можно открыть то же file внутри HDD через блочное устройство?

+1

Как вы имеете в виду «тот же файл»? – Arkadiy

+0

Я так полагаю, потому что статья говорит о целостности данных и пропускной способности, похоже на сравнение чтения/записи нормальных данных (следовательно, файла). Хотя на самом деле мы не можем делать ничего полезного при открытии жесткого диска в качестве блочного устройства. – dragon135

ответ

0

Блок-устройство в Linux дает вам доступ к необработанным байтам на устройстве без преобразования файловой системы.

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

Таким образом, своего рода ответ, если вы должны спросить это, это не возможно :-)

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

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

2

Статья не сравнивает запись в файл через файловую систему и не приводит к тому же файлу через необработанный доступ к блочному устройству, но сравнивает некоторые факторы, такие как целостность данных и скорость, когда операция write выполняется в обычный файл, используя файловую систему, по сравнению с write, выполняемым на блочном устройстве. Он не открывает тот же файл, используя оба метода. Фактически, написание обычного файла отличается от записи на блок-устройство. Это то, как Linux предоставляет устройства, которые позволяют использовать один и тот же системный вызов с той же семантикой, но с разными устройствами. Точно так же fprintf() делает для печати на консоль, или на принтер, или на последовательный порт, или на файл: та же функция, одна и та же семантика, только один аргумент указывает назначение.

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

+0

, так что на самом деле бесполезно говорить об открытии жесткого диска в качестве блочного устройства, не имеет смысла открытие жесткого диска в качестве исходного ввода-вывода. Если вы напишете на HDD в качестве блочного устройства, я думаю, что файловая система HDD будет сломана. Утверждение о целостности данных и пропускной способности в статье выглядит так, как будто мы можем нормально записывать данные на жесткий диск: «4. O_SYNC на HDD через блок-устройство напрямую гарантирует целостность данных, но обеспечивает низкую пропускную способность». "6. Отключение барьера данных жесткого диска и необработанного DIRECT-I/O через блок-устройство обеспечивает максимальную пропускную способность на HDD." – dragon135

+0

Подумайте об этом, поэтому, если я открою жесткий диск через блок-устройство с помощью O_SYNC и O_DIRECT, а затем вызовет fsync, означает ли это, что все данные в собственном кеше/буфере диска будут записаны на пластину диска при вызове fsync? Например: я открываю файл hdd через файловую систему, записываю данные в нее и файл fsync (это не означает, что кэш диска записывается на диск), затем я снова открываю hdd через блок-устройство и вызываю fsync, он будет скрываться кеш диска из предыдущей команды записи на диск? – dragon135

0

С файловой системой пользовательского пространства. Это основа микроядерного подхода к операционным системам, используемым GNU Hurd (навсегда незавершенным) и QNX. Он также доступен как плавкий предохранитель для Linux, например. плавкие NTFS.

0

Прямой ответ на ваш вопрос заключается в том, что «вы не можете открыть тот же файл напрямую через интерфейс блока устройств».

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

Существуют устройства хранения данных, особенно те, которые поддерживаются NAND-flash, например, что люди обычно называют «USB-ключами» или SD-картами, которые противостоят любой попытке реализовать транзакции (т. Е. Утверждают, что они поддерживают кеш-память flush, но вернитесь до того, как данные действительно будут зафиксированы), но системы с магнитным диском должны быть сконфигурированы таким образом, чтобы O_SYNC в файле (по сравнению с блочным устройством) гарантировал приверженность физическому средству.

Смежные вопросы