Если мы запускаем fallocate без изменения размера файла, то что выходит? Файл не уменьшается, просто обнуляем данные в его начале.
Мы же не можем дописывать данные в конец и удалять в начале одной командой.?
Fallocate с дыркой вообще делает непонятную для меня вещь.
$ dd of=sparse bs=1G count=0 seek=1024
0+0 records in
0+0 records out
0 bytes copied, 6.9401e-05 s, 0.0 kB/s
$ stat sparse
File: sparse
Size: 1099511627776 Blocks: 0 IO Block: 4096 regular file
Device: fe03h/65027d Inode: 22684238 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/jcmvbkbc) Gid: ( 1000/jcmvbkbc)
Access: 2019-08-18 15:42:04.772367087 -0700
Modify: 2019-08-18 15:42:04.776367113 -0700
Change: 2019-08-18 15:42:04.776367113 -0700
Birth: -
$ echo test >> sparse
$ tail -c 100 sparse | hexdump -Cv
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 74 |...............t|
00000060 65 73 74 0a |est.|
00000064
$ stat sparse
File: sparse
Size: 1099511627781 Blocks: 8 IO Block: 4096 regular file
Device: fe03h/65027d Inode: 22684238 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/jcmvbkbc) Gid: ( 1000/jcmvbkbc)
Access: 2019-08-18 15:43:25.668878335 -0700
Modify: 2019-08-18 15:43:14.808809836 -0700
Change: 2019-08-18 15:43:14.808809836 -0700
Birth: -
хочу услышать совет по отладке
malloc: Incorrect checksum for freed object
Я выделяю память, а указатель невалиден, пишет "возможно объект был изменён после удаления". Какое удаление? Вот он, объект, только что создан.
И тут я вспоминаю про функцию mlock(), с которой уже имел такие грабли лет почти 25 назад. Добавил - работает.
что противоречит тому, что файл уменьшился на удаленные с его начала несколько байт
загляните отладчиком в код функции new.
Dump of assembler code for function _Znwm:
0x00007ffff7ae6790 <+0>: push %rbx
=> 0x00007ffff7ae6791 <+1>: test %rdi,%rdi
0x00007ffff7ae6794 <+4>: mov %rdi,%rbx
0x00007ffff7ae6797 <+7>: mov $0x1,%eax
0x00007ffff7ae679c <+12>: cmove %rax,%rbx
0x00007ffff7ae67a0 <+16>: mov %rbx,%rdi
0x00007ffff7ae67a3 <+19>: callq 0x7ffff7adff10 <malloc@plt>
0x00007ffff7ae67a8 <+24>: test %rax,%rax
0x00007ffff7ae67ab <+27>: je 0x7ffff7ae67b0 <_Znwm+32>
0x00007ffff7ae67ad <+29>: pop %rbx
0x00007ffff7ae67ae <+30>: retq
0x00007ffff7ae67af <+31>: nop
0x00007ffff7ae67b0 <+32>: callq 0x7ffff7adff60 <_ZSt15get_new_handlerv@plt>
0x00007ffff7ae67b5 <+37>: test %rax,%rax
0x00007ffff7ae67b8 <+40>: je 0x7ffff7ae67be <_Znwm+46>
0x00007ffff7ae67ba <+42>: callq *%rax
0x00007ffff7ae67bc <+44>: jmp 0x7ffff7ae67a0 <_Znwm+16>
0x00007ffff7ae67be <+46>: mov $0x8,%edi
0x00007ffff7ae67c3 <+51>: callq 0x7ffff7ae0840 <__cxa_allocate_exception@plt>
0x00007ffff7ae67c8 <+56>: mov 0x2ebec1(%rip),%rdx # 0x7ffff7dd2690
0x00007ffff7ae67cf <+63>: mov 0x2eb9e2(%rip),%rsi # 0x7ffff7dd21b8
0x00007ffff7ae67d6 <+70>: mov %rax,%rdi
0x00007ffff7ae67d9 <+73>: add $0x10,%rdx
0x00007ffff7ae67dd <+77>: mov %rdx,(%rax)
0x00007ffff7ae67e0 <+80>: mov 0x2ec681(%rip),%rdx # 0x7ffff7dd2e68
0x00007ffff7ae67e7 <+87>: callq 0x7ffff7ae0db0 <__cxa_throw@plt>
End of assembler dump.
mlock() гарантирует, что выделенная память не будет спейджирована операционной системой, и указатель будет валидным во время выполнения программы.
нужно помнить, что tmpfs не ограничен
Mount options for tmpfs
size=nbytes
Override default maximum size of the filesystem.
The size is given in bytes, and rounded up to entire pages.
The default is half of the memory.
The size parameter also accepts a suffix % to limit this tmpfs instance
to that percentage of your physical RAM: the default, when neither
size nor nr_blocks is specified, is size=50%
Moskus, почти наверняка такая строка, при условии, что она короче самого MD5, будет единственной.