Невозможно клонировать жесткий диск с dd, не осталось свободного места

Находясь в этой категории пользователей Linux, я тоже задавался этим вопросом.

Первое, что приходит на ум, это strace (справочная страница).

Знание частей ядра может дать вам представление о том, как объяснить вывод strace и отлаживать свой код еще дальше, чем обычные журналы.

Например, это вывод strace cat text.txt, где text.txt содержит предложение my name is test.

execve("/usr/bin/cat", ["cat", "test.txt"], [/* 76 vars */]) = 0
brk(0)                                  = 0x1e4f000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1b8ecd4000
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=138212, ...}) = 0
mmap(NULL, 138212, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1b8ecb2000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2118128, ...}) = 0
mmap(NULL, 3932672, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1b8e6f5000
mprotect(0x7f1b8e8ab000, 2097152, PROT_NONE) = 0
mmap(0x7f1b8eaab000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f1b8eaab000
mmap(0x7f1b8eab1000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1b8eab1000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1b8ecb1000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1b8ecaf000
arch_prctl(ARCH_SET_FS, 0x7f1b8ecaf740) = 0
mprotect(0x7f1b8eaab000, 16384, PROT_READ) = 0
mprotect(0x60b000, 4096, PROT_READ)     = 0
mprotect(0x7f1b8ecd5000, 4096, PROT_READ) = 0
munmap(0x7f1b8ecb2000, 138212)          = 0
brk(0)                                  = 0x1e4f000
brk(0x1e70000)                          = 0x1e70000
brk(0)                                  = 0x1e70000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=106070960, ...}) = 0
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1b881cc000
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("test.txt", O_RDONLY)              = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=16, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "my name is test\n", 65536)     = 16
write(1, "my name is test\n", 16my name is test
)       = 16
read(3, "", 65536)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Все системные вызовы видны выше, поэтому, если у вас есть некоторое знание ядра, у вас будет больше подсказок при отладке кода.

1
20.03.2017, 12:18
2 ответа

dd просто копирует свой ввод на свой вывод. Если входом является образ диска, на выходе будет образ диска того же размера. Вы не можете скопировать диск на диск меньшего размера. Вместо этого вам нужно создать меньшие разделы на целевом диске, создать меньшие файловые системы на этих разделах и скопировать файлы.

Здесь самый простой способ - сжать файловую систему / home , а затем сжать раздел, содержащий ее, чтобы все, что вы хотите скопировать, поместилось на целевом диске. Я думаю, что GParted может это сделать. Если это невозможно или если вы предпочитаете решение из командной строки, сначала запустите resize2fs , чтобы сжать файловую систему на / dev / sda3 (она должна быть размонтирована), затем сожмите раздел / dev / sda3 с parted или fdisk . Будьте очень осторожны при изменении размера раздела: если вы случайно сделаете его меньше, чем файловая система, файловая система, скорее всего, выйдет из строя.

После того, как все разделы уместятся по размеру целевого диска, вы можете сделать прямую копию ( cat / dev / sda> / dev / sdb - не используйте dd ], он медленнее и подвержен ошибкам ).

-1
28.01.2020, 02:13

Ваша команда пытается скопировать весь диск (if=/dev/sdX) на внешний диск. Я бы предположил, что ваша установка Linux находится на отдельном разделе от вашей установки Windows. Поэтому вам нужно указать этот раздел. Например, if=/dev/sda1. Скорее всего, вам не нужно указывать раздел для внешнего диска, поэтому of=/dev/sdY подойдет.

Чтобы узнать раздел, вы можете загрузиться в Linux OS и df -h или (как root) fdisk -l предоставит вам информацию о разделе.

-2
28.01.2020, 02:13

Теги

Похожие вопросы