Skip to content

Instantly share code, notes, and snippets.

@moisespsena
Last active November 17, 2022 11:10
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 moisespsena/65e8e803c44af3396de1cfa28ff81654 to your computer and use it in GitHub Desktop.
Save moisespsena/65e8e803c44af3396de1cfa28ff81654 to your computer and use it in GitHub Desktop.
Copy the Linux System to another partition
#!/bin/bash
#
# For partition only, set PARTITION_ONLY=1 enviroment variable
#
VERSION=1
PARTITION_ONLY=$PARTITION_ONLY
function _continue_or_cancel() {
echo digite \'YeS\' para CONTINUAR, caso contrario sera cancelado:
read _tmp; [ "$_tmp" != 'YeS' ] && echo CANCELADO && exit 1
}
function _confirm() {
r=0
while true;
do
echo -n "$1 [YeS|No]: "
read _tmp;
[ "$_tmp" = 'YeS' ] && r=0 && break
[ "$_tmp" = 'No' ] && r=1 && break
echo opcao invalida...
done
return $r
}
function _copy() {
echo -----------------------
echo " COPING SYSTEM FILES"
echo -----------------------
echo Insira o diretorio RAIZ de ORIGEM:
read src_dir
[ "$src_dir" == '' ] && echo DIRETORIO DE ORIGEM INVALIDO && exit 1
[ ! -d "$src_dir" ] && echo DIRETORIO DE ORIGEM NAO EXISTE && exit 1
echo Insira o diretorio RAIZ de DESTINO:
read out_dir
[ "$out_dir" == '' ] && echo DIRETORIO DE DESTINO INVALIDO && exit 1
[ ! -d "$out_dir" ] && echo DIRETORIO DE DESTINO NAO EXISTE && exit 1
src_dev=$(realpath $(mount -l | grep " $src_dir " | grep -v grep | awk '{print $1}'))
out_dev=$(realpath $(mount -l | grep " $out_dir " | grep -v grep | awk '{print $1}'))
if [ "$out_dev" == '' ]; then
echo NAO FOI POSSIVEL ENCONTRAR A PARTICAO DE DESTINO. >&2
echo O diretorio de DESTINO nao e\' valido. >&2
exit 1
fi
if [ "$src_dev" == "$out_dev" ]; then
echo A PARTICAO \'$src_dev\' DE ORIGEM E DESTINO NAO PODE SER A MESMA, >&2
echo voce nao pode fazer copia para o mesmo lugar. >&2
exit 1
fi
src_disk=`echo "$src_dev" | perl -pe 's/\d+$//'`
out_disk=`echo "$out_dev" | perl -pe 's/\d+$//'`
echo "======== CONFIRMAR PARTICOES E DIRETORIOS DE COPIA: =========="
echo " ORIGEM:"
echo " DIRETORIO:" $src_dir
echo " DISCO :" $src_disk
echo " PARTICAO :" $src_dev
echo
echo " DESTINO:"
echo " DIRETORIO:" $out_dir
echo " DISCO :" $out_disk
echo " PARTICAO :" $out_dev
echo "================================================================="
_continue_or_cancel
[ "$src_disk" = "$out_disk" ] && PARTITION_ONLY=1
cd "$out_dir" || exit 1
echo 'Insira argumentos adicionais para o comando TAR ou deixe vazio:'
read tar_args
echo $tar_args
if [ "$tar_args" == '' ]; then
echo "======== ARGUMENTOS ADICIONAIS: =========="
echo "$tar_args" | \
xargs python -c 'import sys
for i,v in enumerate(sys.argv[1:]):
print(" %s: %s" % (i+1, v))
'
echo "=========================================="
else
echo "sem argumentos adicionais para TAR..."
fi
tar_args='--exclude=./swapfile --exclude=./root/.cache --exclude=./mnt --exclude=./tmp --exclude=./var/tmp --exclude=./var/cache/apt/archives --exclude="lost+found" --exclude=./sys --exclude=./proc --exclude=./dev --exclude=./media --exclude=./etc/supervisor/conf.d/monewire.conf --exclude=./home/usuario/.mpsow --exclude=./home/usuario/sensores --exclude=./usr/share/applications/mpsow* '"$tar_args"
echo "======== ALL TAR ARGUMENTS: =========="
echo "$tar_args" | \
xargs python -c 'import sys
for i,v in enumerate(sys.argv[1:]):
print(" %s: %s" % (i+1, v))
'
echo "=========================================="
_continue_or_cancel
_start=`date`; (cd "$src_dir"; echo "$tar_args" | xargs tar -pcf - . ) | tar -xvf -; echo "START: $_start, END: "`date`
echo ----------------------------------------------------
echo CRIANDO DIRETORIOS BASICOS...
mkdir -pv mnt sys proc sys dev media tmp var/tmp var/cache/apt/archives
chmod 777 var/tmp
chmod 777 tmp
rm -vrf home/*/.cache >/dev/null
_confirm "Deseja remover as configurações do Mozilla Firefox?" && echo "Removendo configurações do Mozilla Firefox..." && rm -vrf home/*/.mozilla >/dev/null
cat /dev/null > etc/udev/rules.d/70-persistent-net.rules
}
_e=0
function _uuid() {
[ ! -e "$1" ] && echo "[ERROR]: PARTICAO INVALIDA: '$1'" 1>&2 && _e=1 && exit 1
v=`blkid $1`
echo "$v" | perl -pe 's/^.+UID="([^"]+)".+$/\1/'
}
RESULT=""
function _rp() {
local _tmp=''
while true
do
echo -n "Particao para montar $1: /dev/"
read p;
if [ "$p" = '' ]; then
_confirm "Ignorar particao para montar $1?" && {
RESULT="$RESULT\n\n#$1\n#UUID=\t$2\t$3\t$4\t$5\t$6\t$7"
echo $1 ignorado.
echo
break
} || {
echo "tente novamente..."
}
else
p="/dev/$p"
echo
if [ ! -e "$p" ]; then
echo "[ERROR]: PARTICAO INVALIDA: '$p'"
echo "tente novamente..."
else
echo "--------------------------------------"
echo " INFORMACOES DA PARTICAO $p:"
echo "--------------------------------------"
blkid $p
echo
_confirm "Confirma a particao '$p' para montar '$1'?" && {
_tmp="UUID="`_uuid "$p"`"\t$2\t$3\t$4\t$5\t$6\t$7"
echo
echo "------------------"
echo " Linha do fstab"
echo "------------------"
echo -e "$_tmp"
echo
RESULT="$RESULT\n$_tmp"
return 0
} || {
echo "repetindo..."
}
fi
fi
done
}
function _fstab() {
echo -----------------------
echo " CONFIGURANDO FSTAB "
echo -----------------------
_rp SWAP swap swap defaults 0 0
_rp / / ext4 errors=remount-ro,relatime 0 1
_rp /home /home ext4 defaults 0 2
echo -----------------------
echo " CONTEUDO DO FSTAB "
echo -----------------------
echo -e "$RESULT" | tee etc/fstab
echo "
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
" | tee -a etc/fstab
}
function _grub() {
echo ---------
mount -l | grep " "`pwd`" " | grep -v `pwd`"/home" | awk '{print $1}' | perl -pe 's/\d+$//'
echo ---------
dev=$(mount -l | grep " "`pwd`" " | grep -v `pwd`"/home" | awk '{print $1}' | perl -pe 's/\d+$//')
[ "$dev" == '' ] && echo "[ERROR]: NAO FOI POSSIVEL DETECTAR O DISPOSITIVO" 1>&2 && exit 1
[ ! -e "$dev" ] && echo "[ERROR]: DISITIVO '$dev' NAO E VALIDO" 1>&2 && exit 1
mdev=$(mount -l | grep " "`pwd`"/dev " >/dev/null && echo 0 || echo 1)
[ $mdev = 1 ] && echo "mounting /dev on ./dev" || echo "./dev has be mounted"
[ $mdev = 1 ] && mount --bind /dev dev
echo ----------- INSTALLING GRUB on \'$dev\' ---------- && \
( if [ "$PARTITION_ONLY" = '1' ]; then echo "PARTITION ONLY: not install grub on device"; else grub-install "$dev"; exit $?; fi ) && \
echo ----------- CONFIGURING GRUB-PC ---------- && \
chroot . /bin/bash -c 'mount /proc; mount /sys; (dpkg-reconfigure grub-pc); umount /proc; umount /sys' || exit 1
[ $mdev = 1 ] && echo "umounting ./dev" && umount dev
}
case "$1" in
'fstab')
echo "RUN FSTAB..."
_fstab
exit $?
;;
'copy')
echo "RUN COPY..."
_copy
exit $?
;;
'grub')
echo "RUN GRUB..."
_grub
exit $?
;;
*)
if [ "$1" = '' ]; then
echo "RUN ALL..."
_copy && _fstab && _grub
exit $?
else
echo "ERRO: INVALID OPTION '$1'" >&2
exit 1
fi
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment