Como mover uma partição no GNU / Linux?

17

Como mover uma partição para o início do disco um pouco? Parted quer um sistema de arquivos por algum motivo (não sei por quê), quero apenas mudar todos os setores restantes ...

r@l:15:32:45:~# parted /dev/sdb
GNU Parted 2.3
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Model: HGST HTS 541010A9E680 (scsi)
Disk /dev/sdb: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  32.2GB  32.2GB  primary  fat32
 2      32.2GB  37.6GB  5360MB  primary
 3      37.6GB  1000GB  963GB   primary

(parted) move 3                                                           
WARNING: you are attempting to use parted to operate on (move) a file system.
parted's file system manipulation code is not as robust as what you'll find in
dedicated, file-system-specific packages like e2fsprogs.  We recommend
you use parted only to manipulate partition tables, whenever possible.
Support for performing most operations on most types of file systems
will be removed in an upcoming release.
Error: Could not detect file system.   
Vi.
fonte
Você está usando as partições sem FS? Você pode simplesmente definir o FS para qualquer pessoa fdiske depois movê-los.
Peter Peter
Assim, é realmente um contêiner LUKS. Mas não acho que um motor de partição deva procurar dentro do sistema de arquivos.
Vi.
gpartedfez bem para mim em uma situação simulada.
palacsint
Talvez finalmente no final eles tenham implementado isso?
Vi.
1
A versão separada 3.2 não tem "movimento" como opção.
Lenne

Respostas:

4

sfdisk, que pretende ser um fdisk com script, desde alguma versão a --move-dataopção. Exemplo da página de manual :

echo '+100M,' | sfdisk --move-data /dev/sdc -N 1
gimpf
fonte
15

Maneira manual com dd e fdisk:

# fdisk -l /dev/sdb | grep sdb3
/dev/sdb3        73402368  1953525167   940061400   83  Linux

# fdisk /dev/sdb
Command (m for help): d
Partition number (1-4): 3
Command (m for help): n
Partition number (1-4, default 3): 3
First sector (73385984-1953525167, default 73385984): 
Using default value 73385984
Last sector, +sectors or +size{K,M,G} (73385984-1953525167, default 1953525167): 
Using default value 1953525167
Command (m for help): w
The partition table has been altered!

# fdisk -l /dev/sdb | grep sdb3
/dev/sdb3        73385984  1953525167   940069592   83  Linux

# dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb3 count=100 skip=$((73402368-73385984)) seek=0 2> /dev/null | file -s -
/dev/stdin: LUKS encrypted file, ver 1 [aes, cbc-essiv:sha256, sha1] UUID: af1c47f0-4ca5-4ea7-a091-065bd263653f

# dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb3  skip=$((73402368-73385984)) seek=0 of=/dev/sdb3

# file -s /dev/sdb3
/dev/sdb3: sticky LUKS encrypted file, ver 1 [aes, cbc-essiv:sha256, sha1] UUID: af1c47f0-4ca5-4ea7-a091-065bd263653f

Agora esperando cerca de 2h. (mais parece mais com 18h ...)

Nota: isso apenas move os dados de volta, não para frente.

Pausando:

# pidof dd
907
# kill -STOP 907
# cat /proc/907/fdinfo/1
pos:    586921398272
flags:  0100001

# kill -9 907

remember 586921398272/512 = 1146330856

Retomar:

dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb3  skip=$((1146330856+73402368-73385984)) seek=1146330856 of=/dev/sdb3
Vi.
fonte
2
Lifesaver! Alguém tentou usar um valor bs maior (por motivos de velocidade)?
precisa
Certifique-se de recalcular os valores adequadamente em caso de outro bstamanho.
Vi.
3
por que não dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb skip=73402368 seek=0 of=/dev/sdb3? Desta forma, devem trabalhar início mesmo f de sdb3 de idade em não dentro nova sdb3
Solstício de
@solsTiCe, Qual é a diferença entre seu comando e o meu comando?
Vi.
3
Um bs maior não me ajudou sozinho, no entanto bs=1M iflag=direct oflag=direct. Foi de 40 MB / se 400 MB / s no meu SSD. Além disso, use #status=progress
Aleksandr Dubinsky
3

Você sempre pode usar dd.

  • Inicialize a partir de um liveCD (ou qualquer outra maneira de garantir que a partição não esteja montada)
  • dd if=/dev/sdc2 of=somefile bs=1M para criar uma cópia da partição em um arquivo.
  • fdisk (ou o que você quiser) para excluir a partição
  • fdisk (ou o que você quiser) para criar a partição no local desejado.
  • dd of=/dev/sdc2 if=somefile bs=1M para restaurar o conteúdo do arquivo.
Hennes
fonte
Como fazê-lo no local? Essa partição é quase tão grande quanto todos os outros HDs da minha casa juntos.
Vi.
Posso fazer algo assim dd if=/dev/sdb of=/dev/sdb bs=512 skip=N seek=M?
Vi.
Pode ser capaz de tom, mas testá-lo primeiro . Esp. se você não tiver backup dos dados na partição. (Observe também que, se você tiver um backup, existem soluções bem mais simples).
Hennes
3
@Vi. Essa primeira resposta correta de uma resposta não merece voto negativo de ninguém, porque esse requisito de "faça isso no lugar" não existe em nenhuma parte da pergunta.
precisa saber é