Como criar stage4 do seu Gentoo

Um dos grandes problemas do Gentoo, é o tempo de instalação. Se tivermos alguma falha de hardware, esse processo doloroso será inevitável. Uma forma simples de evitar esse transtorno é criar o stage4 de sua instalação, a restauração é simples, como o descompressão do tar do stage3. Aliás, o processo é bem parecido com essa parte inicial da instalação, seu stage já virá com tudo compilado para seu sistema e o kernel prontinho para usar.

[ Hits: 7.212 ]

Por: Demian de Carvalho em 25/05/2015


O Script



#!/bin/bash
# Backup script for Gentoo Linux
#
# mkstage4.sh is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# mkstage4.sh is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# Copyright: Reto Glauser aka blinkeye
# Mailto: stage4 at blinkeye dot ch
# Homepage: http://blinkeye.ch
# Forum post: http://forums.gentoo.org/viewtopic-t-312817.html
# Date: 2009-04-02
version=v3.7
basename=`basename $0`
find=/usr/bin/find
tar=/bin/tar
# these are the commands we actually need for the backup
command_list=(cut date echo $find grep hostname mount sh split $tar umount uname which)
# verify that each command we use exists. if one can't be found use $PATH and make a suggestion if possible.
for command in ${command_list[@]}; do
 if [ ! -x "`which $command 2>&1`" ]; then
 echo -e "\nERROR: $command not found! "
 base=`basename $command`
 if [ "`which $base 2>&1 | grep "no \`basename $command\` in"`" != "" ]; then
 echo -e "ERROR: $base is not in your \$PATH."
 fi
 exit -1
 fi
done
help="\nUsage:\n\nsh `basename $0` [[-v]|[--verbose]] [[-s]|[--split]] \n\nTo run the script NOT in verbose mode comes in handy if you want to see only the errors that occur during the backup.\n"
# Defaults to creating one tarball
tar_output="--file"
# split command
split_options="--suffix-length=1 --bytes=685m"
# options for the tar command
tarOptions=" --preserve-permissions --create --absolute-names --totals --ignore-failed-read"
# where to put the stage4
stage4Location=/mnt/backups/stage4
# name prefix
stage4prefix=`hostname`-stage4-`date +\%Y.\%m.\%d`
# patterns which should not be backed up (like iso files).
# example: default_exclude_pattern="*.iso *.divx"
# These pattern count only for files NOT listed in the $custom_include_list.
default_exclude_pattern=""
# these files/directories are always excluded. don't add trailing slashes.
# don't touch it unless you know what you are doing!
# /var/db and /var/cache/edb are intentionally added here. they are listed
# in $default_include_folders
default_exclude_list="
/dev
/lost+found
/mnt
/proc
/sys
/tmp
/usr/portage
/usr/src
/var/log
/var/tmp
/var/db
/var/cache/edb
$stage4Location
`echo $CCACHE_DIR`"
# files/devices/folders, which need to be backed up (preserve folder structure).
# don't touch it unless you know what you are doing! no recursive backup of folders.
# use $default_include_folders instead.
default_include_files="
/dev/null
/dev/console
/home
/mnt
`find /mnt -name .keep`
/proc
/sys
/tmp
/usr/portage
/usr/src
/var/log/emerge.log
/usr/src/linux-`uname -r`/.config"
# folders, which need to be backed up recursively on every backup.
# don't touch it unless you know what you are doing! the reason for this
# variable is that some users add /var to the $default_exclude_list. here
# we ensure that portage's memory is backed up in any case.
default_include_folders="
/var/db"
# IMPORTANT: A minimal backup will EXCLUDE files/folders listed here. A custom backup will
# include/exclude these files/folders depending on your answer.
custom_include_list="
/home/*
/usr/src/linux-`uname -r`"
# add files/folders here which are subfolders of a folder listed in $custom_include_list which should NOT
# be backed up. eg.
#custom_exclude_list="/home/foo/mp3 /home/foo/downloads /home/foo/.*"
custom_exclude_list=""
# Only files/folders within the $custom_include_list are checked against these patterns
# custom_exclude_pattern="*.mp3 *.iso"
custom_exclude_pattern=""
# the find_command
find_command="$find /*"
# don't backup anything which matches pattern listed in $default_exclude_pattern
for pattern in $default_exclude_pattern; do
 find_command="$find_command -not -name $pattern"
done
# assemble the find_command
function find_files()
{
 for folder in $default_exclude_list; do
 find_command="$find_command -path $folder -prune -o"
 done
find_command="$find_command -print"
for i in $default_include_files; do
 find_command="echo $i; $find_command"
 done
for i in $default_include_folders; do
 if [ -d $i ]; then
 find_command="$find $i; $find_command"
 else
 find_command="echo $i; $find_command"
 fi
 done
}
# check the exclude/include variables for non-existing entries
function verify()
{
 for i in $1; do
 if [ ! -e "`echo "$i" | cut -d'=' -f2 | cut -d'*' -f1`" -a "$i" != "/lost+found" -a "$i" != "$stage4Location" ]; then
 echo "ERROR: `echo "$i" | cut -d'=' -f2` not found! Check your "$2
 exit 0
 fi
 done
}
# check input parameters
while [ $1 ]; do
 case $1 in
 "-h" | "--help")
 echo -e $help
 exit 0;;
 "-v" | "--verbose")
 verbose=$1;;
 "-s" | "--split")
 tar_output="--split";;
 "");;
 *)
 echo -e $help
 exit 0;;
 esac
 shift
done
echo ""
# check folder/files listed in $default_exclude_list exist
verify "$default_exclude_list" "\$default_exclude_list"
# check files listed in $default_include_files exist
verify "$default_include_files" "\$default_include_files"
# check folder listed in $default_include_folders exist
verify "$default_include_folders" "\$default_include_folders"
#check folder listed in $custom_include_list exist
verify "$custom_include_list" "\$custom_include_list"
#check folder listed in $custom_exclude_list exist
verify "$custom_exclude_list" "\$custom_exclude_list"
# print out the version
 echo -e "\nBackup script $version"
 echo -e "=================="
# how do you want to backup?
echo -e "\nWhat do you want to do? (Use CONTROL-C to abort)\n
Fast (tar.gz):
 (1) Minimal backup
 (2) Interactive backup
Best (tar.bz2):
 (3) Minimal backup
 (4) Interactive backup\n"
while [ "$option" != '1' -a "$option" != '2' -a "$option" != '3' -a "$option" != '4' ]; do
 echo -en "Please enter your option: "
 read option
done
case $option in
[1,3])
 stage4Name=$stage4Location/$stage4prefix-minimal.tar;;
[2,4])
 stage4Name=$stage4Location/$stage4prefix-custom.tar
for folder in $custom_include_list; do
 echo -en "\nDo you want to backup" `echo "$folder" | cut -d'=' -f2`"? (y/n) " read answer
 while [ "$answer" != 'y' -a "$answer" != 'n' ]; do
 echo -en "Do you want to backup" `echo "$folder" | cut -d'=' -f2`"? (y/n) "
 read answer
 done
 if [ "$answer" == 'n' ]; then
 find_command="$find_command -path $folder -prune -o"
 else
 custom_find="$find $folder"
 for i in $custom_exclude_pattern; do
 custom_find="$custom_find -name $i -o"
 done
 for i in $custom_exclude_list; do
 custom_find="$custom_find -path $i -prune -o"
 done
 find_command="$custom_find -print; $find_command"
 fi
 done ;;
esac
# add $custom_include_list to the $default_exclude_list as we assembled
# $custom_find with $custom_include_list already.
default_exclude_list="$default_exclude_list $custom_include_list"
case $option in
[1,2])
 stage4postfix="gz"
 zip="--gzip";;
[3,4])
 stage4postfix="bz2"
 zip="--bzip2";;
esac
# mount boot
echo -e "\n* mounting boot"
mount /boot >/dev/null 2>&1
# find the files/folder to backup
find_files
find_command="($find_command)"
# create the final command
if [ "$tar_output" == "--file" ]; then
 tar_command="$find_command | $tar $zip $tarOptions $verbose --file $stage4Name.$stage4postfix --no-recursion -T -"
else
 tar_command="$find_command | $tar $zip $tarOptions $verbose --no-recursion -T - | split $split_options - "$stage4Name.$stage4postfix"_"
fi
if [ "$verbose" ]; then
 echo -e "\n* creating the stage4 in $stage4Location with the following command:\n\n"$tar_command
fi
# everything is set, are you sure to continue?
echo -ne "\nDo you want to continue? (y/n) "
read answer
while [ "$answer" != 'y' ] && [ "$answer" != 'n' ]; do
 echo -ne "Do you want to continue? (y/n) "
 read answer
done
if [ "$answer" == 'y' ]; then
# check whether the file already exists.
 if [ "$tar_output" == "--split" ]; then
 overwrite="`ls "$stage4Name.$stage4postfix"_* 2>&1 | grep -v 'No such file'`" else
 overwrite="$stage4Name.$stage4postfix"
 fi
if [ -a "`echo "$overwrite" | grep "$overwrite" -m1`" ]; then
 echo -en "\nDo you want to overwrite $overwrite? (y/n) "
 read answer
 while [ "$answer" != 'y' ] && [ "$answer" != 'n' ]; do
 echo -en "Do you want to overwrite $overwrite? (y/n) "
 read answer
 done
 if [ "$answer" == 'n' ]; then
 echo -e "\n* There's nothing to do ... Exiting"
 exit 0;
 fi
 fi
# if necessary, create the stage4Location
 if [ ! -d "$stage4Location" ] ; then
 echo "* creating directory $stage4Location"
 mkdir -p $stage4Location
 fi
echo -e "\n* Please wait while the stage4 is being created.\n"
# do the backup.
 sh -c "$tar_command"
# finished, clean up
 echo -e "\n* stage4 is done"
 echo "* umounting boot"
 umount /boot >/dev/null 2>&1
# Integrity check
 echo -e "* Checking integrity"
 if [ "$zip" == "--gzip" ]; then
 zip="gzip"
 else
 zip="bzip2"
 fi
if [ "$tar_output" == "--split" ]; then
 if [ "`cat "$stage4Name.$stage4postfix"_*"" | $zip --test 2>&1`" != "" ]; then
 echo -e "* Integrity check failed. Re-run the script and check your hardware."
 exit -1
 fi
 else
 if [ "`$zip --test $stage4Name.$stage4postfix 2>&1`" != "" ]; then
 echo -e "* Integrity check failed. Re-run the script and check your hardware."
 exit -1
 fi
 fi
# everything went smoothly
 echo -e "* Everything went smoothly. You successfully created a stage4."
else
 echo -e "\n* There's nothing to do ... Exiting"
fi

Deixe o arquivo como executável e rode-o:

# chmod a+x mkstage4.sh
# ./mkstage4.sh

Também é possível criar uma rotina com o cron, para que atualize o backup para você.

Página anterior     Próxima página

Páginas do artigo
   1. Backup / Opções / Portabilidade
   2. O Script
   3. Restauração
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Bacula Server 7.0.3 com PostgreSQL no Debian

Clonezilla - Servidor de imagens (Parte II)

Backups com Amazon S3

Backups remotos com rSync e chaves SSH

Backup de máquinas virtuais no ESXi 5.0 com script ghettoVCB

  
Comentários
[1] Comentário enviado por albfneto em 25/05/2015 - 19:18h

é bom esse artigo. favoritado
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
Albfneto,
Ribeirão Preto, S.P., Brasil.
Usuário Linux, Linux Counter: #479903.
Distros Favoritas: [i] Sabayon, Gentoo, OpenSUSE, Mageia e OpenMandriva[/i].

[2] Comentário enviado por tiago4171 em 25/05/2015 - 19:43h

Belo Artigo, queria um de como instalar o Gentoo em Português, já que a documentação do Gentoo está toda em Inglês. Apesar de eu estar estudando a língua, não virei mestre rs.
Se puder me ajudar, agradeceria muito!!
Favoritado
___________________________________________________________________________________________
"God is good in all the time and in all the time god is good :: Deus é bom a todo tempo, e a todo tempo deus é bom"
Core 2 Duo E8400, GT 740, 4GB DDR2, CX430, 2 HD's 500GB

[3] Comentário enviado por xerxeslins em 26/05/2015 - 09:15h


Curti!

Parabéns.

Atualmente usando Funtoo.
--
http://pastebin.com/aji5Qp05

[4] Comentário enviado por fuiprolinux em 27/05/2015 - 09:05h


[2] Comentário enviado por Fr4nk3nst3in em 25/05/2015 - 19:43h

Belo Artigo, queria um de como instalar o Gentoo em Português, já que a documentação do Gentoo está toda em Inglês. Apesar de eu estar estudando a língua, não virei mestre rs.
Se puder me ajudar, agradeceria muito!!
Favoritado
___________________________________________________________________________________________
"God is good in all the time and in all the time god is good :: Deus é bom a todo tempo, e a todo tempo deus é bom"
Core 2 Duo E8400, GT 740, 4GB DDR2, CX430, 2 HD's 500GB


Obrigado!
Estou preparando um artigo sobre a instalação do Gentoo Linux, quando estiver pronto te dou um toque! [ ]

[5] Comentário enviado por fuiprolinux em 30/05/2015 - 22:31h


[2] Comentário enviado por Fr4nk3nst3in em 25/05/2015 - 19:43h

Belo Artigo, queria um de como instalar o Gentoo em Português, já que a documentação do Gentoo está toda em Inglês. Apesar de eu estar estudando a língua, não virei mestre rs.
Se puder me ajudar, agradeceria muito!!
Favoritado
___________________________________________________________________________________________
"God is good in all the time and in all the time god is good :: Deus é bom a todo tempo, e a todo tempo deus é bom"
Core 2 Duo E8400, GT 740, 4GB DDR2, CX430, 2 HD's 500GB


Tenho um guia de instalação em http://www.fuiprolinux.com/como-instalar-o-gentoo.html


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts