Sauvegarde Linux de Veeam sur Elbrus OS. Substitution d'importation ['?' | '.' | '!']

Bonjour.
Articles récents sur Habré La substitution des importations dans la pratique. Partie 1. Options и La musique n'a pas duré longtemps... ou comment le système d'exploitation Elbrus n'est jamais devenu gratuit ne m'a pas laissé indifférent. J'ai décidé d'étudier cette question dans le cadre de la tâche de sauvegarde. De plus, dans cet article Les produits Veeam Software sont mentionnés, ce qui signifie que le problème peut être pertinent spécifiquement dans le contexte de la substitution des importations.

Sauvegarde Linux de Veeam sur Elbrus OS. Substitution des importations ['?' | '.' | '!']
source de l'image originale

Tout d'abord, j'ai décidé de télécharger le système d'exploitation Elbrus, ou plutôt uniquement la distribution disponible pour l'architecture x86_64, de voir comment cela fonctionne et d'essayer d'y installer Veeam Agent pour Linux. Si vous voulez savoir ce qui en est ressorti, veuillez consulter le chat.

Alors, une petite digression, au cas où quelqu'un ne le saurait pas. "Elbrus" est comme ça processeur avec un système de commandement assez spécifique. En plus de cela, il existe le logiciel Elbrus OS. Et - contrairement à la croyance populaire - pour faire fonctionner le système d'exploitation Elbrus, il n'est pas nécessaire de disposer d'un système matériel basé sur le processeur Elbrus. Il existe le « PDK « Elbrus » pour x86 » - en fait, il est apparu dans le domaine public sous la forme d'un disque d'installation. À propos, il y a une note de bas de page "PDK - kit de développement de plate-forme, kit de développement" - super, cela signifie qu'il y a au moins un compilateur.

Encore une petite retraite forcée. Le fait est que j'ai déjà eu affaire à des logiciels nationaux, tels que MSVS et Baguette RTOS. J'avais de l'expérience avec des composants nationaux, y compris un processeur de MCST. Par conséquent, je peux dire en toute responsabilité qu'il existe une certaine spécificité dans ce domaine et j'essaierai de ne pas l'aborder dans l'article. Quand j’en aurai vraiment envie, je mettrai le tag [TBD]. On va donc essayer de se passer de purs trolles et de gémissements banals. En fin de compte, il faut comprendre l’industrie de défense russe et les agences gouvernementales. Grand pays - petit budget.. [À déterminer].

Étape zéro - télécharger. Il est à noter que la nouvelle de la disponibilité du système d'exploitation Elbrus a provoqué une résonance, à tel point que le serveur de distribution est tombé en panne. [TBD] Merci à Yandex et à l'ingénieur qui a pensé à le déplacer là-bas. La vitesse de téléchargement est donc bonne.

La première étape -pose. Je l'ai installé sur le premier hyperviseur disponible en utilisation gratuite. J'ai alloué deux cœurs, quelques Go de RAM, 32 Mo pour la vidéo (il y aura une interface graphique, pensais-je). Le disque est comme d'habitude - 32 Go.
J'ai commencé l'installation. Je n'ai pas utilisé les instructions d'installation, je ne peux donc pas faire de commentaire à ce sujet. L'interface d'installation de TUI est extrêmement minimaliste.

Sauvegarde Linux de Veeam sur Elbrus OS. Substitution des importations ['?' | '.' | '!']
Eh bien, super, on peut se passer de souris.

J'ai réussi la fenêtre suivante au deuxième essai. Pourquoi ne pas sélectionner le périphérique par défaut sr0 [TBD] lors de l'installation à partir du disque ?
Sélectionnez la source du CD-ROM et continuez.

Sauvegarde Linux de Veeam sur Elbrus OS. Substitution des importations ['?' | '.' | '!']

En sélectionnant le fuseau horaire, j'ai soudainement réalisé que le système utilise le processus de démarrage init et que je travaille à partir de TTY0.

Sauvegarde Linux de Veeam sur Elbrus OS. Substitution des importations ['?' | '.' | '!']

OK, alors classons « Elbrus » comme communauté Vieux croyants[à déterminer]. En principe, c’est bien : vous n’avez pas besoin de demander le code source pour voir comment fonctionne le processus de téléchargement, puisque tout est scripté.

Le reste n'a presque pas d'importance : on met tout et on est d'accord. En chemin, nous découvrons que le noyau est utilisé 3.14.79-13.84. Hmm, Debian 7 avait 3.2 [à déterminer].

Ensuite, sélectionnez le partitionnement de disque par défaut et... Nous voyons un avertissement :

Sauvegarde Linux de Veeam sur Elbrus OS. Substitution des importations ['?' | '.' | '!']

Hmm, d'une manière ou d'une autre, le partitionnement automatique ne fonctionnait pas bien avec un disque de 32 Go. Je n'ai pas changé le disque, j'ai terminé la quête avec un partitionnement manuel du disque dans le style « tout-en-un ». J'ai dû installer ext3, car /boot ne pouvait pas être dans ext4.
Le système est apparu sans incident.

La deuxième étape - rechercher des alternatives.
Après avoir fouillé dans le contenu du deuxième disque, j'ai réalisé qu'il s'agissait d'un référentiel avec des fichiers supplémentaires. en paquets. Et en regardant /etc/apt/sources.list, j'ai réalisé qu'il devait être monté dans /mnt/cdrom. Mais je n'ai pas trouvé /etc/os-release. Mais il existe /etc/mcst-version avec le contenu 3.0-rc36. 3.0 est probablement la version – elle semble convenir, mais rc36 ? En général, les logiciels tiers ne seront probablement pas en mesure de reconnaître cette distribution de la manière classique.

Dans la partition racine, le répertoire /mcst attire mon attention, et là, le cœur serré, je découvre /mcst/backup. Autrement dit, il existe un outil de sauvegarde, et il est intégré au système ! "Super", ai-je pensé, "Voyons comment ça marche!"

Il s'est avéré qu'il existe un script bash de 4 Ko /mcst/bin/backup qui permet la copie de fichiers. Par défaut - dans le répertoire /mcst/backup. Dans le code source, je m'attendais à voir la commande rsync, mais elle n'est pas dans la configuration par défaut. Le script copie simplement les fichiers. La commande ressemble à ceci :

cp -rpdx <file backup> <file>

Le fichier complet /mcst/bin/backup est iciJe vous préviens tout de suite que ce script seul ne suffit pas à bien comprendre. Il extrait les fonctions de /mcst/bin/source, qui ressemble à une bibliothèque de fonctions. Je ne l'ai pas inclus (44 Ko).

#!/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

Mais peut-être que je n’ai pas compris quelque chose ? Peut-être que quelqu'un pourra expliquer dans les commentaires : comment ce script garantit-il une sauvegarde des données sûre et fiable ? [à déterminer]

rsync, soit dit en passant, est inclus dans le module complémentaire. référentiels. Version 3.1.3. Je pense que l'utilisation de rsync reste une meilleure alternative à l'application /mcst/bin/backup.

Ensuite, j'ai décidé d'en mettre un nouveau Veeam Agent pour Linux. Quelqu’un demandera : « Qu’est-ce que Veeam et la substitution des importations ont à voir là-dedans ? » Oui, il n'est pas inscrit au registre, mais il est certifié par le FSTEC, ce qui signifie qu'en l'absence d'alternatives, il peut être utilisé. Passer quinze minutes sur des alternatives de registre, j'ai pu trouver 3 liens pour le mot « sauvegarde » (aucun en rapport avec ma question pour le mot « réserve »). Je n'ai pas fait une analyse approfondie de ces programmes, je n'essaierai donc pas de juger dans quelle mesure ils sont adaptés à la sauvegarde de machines exécutant Linux. Celui qui en a besoin tirera sa propre conclusion et la partagera dans les commentaires.

Troisième étape — installation de Veeam Agent pour Linux.
Ainsi, Veeam Agent pour Linux se compose de deux packages : le module du noyau veeamsnap (d'ailleurs, source ici) et du code d'espace utilisateur propriétaire sous la forme du package veeam.

Il y a eu un petit problème lors de l'installation du module du noyau : le paquet dkms manquant. Il s'agit d'un service qui vous permet de créer des modules du noyau à partir des sources. En règle générale, il est disponible sur toutes les distributions deb. J'ai dû le télécharger à partir d'un référentiel Deb tiers. Une chose qui m'a fait plaisir, c'est que le package ne dépend pas de l'architecture, il s'adapte donc comme un package natif. Pourquoi n’a-t-il pas été inclus dans la liste des packages disponibles, ou plutôt n’a-t-il pas été développé [à déterminer] ? On suppose peut-être que personne ne devrait créer et exécuter des modules de noyau non MCST. Il y a vraiment une différence ici - puisqu'il y a des en-têtes Linux. Autrement dit, le module, si vous le souhaitez, peut être assemblé à la main et lancé par un script au démarrage de la machine. Je pense que vous ne devriez pas vous attendre à des mises à jour fréquentes de MCST [TBD].

"OK, le module est installé - le plus difficile est passé", ai-je pensé... Le package veeam pour le référentiel deb est destiné à la plate-forme amd64, et le système d'exploitation Elbrus a une plate-forme x86_64 [à déterminer]. La différence, bien sûr, n'est que dans le nom, mais cette différence rend presque tous les packages provenant de référentiels deb tiers incompatibles avec le système d'exploitation Elbrus. Ce malentendu gênant peut être éliminé simplement : il suffit de démonter le package, de corriger les informations sur l'architecture et de le remonter. Comment faire Je l'ai recherché sur Google immédiatement.

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

Un autre problème concerne les dépendances. Les fichiers nécessaires semblent être là, mais pas les packages. L'impression était que les noms des colis différaient de leurs « analogues importés ». Peut-être que les bibliothèques sont emballées différemment. Je ne suis pas entré dans trop de détails, j'ai supprimé presque toutes les dépendances et l'installation s'est poursuivie.

Ensuite, des problèmes sont apparus avec le code de démarrage du service. Le script /lib/init/vars.sh manquait. Pour une raison quelconque, Elbrus s'en passe, nous le supprimerons donc également. Ensuite, nous avons dû remplacer la fonction de sortie de message : les fonctions log_daemon_msg et log_end_msg manquaient. Après avoir fouillé dans le fichier /lib/lsb/init-functions, j'ai trouvé la fonction log_success_msg - ce sera bon pour nous pour les expériences. À propos, dans le fichier /lib/lsb/init-functions, la ligne « # Source SuSE`s rc function » se trouve au début du fichier [TBD].

Après un traitement aussi brutal du package avec un fichier, la sauvegarde de l'intégralité de la machine sur le partage NFS a été lancée avec succès. Le montage de sauvegarde a également réussi. Donc, je pense que pour sauvegarder une machine avec le PDK Elbrus, téléchargé « comme ça » sans aucune obligation, Veeam Agent pour Linux est tout à fait adapté. Même après toutes les modifications avec un fichier .

Bien entendu, le kit de distribution Elbrus OS n'est pas formellement pris en charge, car il n'est pas inclus dans la liste des kits pris en charge. De plus, Veeam Agent pour Linux n'a pas été testé par le service QA, donc ceux-là. il n'y a aucun support (du moins au moment de la publication de l'article).

J'espère que l'article sera utile à ceux qui tentent de mettre en œuvre l'arrêté n°334 du 29.06.2017 juin XNUMX. Le mien à vous... [à déterminer].

Source: habr.com

Ajouter un commentaire