Backup Linux da Veeam su sistema operativo Elbrus. Sostituzione dell'importazione ['?' | '.' | '!']

Ciao.
Articoli recenti su Habré Sostituzione delle importazioni in pratica. Parte 1. Opzioni и La musica non è stata riprodotta a lungo... o il modo in cui il sistema operativo Elbrus non è mai diventato gratuito non mi ha lasciato indifferente. Ho deciso di studiare questo problema nel contesto dell'attività di backup. Inoltre, dentro questo articolo Vengono menzionati i prodotti Veeam Software, il che significa che il problema potrebbe essere rilevante specificamente nel contesto della sostituzione delle importazioni.

Backup Linux da Veeam su sistema operativo Elbrus. Sostituzione dell'importazione ['?' | '.' | '!']
fonte dell'immagine originale

Innanzitutto ho deciso di scaricare Elbrus OS, o meglio, solo la distribuzione disponibile per l'architettura x86_64, vedere come funziona e provare a installarci Veeam Agent for Linux. Se vuoi sapere cosa ne è venuto fuori, vedi cat.

Quindi, una piccola digressione, nel caso qualcuno non lo sapesse. "Elbrus" è così processore con un sistema di comando piuttosto specifico. Oltre a ciò, c'è il software Elbrus OS. E, contrariamente alla credenza popolare, per far funzionare il sistema operativo Elbrus non è necessario disporre di un sistema hardware basato sul processore Elbrus. Esiste il "PDK "Elbrus" per x86" - infatti, è apparso di pubblico dominio sotto forma di disco di installazione. A proposito, c'è una nota a piè di pagina "PDK - kit di sviluppo della piattaforma, kit di sviluppo" - fantastico, significa che c'è almeno un compilatore lì.

Un'altra piccola ritirata forzata. Il fatto è che una volta mi occupavo di software domestico, come MSVS e Baguette RTOS. Ho avuto esperienza di lavoro con componenti domestici, incluso un processore MCST. Pertanto posso dire con piena responsabilità che esiste una certa specificità in questo ambito e cercherò di non toccarla nell'articolo. Quando lo desidero davvero, inserirò il tag [TBD]. Quindi proveremo a fare a meno del trolling totale e dei lamenti banali. Alla fine, è necessario comprendere l’industria della difesa e le agenzie governative russe. Grande paese - piccolo budget.. [TBD].

Stadio zero - scaricamento. È interessante notare che la notizia che il sistema operativo Elbrus è diventato disponibile ha suscitato risonanza, tanto che il server di distribuzione è andato in tilt. [TBD] Grazie a Yandex e all'ingegnere che hanno pensato di spostarlo lì. Quindi la velocità di download è buona.

La prima fase - installazione. L'ho installato sul primo hypervisor disponibile per l'uso gratuito. Ho assegnato due core, un paio di giga di RAM, 32 MB per il video (ci sarà un'interfaccia grafica, pensavo). Il disco è come al solito: 32 GB.
Ho iniziato l'installazione. Non ho usato le istruzioni di installazione, quindi non posso commentarlo. L'interfaccia di installazione TUI è fortemente minimalista.

Backup Linux da Veeam su sistema operativo Elbrus. Sostituzione dell'importazione ['?' | '.' | '!']
Bene, fantastico, possiamo fare a meno del mouse.

Sono riuscito a visualizzare la finestra successiva al secondo tentativo. Perché non selezionare il dispositivo predefinito sr0 [TBD] durante l'installazione da disco?
Seleziona la sorgente CD-ROM e vai avanti.

Backup Linux da Veeam su sistema operativo Elbrus. Sostituzione dell'importazione ['?' | '.' | '!']

Mentre selezionavo il fuso orario, mi sono improvvisamente reso conto che il sistema utilizza il processo di avvio init e sto lavorando da TTY0.

Backup Linux da Veeam su sistema operativo Elbrus. Sostituzione dell'importazione ['?' | '.' | '!']

OK, allora classifichiamo “Elbrus” come comunità Vecchi credenti[Da definire]. In linea di principio va bene: non è necessario chiedere il codice sorgente per vedere come funziona il processo di download, poiché tutto è scriptato.

Il resto è quasi senza importanza: mettiamo tutto e siamo d'accordo. Strada facendo, scopriamo che viene utilizzato il kernel 3.14.79-13.84. Hmm, Debian 7 aveva 3.2 [TBD].

Successivamente, seleziona il partizionamento del disco predefinito e... Viene visualizzato un avviso:

Backup Linux da Veeam su sistema operativo Elbrus. Sostituzione dell'importazione ['?' | '.' | '!']

Hmm, per qualche motivo il partizionamento automatico non funzionava bene con un disco da 32 GB. Non ho cambiato il disco; ho completato la ricerca con il partizionamento manuale del disco in stile "all-in-one". Ho dovuto installare ext3, poiché /boot non poteva essere in ext4.
Il sistema è arrivato senza incidenti.

La seconda fase - cercare alternative.
Dopo aver frugato nel contenuto del secondo disco, mi sono reso conto che si tratta di un repository con funzionalità aggiuntive. nei pacchetti. E guardando /etc/apt/sources.list, mi sono reso conto che deve essere montato in /mnt/cdrom. Ma non ho trovato /etc/os-release. Ma esiste /etc/mcst-version con il contenuto 3.0-rc36. Probabilmente la versione è 3.0: sembra adatta, ma rc36? In generale, molto probabilmente il software di terze parti non sarà in grado di riconoscere questa distribuzione in modo classico.

Nella partizione root, la directory /mcst attira la mia attenzione e lì, con un tuffo al cuore, ho scoperto /mcst/backup. Cioè, esiste uno strumento di backup ed è integrato nel sistema! “Fantastico”, ho pensato, “vediamo come funziona!”

Si è scoperto che esiste uno script bash da 4Kb /mcst/bin/backup che fornisce la copia dei file. Per impostazione predefinita, nella directory /mcst/backup. Nel codice sorgente mi aspettavo di vedere il comando rsync, ma non è nella configurazione predefinita. Lo script copia semplicemente i file. Il comando è simile al seguente:

cp -rpdx <file backup> <file>

L'intero file /mcst/bin/backup è quiTi avverto subito che questa sceneggiatura da sola non è sufficiente per comprenderla appieno. Estrae funzioni da /mcst/bin/source, che è qualcosa come una libreria di funzioni. Non l'ho incluso (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

Anche se forse non ho capito qualcosa? Forse qualcuno può spiegare nei commenti: in che modo questo script garantisce un backup dei dati sicuro e affidabile? [Da definire]

rsync, tra l'altro, è incluso nel componente aggiuntivo. repository. Versione 3.1.3. Penso che usare rsync sia ancora un'alternativa migliore all'applicazione /mcst/bin/backup.

Successivamente, ho deciso di metterne uno nuovo Agente Veeam per Linux. Qualcuno si chiederà: “Cosa c’entrano Veeam e la sostituzione delle importazioni?” Sì, non è nel registro, ma è certificato FSTEC, il che significa che in assenza di alternative può essere utilizzato. Trascorrere quindici minuti su alternative da Registro di sistema, sono riuscito a trovare 3 collegamenti per la parola "backup" (nessuno correlato alla mia domanda sulla parola "riserva"). Non ho effettuato un'analisi approfondita di questi programmi, quindi non proverò a giudicare quanto siano adatti per il backup di macchine che eseguono Linux. Chiunque ne abbia bisogno trarrà la propria conclusione e la condividerà nei commenti.

Fase tre — installazione di Veeam Agent for Linux.
Quindi, Veeam Agent for Linux è composto da due pacchetti: il modulo kernel veeamsnap (a proposito, fonte qui) e codice proprietario dello spazio utente sotto forma di pacchetto veeam.

Si è verificato un piccolo problema con l'installazione del modulo del kernel: il pacchetto dkms mancante. Questo è un servizio che ti consente di creare moduli del kernel dai sorgenti. Di norma, è disponibile su tutte le distribuzioni deb. Ho dovuto scaricarlo da un repository deb di terze parti. Una cosa che mi ha reso felice è che il pacchetto non dipende dall'architettura, quindi si adatta come se fosse nativo. Perché non è stato incluso nella lista dei pacchetti disponibili, o meglio, non è stato sviluppato [da definire]? Forse si presume che nessuno dovrebbe costruire ed eseguire moduli del kernel non MCST. C'è davvero una discrepanza qui, poiché ci sono gli header linux. Cioè, il modulo, se lo si desidera, può essere assemblato manualmente e avviato da uno script all'avvio della macchina. Penso che non dovresti aspettarti aggiornamenti frequenti da MCST [TBD].

"OK, il modulo è installato: la parte più difficile è passata", ho pensato... Il pacchetto veeam per il repository deb è per la piattaforma amd64 e il sistema operativo Elbrus ha una piattaforma x86_64 [TBD]. La differenza, ovviamente, è solo nel nome, ma questa differenza rende quasi tutti i pacchetti provenienti da repository deb di terze parti incompatibili con il sistema operativo Elbrus. Questo fastidioso malinteso può essere eliminato semplicemente: basta smontare il pacchetto, correggere le informazioni sull'architettura e rimontarlo. Come farlo Ho cercato su Google immediatamente.

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

Un altro problema sono le dipendenze. I file necessari sembrano essere lì, ma i pacchetti no. L'impressione era che i nomi dei pacchetti differissero dai loro "analoghi importati". Forse le librerie sono confezionate diversamente. Non sono entrato troppo nei dettagli, ho rimosso quasi tutte le dipendenze e l’installazione è andata avanti.

Poi sono emersi problemi con il codice di avvio del servizio. Mancava lo script /lib/init/vars.sh. Per qualche ragione, Elbrus riesce a farne a meno, quindi rimuoveremo anche quello. Successivamente, abbiamo dovuto sostituire la funzione di output del messaggio: mancavano le funzioni log_daemon_msg e log_end_msg. Dopo aver frugato nel file /lib/lsb/init-functions, ho trovato la funzione log_success_msg: ci sarà utile per gli esperimenti. A proposito, nel file /lib/lsb/init-functions la riga "# Source SuSE`s rcfunctions" si trova all'inizio del file [TBD].

Dopo un'elaborazione così approssimativa del pacchetto con un file, il backup dell'intera macchina sulla condivisione NFS è stato avviato con successo. Anche il montaggio del backup ha avuto esito positivo. Quindi, credo che per eseguire il backup di una macchina con Elbrus PDK, scaricato “così” senza alcun obbligo, Veeam Agent for Linux sia sicuramente adatto. Anche dopo tutte le modifiche con un file.

Naturalmente, il kit di distribuzione del sistema operativo Elbrus non è formalmente supportato, poiché non è incluso nell'elenco di quelli supportati. Inoltre, Veeam Agent for Linux non è stato testato dal reparto QA, quindi quelli. non c'è supporto (almeno al momento della pubblicazione dell'articolo).

Spero che l'articolo possa essere utile a coloro che stanno cercando di attuare l'ordinanza n. 334 del 29.06.2017 giugno XNUMX. Il mio per te... [TBD].

Fonte: habr.com

Aggiungi un commento