Skip to content

Instantly share code, notes, and snippets.

@apla
Last active June 17, 2019 20:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save apla/d634b2d984b1fa4e1038bab28b1106ec to your computer and use it in GitHub Desktop.
Save apla/d634b2d984b1fa4e1038bab28b1106ec to your computer and use it in GitHub Desktop.
Linux clone disk
#!/bin/bash
# parted --list
sudo lsblk -o name,mountpoint,parttype,partlabel,label,size,uuid
DISKS=( $(lsblk --nodeps -n -o name) )
read -e -p "Source disk: " -i "sda" FROM
read -e -p "Destination disk: " -i "sdb" TO
if [ "x$FROM" == "x$TO" ] || [[ ! " ${DISKS[@]} " =~ " ${FROM} " ]] || [[ ! " ${DISKS[@]} " =~ " ${TO} " ]]
then
echo "Error occured: source and destination can't be the same device, device must be plugged in"
exit 1
fi
#read -p "Now I will copy /dev/$FROM to /dev/$TO. Type Y (or y) to proceed: " -n 1 -r
#
#if [[ ! $REPLY =~ ^[Yy]$ ]] ; then
#
# exit 0
#
#fi
#echo # (optional) move to a new line
if [ "x$NO_PART" == "x" ] ; then
# partition?
# GPT
# sudo parted /dev/$TO mklabel gpt
# MBR
sudo parted /dev/$TO mklabel msdos
# Create the New Partition
# Once the format is selected, you can create a partition spanning the entire drive by typing:
# sudo parted -a opt /dev/$TO mkpart primary ext4 0% 100%
# https://askubuntu.com/questions/8819/unmounting-several-partitions-at-once
TO_PARTS=$(ls /dev/$TO?*)
if [ $? -eq 0 ] ; then
for TO_PART in $TO_PARTS ; do
umount -l $TO_PART
done
fi
# sleep a little?
sleep 5
sfdisk -d /dev/${FROM} > part_table
sfdisk /dev/${TO} < part_table
sleep 5
# sleep a little more
sudo partprobe /dev/${TO}
fi
FROM_UUID=`lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'`
FROM_SWAP_UUID=`lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= \[SWAP\]$)'`
# find a target partition
TO_LINUX_PART=$(sudo fdisk -l /dev/${TO} | grep Linux | head -n 1 | cut -d ' ' -f 1)
TO_SWAP_PART=$(sudo fdisk -l /dev/${TO} | grep swap | head -n 1 | cut -d ' ' -f 1)
if [ "x$NO_FORMAT" == "x" ] ; then
# exit 1
sudo mkfs.ext4 ${TO_LINUX_PART}
sudo mkswap ${TO_SWAP_PART}
#sudo mkfs.ext4 -L datapartition ${TO_LINUX_PART}
# sudo e2label ${TO_LINUX_PART} system
#echo "FROM_UUID $FROM_UUID"
#echo "FROM_SWAP_UUID $FROM_SWAP_UUID"
fi
TO_UUID=`lsblk -nr -o UUID $TO_LINUX_PART`
TO_SWAP_UUID=`lsblk -nr -o UUID $TO_SWAP_PART`
echo "LINUX $FROM ($FROM_UUID) => $TO#$TO_LINUX_PART ($TO_UUID)"
echo "SWAP $FROM ($FROM_SWAP_UUID) => $TO#$TO_SWAP_PART ($TO_SWAP_UUID)"
# echo "TO: LINUX $TO_LINUX_PART, SWAP $TO_SWAP_PART"
TO_MOUNT_DIR=/media/backup
if [ "x$NO_COPY" == "x" ] ; then
sudo mkdir $TO_MOUNT_DIR
sudo mount -t ext4 $TO_LINUX_PART $TO_MOUNT_DIR
sudo grub-install --boot-directory=$TO_MOUNT_DIR/boot /dev/$TO
rsync -avxHAXW --progress / $TO_MOUNT_DIR/
sed -i -- "s/${FROM_UUID}/$TO_UUID/g" $TO_MOUNT_DIR/etc/fstab
sed -i -- "s/${FROM_SWAP_UUID}/$TO_SWAP_UUID/g" $TO_MOUNT_DIR/etc/fstab
sed -i -- "s/${FROM_UUID}/$TO_UUID/g" $TO_MOUNT_DIR/boot/grub/grub.cfg
sed -i -- "s/${FROM_SWAP_UUID}/$TO_SWAP_UUID/g" $TO_MOUNT_DIR/boot/grub/grub.cfg
sed -i -- "s/${FROM_UUID}/$TO_UUID/g" $TO_MOUNT_DIR/boot/grub/i386-pc/load.cfg
sed -i -- "s/${FROM_SWAP_UUID}/$TO_SWAP_UUID/g" $TO_MOUNT_DIR/boot/grub/i386-pc/load.cfg
fi
if [ "x$SET_HOSTNAME" != "x" ] ; then
sed -i -- "s/${HOSTNAME}/$SET_HOSTNAME/g" $TO_MOUNT_DIR/etc/hostname
sed -i -- "s/${HOSTNAME}/$SET_HOSTNAME/g" $TO_MOUNT_DIR/etc/hosts
sed -i -- "s/${HOSTNAME}/$SET_HOSTNAME/g" $TO_MOUNT_DIR/etc/sysconfig/network
fi
https://www.belightsoft.com/products/resources/apfs-bootable-clone-with-command-line
@apla
Copy link
Author

apla commented Sep 30, 2018

To fix Gave up waiting for suspend/resume device, after the first boot:

  1. Put your swap UUID into /etc/initramfs-tools/conf.d/resume.
  2. Run sudo update-initramfs -u

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment