Copia de seguridad de Linux desde Veeam en el sistema operativo Elbrus. Substitución de importaciones ['?' | '.' | '!']

Hola a todos.
Artículos recientes sobre Habré La sustitución de importaciones en la práctica. Parte 1. Opciones и La música no sonó durante mucho tiempo... o cómo Elbrus OS no se volvió gratuito No me dejó indiferente. Decidí estudiar este tema en el contexto de la tarea de respaldo. Además, en este artículo Se mencionan los productos de Veeam Software, lo que significa que la cuestión puede ser relevante específicamente en el contexto de la sustitución de importaciones.

Copia de seguridad de Linux desde Veeam en el sistema operativo Elbrus. Substitución de importaciones ['?' | '.' | '!']
fuente de imagen original

En primer lugar, decidí descargar el sistema operativo Elbrus, o mejor dicho, solo la distribución disponible para la arquitectura x86_64, ver cómo funciona e intentar instalar Veeam Agent para Linux en él. Si quieres saber qué resultó de esto, consulta cat.

Entonces, una pequeña digresión, por si alguien no lo sabe. "Elbrus" es así procesador con un sistema de mando bastante específico. Además, existe el software Elbrus OS. Y, contrariamente a la creencia popular, para operar el sistema operativo Elbrus no es necesario tener un sistema de hardware basado en el procesador Elbrus. Existe el “PDK “Elbrus” para x86”; de hecho, apareció en el dominio público en forma de disco de instalación. Por cierto, hay una nota a pie de página "PDK - kit de desarrollo de plataforma, kit de desarrollador" - genial, significa que al menos hay un compilador allí.

Otra pequeña retirada forzada. El hecho es que una vez me ocupé de software doméstico, como MSVS y Baguette RTOS. Tenía experiencia trabajando con componentes domésticos, incluido un procesador de MCST. Por tanto, puedo decir con total responsabilidad que existe una cierta especificidad en este ámbito y es precisamente esto lo que intentaré no tocar en el artículo. Cuando realmente quiera, pondré la etiqueta [TBD]. Así que intentaremos prescindir del trolling y de los gemidos banales. Al final, es necesario comprender la industria de defensa rusa y las agencias gubernamentales. País grande, presupuesto pequeño... [TBD].

etapa cero - descargar. Es de destacar que la noticia de que el sistema operativo Elbrus está disponible causó tanta resonancia que el servidor de distribución dejó de funcionar. [TBD] Gracias a Yandex y al ingeniero que pensó en trasladarlo allí. Entonces la velocidad de descarga es buena.

La etapa primera - instalación. Lo instalé en el primer hipervisor que estaba disponible para uso gratuito. Le asigné dos núcleos, un par de gigas de RAM, 32 MB para video (pensé que habrá una interfaz gráfica). El disco es el habitual: 32 GB.
Comencé la instalación. No utilicé las instrucciones de instalación, por lo que no puedo comentar al respecto. La interfaz de instalación de TUI es muy minimalista.

Copia de seguridad de Linux desde Veeam en el sistema operativo Elbrus. Substitución de importaciones ['?' | '.' | '!']
Bueno, genial, podemos prescindir del ratón.

Logré la siguiente ventana en el segundo intento. ¿Por qué no seleccionar el dispositivo predeterminado sr0 [TBD] al realizar la instalación desde el disco?
Seleccione la fuente del CD-ROM y continúe.

Copia de seguridad de Linux desde Veeam en el sistema operativo Elbrus. Substitución de importaciones ['?' | '.' | '!']

Mientras seleccionaba la zona horaria, de repente me di cuenta de que el sistema utiliza el proceso de inicio y estoy trabajando desde TTY0.

Copia de seguridad de Linux desde Veeam en el sistema operativo Elbrus. Substitución de importaciones ['?' | '.' | '!']

Bien, entonces clasifiquemos "Elbrus" como una comunidad. Viejos creyentes[Por determinar]. En principio, esto es bueno: no es necesario pedir el código fuente para ver cómo funciona el proceso de descarga, ya que todo está programado.

El resto casi no tiene importancia: lo ponemos todo y nos ponemos de acuerdo. En el camino, descubrimos que se utiliza el kernel 3.14.79-13.84. Mmmm, Debian 7 tenía 3.2 [TBD].

A continuación, seleccione la partición del disco predeterminada y... Vemos una advertencia:

Copia de seguridad de Linux desde Veeam en el sistema operativo Elbrus. Substitución de importaciones ['?' | '.' | '!']

Mmmm, de alguna manera la partición automática no funcionó bien con un disco de 32 gigas. No cambié el disco; completé la misión con la partición manual del disco al estilo "todo en uno". Tuve que instalar ext3, ya que /boot no podía estar en ext4.
El sistema funcionó sin incidentes.

La segunda etapa - buscar alternativas.
Después de hurgar en el contenido del segundo disco, me di cuenta de que se trata de un repositorio con archivos adicionales. en paquetes. Y mirando /etc/apt/sources.list, me di cuenta de que es necesario montarlo en /mnt/cdrom. Pero no encontré /etc/os-release. Pero existe la versión /etc/mcst con el contenido 3.0-rc36. Probablemente la versión 3.0 sea la adecuada; parece encajar, pero ¿rc36? En general, lo más probable es que el software de terceros no pueda reconocer esta distribución de la forma clásica.

En la partición raíz, me llama la atención el directorio /mcst, y allí, con el corazón hundido, descubrí /mcst/backup. Es decir, hay una herramienta de respaldo y está integrada en el sistema. "Genial", pensé, "¡Veamos cómo funciona!".

Resultó que hay un script bash de 4 KB /mcst/bin/backup que permite copiar archivos. De forma predeterminada, al directorio /mcst/backup. En el código fuente esperaba ver el comando rsync, pero no está en la configuración predeterminada. El script simplemente copia archivos. El comando se parece a esto:

cp -rpdx <file backup> <file>

El archivo completo /mcst/bin/backup está aquíLes advierto de inmediato que este guión por sí solo no es suficiente para comprenderlo completamente. Extrae funciones de /mcst/bin/source, que es algo así como una biblioteca de funciones. No lo incluí (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

Aunque, ¿tal vez no entendí algo? Tal vez alguien pueda explicar en los comentarios: ¿cómo garantiza este script una copia de seguridad de datos segura y confiable? [Por determinar]

rsync, por cierto, está incluido en el complemento. repositorios. Versión 3.1.3. Creo que usar rsync sigue siendo una mejor alternativa a la aplicación /mcst/bin/backup.

A continuación, decidí poner uno nuevo. Veeam Agent para Linux. Alguien preguntará: “¿Qué tiene que ver Veeam y la sustitución de importaciones?” Sí, no está registrado, pero está certificado por FSTEC, lo que significa que a falta de alternativas se puede utilizar. Dedicar quince minutos a alternativas de registro, pude encontrar 3 enlaces para la palabra "copia de seguridad" (ninguno relacionado con mi pregunta para la palabra "reserva"). No he realizado un análisis profundo de estos programas, por lo que no intentaré juzgar qué tan adecuados son para realizar copias de seguridad de máquinas que ejecutan Linux. Quien lo necesite sacará su propia conclusión y la compartirá en los comentarios.

La etapa tres — instalación de Veeam Agent para Linux.
Entonces, Veeam Agent para Linux consta de dos paquetes: el módulo del kernel veeamsnap (por cierto, fuente aquí) y código de espacio de usuario propietario en forma de paquete veeam.

Hubo un pequeño problema con la instalación del módulo del kernel: faltaba el paquete dkms. Este es un servicio que le permite crear módulos del kernel desde el código fuente. Como regla general, está disponible en todas las distribuciones deb. Tuve que descargarlo de un repositorio deb de terceros. Una cosa que me hizo feliz es que el paquete no depende de la arquitectura, por lo que se adapta como uno nativo. ¿Por qué no se incluyó en la lista de paquetes disponibles, o mejor dicho, no se desarrolló [TBD]? Quizás se supone que nadie debería compilar y ejecutar ningún módulo del kernel que no sea MCST. Realmente hay una discrepancia aquí, ya que hay encabezados de Linux. Es decir, el módulo, si se desea, se puede ensamblar a mano y ejecutar mediante un script cuando se inicia la máquina. Creo que no deberías esperar actualizaciones frecuentes de MCST [TBD].

"Está bien, el módulo está instalado; la parte más difícil ya pasó", pensé... El paquete veeam para el repositorio deb es para la plataforma amd64, y el sistema operativo Elbrus tiene una plataforma x86_64 [TBD]. La diferencia, por supuesto, está sólo en el nombre, pero esta diferencia hace que casi todos los paquetes de repositorios deb de terceros sean incompatibles con el sistema operativo Elbrus. Este molesto malentendido se puede eliminar de forma sencilla: basta con desmontar el paquete, corregir la información sobre la arquitectura y volver a montarlo. Cómo hacerlo Lo busqué en Google instantáneamente.

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

Otro problema son las dependencias. Los archivos necesarios parecen estar ahí, pero los paquetes no. La impresión era que los nombres de los paquetes diferían de sus “análogos importados”. Quizás las bibliotecas estén empaquetadas de manera diferente. No entré en demasiados detalles, eliminé casi todas las dependencias y la instalación continuó.

Luego surgieron problemas con el código de inicio del servicio. Faltaba el script /lib/init/vars.sh. Por alguna razón, Elbrus se las arregla sin él, así que también lo eliminaremos. A continuación, tuvimos que reemplazar la función de salida de mensajes: faltaban las funciones log_daemon_msg y log_end_msg. Después de hurgar en el archivo /lib/lsb/init-functions, encontré la función log_success_msg; nos vendrá bien para realizar experimentos. Por cierto, en el archivo /lib/lsb/init-functions la línea “# Source SuSE`s rc funciones” está al principio del archivo [TBD].

Después de un procesamiento tan aproximado del paquete con un archivo, se lanzó con éxito la copia de seguridad de toda la máquina en el recurso compartido NFS. El montaje de la copia de seguridad también fue exitoso. Entonces, creo que para realizar una copia de seguridad de una máquina con Elbrus PDK, descargado "así" sin ninguna obligación, Veeam Agent para Linux es definitivamente adecuado. Incluso después de todas las modificaciones con un archivo.

Por supuesto, la distribución del sistema operativo Elbrus no es compatible formalmente, ya que no está incluida en la lista de compatibles. Además, Veeam Agent para Linux no fue probado por el departamento de control de calidad, así que eso. no hay apoyo (al menos en el momento de la publicación del artículo).

Espero que el artículo sea de utilidad para quienes estén intentando implementar la orden No. 334 del 29.06.2017 de junio de XNUMX. El mío para ti... [TBD].

Fuente: habr.com

Añadir un comentario