Copia de seguridade de Linux de Veeam en Elbrus OS. Substitución de importación ['?' | '.' | '!']

Ola a todos.
Artigos recentes sobre Habré A substitución de importacións na práctica. Parte 1. Opcións и A música non soou por moito tempo... ou como Elbrus OS nunca chegou a ser libre non me deixou indiferente. Decidín estudar este problema no contexto da tarefa de copia de seguridade. Ademais, en Este artigo Menciónanse os produtos de Veeam Software, o que significa que o problema pode ser relevante específicamente no contexto da substitución de importacións.

Copia de seguridade de Linux de Veeam en Elbrus OS. Substitución de importación ['?' | '.' | '!']
fonte da imaxe orixinal

En primeiro lugar, decidín descargar o sistema operativo Elbrus, ou mellor dito, só a distribución dispoñible para a arquitectura x86_64, ver como funciona e tentar instalar Veeam Agent para Linux nel. Se queres saber o que saíu disto, consulta cat.

Entón, unha pequena digresión, por se alguén non o sabe. "Elbrus" é así CPU cun sistema de mando bastante específico. Ademais, hai o software Elbrus OS. E, ao contrario do que se pensa, para operar o sistema operativo Elbrus, non é necesario ter un sistema de hardware baseado no procesador Elbrus. Hai "PDK "Elbrus" para x86"; de feito, apareceu no dominio público en forma de disco de instalación. Por certo, hai unha nota ao pé "PDK - kit de desenvolvemento de plataforma, kit de desenvolvedor" - xenial, iso significa que hai polo menos un compilador alí.

Outra pequena retirada forzada. O caso é que unha vez tratei con software doméstico, como MSVS e Baguette RTOS. Tiven experiencia traballando con compoñentes domésticos, incluído un procesador de MCST. Polo tanto, podo dicir con total responsabilidade que hai unha certa especificidade neste ámbito e tentarei non tocar nela no artigo. Cando realmente queira, poñerei a etiqueta [por determinar]. Así que tentaremos prescindir de troleos rotundos e xemidos banais. Ao final, hai que entender a industria de defensa rusa e as axencias gobernamentais. Gran país - pequeno orzamento... [Por determinar].

Etapa cero - descargar. Cabe destacar que a noticia de que o sistema operativo Elbrus está dispoñible causou resonancia, tanto que o servidor de distribución caeu. [Por determinar] Grazas a Yandex e ao enxeñeiro que pensaron en trasladalo alí. Polo tanto, a velocidade de descarga é boa.

O primeiro estadio - instalación. Instaleino no primeiro hipervisor que estaba dispoñible para uso gratuíto. Asignei dous núcleos, un par de gigas de RAM, 32 MB para vídeo (haberá unha interface gráfica, pensei). O disco é como de costume - 32 GB.
Comecei a instalación. Non usei as instrucións de instalación, polo que non podo comentar. A interface de instalación de TUI é moi minimalista.

Copia de seguridade de Linux de Veeam en Elbrus OS. Substitución de importación ['?' | '.' | '!']
Ben, xenial, podemos prescindir dun rato.

Conseguín a seguinte xanela no segundo intento. Por que non selecciona o dispositivo predeterminado sr0 [TBD] ao instalar desde o disco?
Seleccione a fonte do CD-ROM e continúe.

Copia de seguridade de Linux de Veeam en Elbrus OS. Substitución de importación ['?' | '.' | '!']

Mentres seleccionaba a zona horaria, de súpeto decateime de que o sistema usa o proceso de inicio de inicio e estou traballando desde TTY0.

Copia de seguridade de Linux de Veeam en Elbrus OS. Substitución de importación ['?' | '.' | '!']

Está ben, entón clasifiquemos "Elbrus" como comunidade Vellos Crentes[TBD]. En principio, isto é bo: non é necesario pedir o código fonte para ver como funciona o proceso de descarga, xa que todo está escrito.

O resto case non ten importancia: poñemos todo e estamos de acordo. Ao longo do camiño, descubrimos que o núcleo úsase 3.14.79-13.84. Hmm, Debian 7 tiña 3.2 [TBD].

A continuación, seleccione a partición de disco predeterminada e... Vemos un aviso:

Copia de seguridade de Linux de Veeam en Elbrus OS. Substitución de importación ['?' | '.' | '!']

Hmm, dalgún xeito a partición automática non se enfrontou ben cun disco de 32 gigas. Non cambiei o disco; completei a misión coa partición manual do disco no estilo "todo en un". Tiven que instalar ext3, xa que /boot non podía estar en ext4.
O sistema xurdiu sen incidentes.

A segunda etapa - buscar alternativas.
Despois de rebuscar no contido do segundo disco, decateime de que este é un repositorio con adicionais. en paquetes. E mirando /etc/apt/sources.list, decateime de que hai que montarlo en /mnt/cdrom. Pero non atopei /etc/os-release. Pero hai /etc/mcst-versión co contido 3.0-rc36. 3.0 é probablemente a versión - parece encaixar, pero rc36? En xeral, o software de terceiros probablemente non poderá recoñecer esta distribución da forma clásica.

Na partición raíz, o directorio /mcst chama a miña atención e alí, co corazón afundido, descubrín /mcst/backup. É dicir, hai unha ferramenta de copia de seguridade e está integrada no sistema. "Xenial", pensei, "A ver como funciona isto!"

Resultou que hai un script bash de 4Kb /mcst/bin/backup que proporciona copia de ficheiros. Por defecto - ao directorio /mcst/backup. No código fonte esperaba ver o comando rsync, pero non está na configuración predeterminada. O script simplemente copia ficheiros. O comando parece algo así:

cp -rpdx <file backup> <file>

Todo o ficheiro /mcst/bin/backup está aquíAdvírtoche de inmediato que este guión por si só non é suficiente para entendelo completamente. Extrae funcións de /mcst/bin/source, que é algo así como unha biblioteca de funcións. Non o incluín (44KB).

#!/bin/bash

unalias -a

set +vx

source $(dirname $0)/source
[[ $? != 0 ]] && exit 1

OPTIONS="hvcdrRil:L:"

usage()
{
	echo "Usage: $PROG_NAME [-$OPTIONS] [backup]"
	echo "    h            - this help"
	echo "    v vv vvv     - verbose, very verbose, extremly verbose"
	echo "    c            - create backup"
	echo "    d            - diffs backup and system"
	echo "    r            - recovery system"
	echo "    R            - remove backup"
	echo "    i            - prompt before backup removing"
	echo "    l list       - additional backup files list"
	echo "    L list       - global backup files list"
	echo "    backup       - backup directory, default /mcst/backup/backup"
}

init_prog()
{
	typeset flg=0

	while getopts $OPTIONS opt
	do
		case $opt in
		h ) usage; exit 0;;
		v ) (( verbose = verbose + 1 )); set_verbose;;
		c ) flg=1; c_flg=1;;
		d ) flg=1; d_flg=1;;
		r ) flg=1; r_flg=1;;
		R ) flg=1; R_flg=1;;
		i ) i_flg=1;;
		l ) l_flg=1; list_arg="$list_arg $OPTARG";;
		L ) L_flg=1; LIST_arg="$LIST_arg $OPTARG";;
		* ) usage "Invalid option"; exit 1;;
		esac
	done

	set_verbose

	check_su

	init_variables

	shift $((OPTIND-1))

	if (( $# > 1 ))
	then
		echo_fatal "invalid arguments number, exp 0|1, act $#"
		exit 1
	fi

	[[ $# = 1 ]] && BACKUP=$1

	echo "Backup directory is $BACKUP"

	if [[ $L_flg = 1 ]]
	then
		backup_list="$LIST_arg"
	elif [[ $c_flg != 1 && $R_flg != 1 ]]
	then
		get_output_cmd "cat $BACKUP/$BACKUP_LIST_NAME"
		backup_list="$output_cmd"
	else
		get_output_cmd "get_backup_list"
		backup_list="$output_cmd"
	fi

	if [[ $l_flg = 1 ]]
	then
		backup_list="$backup_list $list_arg"
	fi

	if [[ $flg = 0 ]]
	then
		if [[ -d $BACKUP ]]
		then
			ls -laR $BACKUP
		else
			echo_info "Cannot access $BACKUP"	
		fi
		echo "backup_list=$backup_list"
		exit 0
	fi

###	echo "Backup list: $backup_list"
}

create_file()
{
	typeset f=$1 fr=$2
	typeset fb

	[[ -z $fr ]] && fr=$f

	fb=${f#/}

	fb=$BACKUP/$fb

	xcmd="rm -rf $fb"
	set_cmd "$xcmd"
	run_cmd

	xcmd="mkdir -p $fb"
	set_cmd "$xcmd"
	run_cmd

	if [[ -a $fr ]]
	then
		xcmd="cp -rpdx $fr $fb/file"
		set_cmd "$xcmd"
		run_cmd

		xcmd="touch $fb/create"
		set_cmd "$xcmd"
		run_cmd
	else
		xcmd="touch $fb/delete"
		set_cmd "$xcmd"
		run_cmd
	fi
}

diff_file()
{
	typeset f=$1
	typeset fb

	fb=${f#/}

	fb=$BACKUP/$fb

	if [[ -f $fb/delete ]]
	then
		echo_info "$f absent"
	elif [[ -f $fb/create ]]
	then
#		echo "state: create $f"

		if [[ ! -a $f ]]
		then
			echo_info "cannot access $f"
		else
			xcmd="diff -r $f $fb/file"
			echo "$xcmd"
			set_cmd "$xcmd" "" "0 1 2"
			run_cmd
		fi
	else
		echo_fatal "wrong $f backup"
		exit 1
	fi
}

recovery_file()
{
	typeset f=$1
	typeset fb

	fb=${f#/}

	fb=$BACKUP/$fb

	if [[ ! -a $fb ]]
	then
		echo_fatal "cannot access $fb"
		exit 1
	fi

	xcmd="rm -rf $f"
	set_cmd "$xcmd"
	run_cmd

	if [[ -f $fb/delete ]]
	then
		:
	elif [[ -f $fb/create ]]
	then
		xcmd="cp -rpdx $fb/file $f"
		set_cmd "$xcmd"
		run_cmd
	else
		echo_fatal "wrong $fb backup"
		exit 1
	fi
}

remove_backup()
{
	echo "Remove backup"

	if [[ ! -d $BACKUP ]]
	then
		echo_info "Cannot access $BACKUP"
		return
	fi

	if [[ ! -f $BACKUP/$BACKUP_LIST_NAME ]]
	then
		echo_fatal "$BACKUP_LIST_NAME absent, remove backup manually"
		exit 0
	fi

	answer=
	if [[ $i_flg = 1 ]]
	then
		echo -n "Remove $BACKUP directory (yes/...)?"
		read answer
	else
		answer=yes
	fi
	if [[ $answer = yes ]]
	then
		xcmd="rm -rf $BACKUP"
		set_cmd "$xcmd"
		run_cmd
	fi
}

recovery_backup()
{
	echo "Recovery system from $BACKUP" 

	for f in $backup_list
	do
		get_output_cmd "get_mount_point $f"
		mnt=$output_cmd
		get_output_cmd "is_ro_mounted $mnt"
		mnt=$output_cmd
		if [[ ! -z $mnt ]]
		then
			remount_rw_fs $mnt
		fi 
		recovery_file $f
		if [[ ! -z $mnt ]]
		then
			remount_ro_fs $mnt
		fi 
	done

	echo "The system is ready, reboot the system manually" 
}

create_backup()
{
		echo "Create backup"

		xcmd="mkdir -pm0777 $BACKUP"
		set_cmd "$xcmd"
		run_cmd

		for v in $backup_list
		do
			f=${v%%:*}
			backup_list2="$backup_list2 $f"
			fr=${v#*:}
			create_file $f $fr
		done
		echo "$backup_list2" >$BACKUP/$BACKUP_LIST_NAME
}

diff_backup()
{
	echo "Diffs system and backup" 

	if [[ ! -d $BACKUP ]]
	then
		echo_fatal "cannot access $BACKUP"
		exit 1
	fi

	for f in $backup_list
	do
		diff_file $f
	done
}

main()
{
	typeset f mnt mnt_list answer

	if [[ $R_flg = 1 ]]
	then
		remove_backup
	fi

	if [[ $r_flg = 1 ]]
	then
		recovery_backup
	fi

	if [[ $c_flg = 1 ]]
	then
		create_backup
	fi

	if [[ $d_flg = 1 ]]
	then
		diff_backup
	fi
}

init_prog "$@"

main

exit 0

Aínda que, quizais non entendín algo? Quizais alguén poida explicar nos comentarios: como garante este script unha copia de seguridade de datos segura e fiable? [Por determinar]

rsync, por certo, está incluído no complemento. repositorios. Versión 3.1.3. Creo que usar rsync aínda é unha mellor alternativa á aplicación /mcst/bin/backup.

A continuación, decidín poñer un novo Veeam Agent para Linux. Alguén preguntará: "Que teñen que ver Veeam e a substitución de importacións?" Si, non está no rexistro, pero está certificado polo FSTEC, o que significa que en ausencia de alternativas pódese utilizar. Dedicar quince minutos a alternativas de rexistro, puiden atopar 3 ligazóns para a palabra "backup" (ninguna relacionada coa miña pregunta para a palabra "reserva"). Non fixen unha análise profunda destes programas, polo que non intentarei xulgar o axeitado que son para facer copias de seguridade de máquinas que executan Linux. Quen o necesite sacará a súa propia conclusión e compartirao nos comentarios.

terceira fase — instalación de Veeam Agent para Linux.
Entón, Veeam Agent para Linux consta de dous paquetes: o módulo do núcleo veeamsnap (por certo, fonte aquí) e código propietario de espazo de usuario en forma de paquete veeam.

Houbo un pequeno problema coa instalación do módulo do núcleo: o paquete dkms que falta. Este é un servizo que che permite construír módulos do núcleo desde a fonte. Como regra xeral, está dispoñible en todas as distribucións de deb. Tiven que descargalo desde un repositorio de deb de terceiros. Unha cousa que me fixo feliz é que o paquete non depende da arquitectura, polo que encaixa como un nativo. Por que non se incluíu na lista de paquetes dispoñibles, ou mellor dito, non se desenvolveu [por determinar]? Quizais se asume que ninguén debería construír e executar ningún módulo do núcleo que non sexa MCST. Realmente hai unha discrepancia aquí, xa que hai cabeceiras de Linux. É dicir, o módulo, se o desexa, pódese montar a man e lanzarse mediante un script cando se inicia a máquina. Creo que non deberías esperar actualizacións frecuentes de MCST [TBD].

"OK, o módulo está instalado; a parte máis difícil rematou", pensei... O paquete veeam para o repositorio deb é para a plataforma amd64 e o sistema operativo Elbrus ten unha plataforma x86_64 [TBD]. A diferenza, por suposto, só está no nome, pero esta diferenza fai que case todos os paquetes de repositorios de deb de terceiros sexan incompatibles co sistema operativo Elbrus. Este molesto malentendido pódese eliminar de forma sinxela: basta con desmontar o paquete, corrixir a información sobre a arquitectura e montar de novo. Como facelo Buscouno en Google ao instante.

mkdir tmp
dpkg-deb -R original.deb tmp
# edit DEBIAN/postinst
dpkg-deb -b tmp fixed.deb

Outro problema son as dependencias. Os ficheiros necesarios parecen estar alí, pero os paquetes non. A impresión era que os nomes dos paquetes diferían dos seus "análogos importados". Quizais as bibliotecas estean empaquetadas de forma diferente. Non entrei en demasiados detalles, eliminei case todas as dependencias e a instalación seguiu adiante.

Despois xurdiron problemas co código de inicio do servizo. Faltaba o script /lib/init/vars.sh. Por algún motivo, Elbrus consegue sen el, polo que tamén o eliminaremos. A continuación, tivemos que substituír a función de saída da mensaxe: faltaban as funcións log_daemon_msg e log_end_msg. Despois de rebuscar no ficheiro /lib/lsb/init-functions, atopei a función log_success_msg; será bo para nós para experimentos. Por certo, no ficheiro /lib/lsb/init-functions a liña "# Source SuSE`s rc functions" está ao comezo do ficheiro [TBD].

Despois dun procesamento tan brusco do paquete cun ficheiro, lanzouse con éxito a copia de seguridade de toda a máquina no recurso compartido NFS. O montaxe de copia de seguridade tamén foi exitoso. Entón, creo que para facer unha copia de seguranza dunha máquina co Elbrus PDK, descargado "así" sen ningunha obriga, Veeam Agent para Linux é definitivamente axeitado. Mesmo despois de todas as modificacións cun ficheiro.

Por suposto, o kit de distribución Elbrus OS non se admite formalmente, xa que non está incluído na lista de admitidos. Ademais, o departamento de control de calidade non probou o axente de Veeam para Linux. non hai apoio (polo menos no momento da publicación do artigo).

Espero que o artigo sexa de utilidade para aqueles que intenten aplicar a orde no 334, do 29.06.2017 de xuño de XNUMX. O meu para ti... [TBD].

Fonte: www.habr.com

Engadir un comentario