Создаем гиговый файл, на разделе размером в мегабайт


ramok аватар

ramok - Posted on 03 Декабрь 2006

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

Зачем? Да потому что мы можем это сделать! Ж:-)

1) создадим 1 меговый раздел в файле. приготовим файл который будет нашим разделом

$ cd /tmp
$ dd count=1 obs=1 ibs=1M of=1M.fs if=/dev/zero
$ mkdir mnt

2) создадим раздел в этом файле. отформатируем его и подмонтируем. показано как это сделать в Linux и FreeBSD
a) Linux

$ mkfs.ext2 1M.fs
$ mount 1M.fs mnt
$ sudo mount -o loop 1M.fs mnt

b) FreeBSD

$ sudo mdconfig -a -t vnode -f 1M.fs -u 0
$ sudo bsdlabel -w md0 auto
$ sudo newfs md0c
sudo mount /dev/md0c mnt

3) внимание... фокус.. создаем файл 1 гиговый файл в только что созданном 1 меговом разделе Ж:-)

$ cd mnt
$ dd conv=notrunc seek=1G bs=1 count=1 if=/dev/zero of=big-fucking-file
$ ls -lh big-fucking-file

# и любуемся результатом Ж:-))

4) убираем за собой..

$ cd ..
$ sudo umount mnt
$ rm 1M.fs

Можно конечно пункт 1 и 2 пропустить. Сразу предупреждаю что на FAT такой фокус покус не пройдет
, насчет NTFS не в курсе.

Понятное дело что никакой магии тут нет, но мне лениво объяснять в чем тут фокус, так что
если кто то бросил линку где описано почему это имеет место быть, буду благодарен Ж:-)

PS

ответ

0
Ваша оценка: Ничего

Я так понял используется системный вызов lseek. Поэтому смотрим
man 3p lseek и видим:
Although lseek() may position the file offset beyond the end of the file, this function does not itself extend the size of the file. While the only function in IEEE Std 1003.1-2001 that may directly extend the size of the file is write(), truncate(), and ftruncate(), several functions originally derived from the ISO C standard, such as fwrite(), fprintf(), and so on, may do so (by causing calls on write()).

То есть, если указать смещение для функции lseek за пределами размера файла, то он не увеличивается.

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

--
Signature invent in progress 22% #.........

loshadka:/tmp/mnt# dd conv=notrunc seek=1G bs=1 if=/dev/zero of=bigfile
dd: writing `bigfile': No space left on device
1001473+0 records in
1001472+0 records out
1001472 bytes (1.0 MB) copied, 1.84433 seconds, 543 kB/s

не заработало у меня в Lin :-(

а ты попробуй таки count=1 указать
только что проверил все опять - у меня все работает

ramok5001pts/14~/ dd conv=notrunc seek=1G bs=1 count=1 if=/dev/zero of=big-fucking-file
1+0 записей считано
1+0 записей написано
 скопирован 1 байт (1 B), 0,0337492 секунд, 0,0 kB/s
ramok5002pts/14~/ ls -l big-fucking-file 
-rw-rw-r-- 1 ramok ramok 1073741825 2006-12-04 17:09 big-fucking-file

кстати какая fs?

--
Signature invent in progress 22% #.........

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.