Иногда возникает необходимость создания файла определенного размера. Сделать это можно разнообразными способами. Рассмотрим несколько из них. В примерах будем создавать файл размером 100MB.
| # dd of=test_file.100mb bs=1 count=0 seek=100M 0+0 records in 0+0 records out 0 bytes transferred in 0.000046 secs (0 bytes/sec) |
Проверяем размер созданного файла:
|
# ls -lh | grep test_file -rw-r--r-- 1 root wheel 100M 3 май 20:26 test_file.100mb |
| # dd if=/dev/zero of=test_file.100mb bs=1M count=100 100+0 records in 100+0 records out 104857600 bytes transferred in 1.151160 secs (91088641 bytes/sec) |
Проверяем размер созданного файла:
| # ls -lh | grep test_file -rw-r--r-- 1 root wheel 100M 3 май 20:33 test_file.100mb |
| # truncate -s 100M test_file.100mb |
Проверяем размер созданного файла:
| # ls -lh | grep test_file -rw-r--r-- 1 root wheel 100M 3 май 21:04 test_file.100mb |
Re: Создание файла определенного размера
mkfile еще есть,но не везде
;)
Re: Создание файла определенного размера
В системе отсутствует, но похоже, что утилита присутствует в портах:
Port: mkfile-1.1.3
Path: /usr/ports/sysutils/mkfile
Info: Create files suitable for use as swap files
Maint: hatanou [at] infolab [dot] ne [dot] jp
B-deps:
R-deps:
WWW: http://www.infolab.ne.jp/~hatanou/freebsd/mkfile/
Re: Создание файла определенного размера
Можна докладніше у чому принципова різниця між першим та другим способами?
Якщо з другим все зрозуміло: у якості джерела нулів використовуємо /dev/zero та наповнюємо цими нулями файл test_file.100mb влоками по 1M доки його розмір не сягне 100mb. В резальтаті отримаємо файл 100mb заповнений нулями, який дуже добре стискатиметься компресором.
То з першим способом не зовсім, що й звідки ми беремо, тобто чим буде наповнений файл, що означає seek=100M, і чому count=0.
Ще буду дуже вдячний за коротке пояснення третього способу, ну й пару слів про то у яких випадках який спосіб краще використовувати.
Re: Создание файла определенного размера
Згідно man dd:
seek=n Seek n blocks from the beginning of the output before copying. On non-tape devices, an lseek(2) operation is used. Otherwise, existing blocks are read and the data discarded. If the user does not have read permission for the tape, it is positioned using the tape ioctl(2) function calls. If the seek operation is past the end of file, space from the current end of file to the specified offset is filled with blocks of NUL bytes.Тепер "на пальцях" щодо 1 способу... Беремо блок розміром 1 байт і звертаємось до нього 100М разів (як варіант, можна взяти блок розміром 1М і повторити його 100 разів, результат буде той же) перед копіюванням. Count рівний нулю, оскільки в нас немає вихідного потоку, звідки можна взяти дані.
Файли у всіх трьох випадках заповнені нулями. Перевіряв, контрольна сумма файла, створеного будь-яким наведеним способом, співпадає:
MD5 (test_file.100mb2) = 2f282b84e7e608d5852449ed940bfc51
MD5 (test_file.100mb3) = 2f282b84e7e608d5852449ed940bfc51
Щодо третього способу, то утиліта truncate служить для "укорочення" чи "подовження" файлу до певного розміру. Оскільки вхідного файлу немає, то вона створить новий вказаного розміру. Рекомендую ознайомитись з man truncate.
Щодо продуктивності - потрібно виконати тести створюючи файли великих розмірів, при створенні файлу малого розміру різницю у використання ресурсів системи складно помітити. Скоріше всього, "вузьким" місцем буде продуктивність HDD, однак при деяких варіаціях роботи з dd є можливість "зловити" проблему з RAM при роботі з блоками. В будь-якому випадку, оскільки дані маніпуляції використовуються рідко, недоцільно витрачати час для виконання тестів з визначення оптимального способу щодо використання ресурсів системи.
Re: Создание файла определенного размера
дякую за пояснення