1 min read

bash : migration between Linux machines

#!/bin/bash
# migrate.bash
# Script to export or import repositories, packages, and GPG keys
# Usage:
#   ./migrate.sh export   # run on source machine
#   ./migrate.sh import   # run on target machine

set -e

MODE=$1

if [ "$MODE" == "export" ]; then
    echo "=== Exporting repositories and packages ==="

    # Export APT package list
    dpkg --get-selections > packages.list

    # Export Snap packages
    snap list > snap-packages.list

    # Export Flatpak packages
    flatpak list --app --columns=application > flatpak-packages.list

    # Export repository sources
    cp /etc/apt/sources.list sources.list.backup
    cp -r /etc/apt/sources.list.d sources.list.d.backup

    # Export GPG keys used by apt
    sudo apt-key exportall > apt-keys.gpg

    echo "All exports done. Transfer these files to the target machine."

elif [ "$MODE" == "import" ]; then
    echo "=== Importing repositories and packages ==="
    
    # Restore GPG keys
    sudo apt-key add apt-keys.gpg

    # Restore repository sources
    sudo cp sources.list.backup /etc/apt/sources.list
    sudo cp -r sources.list.d.backup/* /etc/apt/sources.list.d/

    # Update package lists
    sudo apt update

    # Restore APT packages
    sudo dpkg --set-selections < packages.list
    sudo apt-get -u dselect-upgrade -y

    # Restore Snap packages
    awk 'NR>1 {print "sudo snap install " $1}' snap-packages.list | bash

    # Restore Flatpak packages
    awk '{print "flatpak install -y " $1}' flatpak-packages.list | bash

    echo "All imports done. System should now mirror the source machine."

else
    echo "Usage: $0 {export|import}"
    exit 1
fi

Usage

On the source machine :

chmod +x migrate.bash
./migrate.bash export

On the destination machine :

chmod +x migrate.bash
./migrate.bash import