Автор Гілка: Швидке створення пустого файлу на N Гб  (Прочитано 2730 раз)

Відсутній interruptor

  • Дописувач
  • **
  • дописів: 62
  • Карма: +0/-0
  • Сергій
Чи можливо створити файл заданого розміру, не заповнюючи його через dd і взагалі не виконуючи зайвих записів на диск?
Просто позначити відповідну кількість вільних секторів/екстентів/чиякїхтам такими, що відносяться до певного файлу незалежно від їх реального вмісту.
Бажано через sh, звісно :)
Хоча якщо хтось знає спосіб через C.. було б цікаво :)

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Не записуючи даних - навряд чи (якщо ви хочете саме виділити блоки, тим більше, що сама операція присвоєння блоків потребуватиме запису про це):

tsubasa:~$ df -h /home
Файлова система       Size  Used Avail Use% змонтований на
/dev/sda5             124G  101G   17G  87% /home
tsubasa:~$ dd if=/dev/zero bs=1 count=1 seek=10000M of=a.txt
1+0 записів прочитано
1+0 записів записано
 скопійовано 1 байт (1 B), 4,7004e-05 с, 21,3 kB/s
tsubasa:~$ ll a.txt
-rw-r--r-- 1 isbear isbear 10485760001 лип  6 12:44 a.txt
tsubasa:~$ df -h /home
Файлова система       Size  Used Avail Use% змонтований на
/dev/sda5             124G  101G   17G  87% /home
tsubasa:~$ du -h a.txt
8,0K      a.txt


Тобто якщо ви просто перейдете до потрібної позиції у файлі, щось там запишете, то лінукс навіть не виділить під пропущене місце блоки.
У C знайшов posix_fallocate:

tsubasa:~$ cat a.c

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main (int argc, char **argv)
{
      int fd = open (argv[1], O_CREAT|O_WRONLY);
      posix_fallocate (fd, 0, 10000000000);
      close (fd);
      return 0;
}

tsubasa:~$ gcc a.c
tsubasa:~$ ./a.out b.tt
tsubasa:~$ ll b.tt
-rwsr-S--T 1 isbear isbear 10000000000 лип  6 12:53 b.tt
tsubasa:~$ df -h /home
Файлова система       Size  Used Avail Use% змонтований на
/dev/sda5             124G  110G  7,1G  95% /home


але під час його роботи точно відбувається запис, мабуть таки тої метаінформації.

Відсутній interruptor

  • Дописувач
  • **
  • дописів: 62
  • Карма: +0/-0
  • Сергій
Супер  8-)
Лишилося порівняти хто швидше і/або почитати джерело posix_fallocate :)
Сподіваюсь, що сьогодні ввечері вдасться.

Відсутній interruptor

  • Дописувач
  • **
  • дописів: 62
  • Карма: +0/-0
  • Сергій
о, у іншій гілці http://ubuntuforums.org/showthread.php?p=11016714 вказали і для sh:
$ fallocate -l 8g swap :)
підозрюю, що це є просто обгортка до вказаної функції :)