24

How to move a partition to the beginning of the disk a bit? Parted wants a filesystem for some reason (I don't know why), I want just to shift all sectors left...

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.   
Hennes
  • 64,768
  • 7
  • 111
  • 168
Vi.
  • 16,755
  • 32
  • 111
  • 189
  • Are you using the partitions without FS? You can just set the FS to anyone with `fdisk` and then move them. – Peter Jan 24 '13 at 13:10
  • Thus is actually a LUKS container. But I don't think a partition mover should ever look inside the filesystem. – Vi. Jan 24 '13 at 13:25
  • 1
    `gparted` did it well for me in a simular situation. – palacsint Oct 11 '17 at 11:49
  • Maybe finally the in the end they have implemented this? – Vi. Oct 11 '17 at 17:18
  • @Vi. I don't think gparted can do this yet (no LUKS support afaik), however KDE Partition Manager can and it's *fantastically* simple these days, [see here](https://superuser.com/questions/811620/move-a-luks-partition-to-the-left-and-resize-it) – Unencoded Jul 28 '18 at 21:47
  • 3
    Parted vesion 3.2 does not have "move" as an option. – Lenne Sep 14 '18 at 23:21

3 Answers3

17

Manual way with dd and 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

Now waiting for about 2h. (more looks more like 18h...)

Note: this only moves data back, not forward.

Pausing:

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

# kill -9 907

remember 586921398272/512 = 1146330856

Resuming:

dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb3  skip=$((1146330856+73402368-73385984)) seek=1146330856 of=/dev/sdb3
Vi.
  • 16,755
  • 32
  • 111
  • 189
  • 2
    Lifesaver! Did anyone try to use a larger bs value (for speed reasons)? – David Balažic Nov 22 '13 at 00:24
  • Ensure you recalculated the values appropriately in case of other `bs` size. – Vi. Nov 25 '13 at 12:33
  • 3
    why not `dd conv=notrunc bs=512 iflag=fullblock if=/dev/sdb skip=73402368 seek=0 of=/dev/sdb3` ? this way it, should work even f start of old sdb3 in not inside new sdb3 – solsTiCe Jun 10 '15 at 14:27
  • @solsTiCe, What is the difference between your command and my command? – Vi. Jun 10 '15 at 16:36
  • It copies data from /dev/sdb and not from /dev/sdb3 – solsTiCe Jun 10 '15 at 22:39
  • First things first, this is very useful. Personal taste, but I think would be perfect providing both the codes as one line per command (as current) together with an annex showing the same codes as an edited version respecting 80 columns width. – 174140 Aug 13 '15 at 14:28
  • This is excellent for moving partitions back from sector 2048 to sector 63 so older versions of Windows can boot – SystemParadox Aug 13 '16 at 09:43
  • 4
    A larger bs didn't help me on its own, however `bs=1M iflag=direct oflag=direct` did. Went from 40 MB/s to 400 MB/s on my SSD. Also, use `status=progress` – Aleksandr Dubinsky Mar 23 '17 at 09:42
  • Having created a new larger partition with `fdisk` (I was able to make room for that) and filled it with `dd`, I see (a) MS WIndows Control Panel / Administrative Tools / Computer Management / Storage (or similar) says it is unallocated and (b) it does not appear in the various `/dev/disk/by*` directories. Are there extra steps needed to deal with (a) and (b)? – PJTraill Jun 13 '17 at 19:21
13

sfdisk, which intents to be a scriptable fdisk, has since some version the --move-data option. Example from their man page:

echo '+100M,' | sfdisk --move-data /dev/sdc -N 1
gimpf
  • 246
  • 2
  • 3
5

You can always use dd.

  • Boot from a liveCD (or any other way which makes sure the partition is not mounted)
  • dd if=/dev/sdc2 of=somefile bs=1M to create a copy of the partition on a file.
  • fdisk (or whatever you like) to delete the partition
  • fdisk (or whatever you like) to create the partition in your desired place.
  • dd of=/dev/sdc2 if=somefile bs=1M to restore the contents from file.
Hennes
  • 64,768
  • 7
  • 111
  • 168
  • How to do it in-place? This partition is almost as large as all other HDDs in my home taked together. – Vi. Jan 24 '13 at 13:24
  • Can I do something like `dd if=/dev/sdb of=/dev/sdb bs=512 skip=N seek=M`? – Vi. Jan 24 '13 at 13:26
  • Might be able tom but **test it first**. Esp. if you have no backup of the data on the partition. (Also note that if you do have a backup then there are way simpler solutions). – Hennes Jan 24 '13 at 13:40
  • 5
    @Vi. This correct, first response of an answer deserves no one's down-vote because this "do it in place" requirement exists nowhere in the question. – zero2cx Jan 15 '17 at 16:40