Bagaimana cara memindahkan partisi di GNU / Linux?

17

Bagaimana cara memindahkan partisi ke awal disk sedikit? Parted menginginkan sistem file untuk beberapa alasan (saya tidak tahu mengapa), saya hanya ingin menggeser semua sektor yang tersisa ...

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.
sumber
Apakah Anda menggunakan partisi tanpa FS? Anda bisa mengatur FS ke siapa saja fdisklalu memindahkannya.
Peter
Jadi sebenarnya adalah wadah LUKS. Tapi saya tidak berpikir penggerak partisi harus melihat ke dalam sistem file.
Vi.
gpartedmelakukannya dengan baik untuk saya dalam situasi simular.
palacsint
Mungkin akhirnya pada akhirnya mereka telah mengimplementasikan ini?
Vi.
1
Parted vesion 3.2 tidak memiliki "pindah" sebagai opsi.
Lenne

Jawaban:

4

sfdisk, yang berniat menjadi fdisk skrip, sejak beberapa versi memiliki --move-dataopsi. Contoh dari halaman manual mereka :

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

Cara manual dengan dd dan 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

Sekarang menunggu sekitar 2 jam. (lebih mirip 18 jam ...)

Catatan: ini hanya memindahkan data kembali, bukan meneruskan.

Menjeda:

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

# kill -9 907

remember 586921398272/512 = 1146330856

Melanjutkan:

dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb3  skip=$((1146330856+73402368-73385984)) seek=1146330856 of=/dev/sdb3
Vi.
sumber
2
Penyelamat! Adakah yang mencoba menggunakan nilai bs yang lebih besar (untuk alasan kecepatan)?
David Balažic
Pastikan Anda menghitung ulang nilai-nilai dengan tepat jika bsukuran lain .
Vi.
3
mengapa tidak dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb skip=73402368 seek=0 of=/dev/sdb3? dengan cara ini, harus bekerja bahkan untuk memulai sdb3 lama di tidak di dalam sdb3 baru
solsTiCe
@solsTiCe, Apa perbedaan antara perintah Anda dan perintah saya?
Vi.
3
Namun, bs yang lebih besar tidak membantu saya sendiri bs=1M iflag=direct oflag=direct. Pergi dari 40 MB / s ke 400 MB / s pada SSD saya. Juga, gunakanstatus=progress
Aleksandr Dubinsky
3

Anda selalu bisa menggunakan dd.

  • Boot dari liveCD (atau cara lain yang memastikan partisi tidak terpasang)
  • dd if=/dev/sdc2 of=somefile bs=1M untuk membuat salinan partisi pada file.
  • fdisk (atau apa pun yang Anda suka) untuk menghapus partisi
  • fdisk (atau apa pun yang Anda suka) untuk membuat partisi di tempat yang Anda inginkan.
  • dd of=/dev/sdc2 if=somefile bs=1M untuk mengembalikan konten dari file.
Hennes
sumber
Bagaimana cara melakukannya di tempat? Partisi ini hampir sebesar semua HDD lain di rumah saya disatukan.
Vi.
Bisakah saya melakukan sesuatu seperti dd if=/dev/sdb of=/dev/sdb bs=512 skip=N seek=M?
Vi.
Mungkin bisa tetapi mengujinya terlebih dahulu . Esp. jika Anda tidak memiliki cadangan data di partisi. (Juga perhatikan bahwa jika Anda memiliki cadangan maka ada solusi yang lebih sederhana).
Hennes
3
@ Vi. Respons yang benar dan pertama dari sebuah jawaban ini tidak pantas dipilih siapa pun karena persyaratan "lakukan di tempat" ini tidak ada di mana pun dalam pertanyaan.
zero2cx