Backup Linux de la Veeam pe sistemul de operare Elbrus. Substituție de import ['?' | '.' | '!']

Buna ziua.
Articole recente despre Habré Înlocuirea importurilor în practică. Partea 1. Opțiuni и Muzica nu a fost redată mult timp... sau cum Elbrus OS nu a devenit niciodată liber nu m-a lăsat indiferent. Am decis să studiez această problemă în contextul sarcinii de rezervă. Mai mult, în acest articol Sunt menționate produsele Veeam Software, ceea ce înseamnă că problema poate fi relevantă în special în contextul înlocuirii importurilor.

Backup Linux de la Veeam pe sistemul de operare Elbrus. Înlocuirea importurilor ['?' | '.' | '!']
sursa originală a imaginii

În primul rând, am decis să descarc sistemul de operare Elbrus, sau mai bine zis, doar distribuția disponibilă pentru arhitectura x86_64, să văd cum funcționează și să încerc să instalez Veeam Agent pentru Linux pe el. Dacă doriți să știți ce a ieșit din asta, vă rugăm să vedeți cat.

Deci, o mică digresiune, în cazul în care cineva nu știe. „Elbrus” este așa procesor cu un sistem de comandă destul de specific. Pe lângă acesta, există software-ul Elbrus OS. Și – contrar unei concepții greșite obișnuite – pentru ca sistemul de operare Elbrus să funcționeze, nu este necesar să existe un sistem hardware bazat pe procesorul Elbrus. Există „PDK „Elbrus” pentru x86” - de fapt, a apărut în domeniul public sub forma unui disc de instalare. Apropo, există o notă de subsol „PDK - kit de dezvoltare a platformei, kit de dezvoltator” - grozav, asta înseamnă că există cel puțin un compilator acolo.

O altă mică retragere forțată. Cert este că odată m-am ocupat de software-ul autohton, cum ar fi MSVS și Baguette RTOS. Am avut experiență de lucru cu componente casnice, inclusiv un procesor de la MCST. Prin urmare, pot spune cu toată responsabilitatea că există o anumită specificitate în acest domeniu și voi încerca să nu ating asta în articol. Când vreau cu adevărat, voi pune eticheta [TBD]. Așa că vom încerca să facem fără trolling și gemete banale. În cele din urmă, industria rusă de apărare și agențiile guvernamentale trebuie înțelese. Țară mare - buget mic.. [TBD].

Etapa zero - Descarca. Este de remarcat faptul că vestea că sistemul de operare Elbrus a devenit disponibil a provocat o rezonanță, atât de mult încât serverul de distribuție a căzut. [TBD] Mulțumesc lui Yandex și inginerului care s-au gândit să-l mute acolo. Deci viteza de descărcare este bună.

Prima etapă - instalare. L-am instalat pe primul hypervisor care era disponibil pentru utilizare gratuită. Am alocat două nuclee, câteva giga de RAM, 32 MB pentru video (va fi o interfață grafică, m-am gândit). Discul este ca de obicei - 32 GB.
Am inceput instalarea. Nu am folosit instrucțiunile de instalare, așa că nu pot comenta. Interfața de instalare a TUI este extrem de minimalistă.

Backup Linux de la Veeam pe sistemul de operare Elbrus. Înlocuirea importurilor ['?' | '.' | '!']
Ei bine, ne putem descurca fără șoarece.

Am reușit următoarea fereastră la a doua încercare. De ce nu selectați dispozitivul implicit sr0 [TBD] când instalați de pe disc?
Selectați sursa CD-ROM și continuați.

Backup Linux de la Veeam pe sistemul de operare Elbrus. Înlocuirea importurilor ['?' | '.' | '!']

În timp ce selectam fusul orar, mi-am dat seama brusc că sistemul folosește procesul de pornire init și lucrez de la TTY0.

Backup Linux de la Veeam pe sistemul de operare Elbrus. Înlocuirea importurilor ['?' | '.' | '!']

Bine, atunci să clasificăm „Elbrus” ca comunitate Bătrâni credincioși[TBD]. În principiu, acest lucru este bine: nu trebuie să cereți codul sursă pentru a vedea cum funcționează procesul de descărcare, deoarece totul este scriptat.

Restul este aproape lipsit de importanță: punem totul și suntem de acord. Pe parcurs, aflăm că nucleul este folosit 3.14.79-13.84. Hmm, Debian 7 avea 3.2 [TBD].

Apoi, selectați partiționarea implicită a discului și... Vedem un avertisment:

Backup Linux de la Veeam pe sistemul de operare Elbrus. Înlocuirea importurilor ['?' | '.' | '!']

Hmm, cumva, partiționarea automată nu s-a descurcat bine cu un disc de 32 de giga. Nu am schimbat discul; am finalizat misiunea cu partiționarea manuală a discului în stilul „all-in-one”. A trebuit să instalez ext3, deoarece /boot nu putea fi în ext4.
Sistemul a apărut fără incidente.

Doua etapă - căutarea de alternative.
După ce am scotocit prin conținutul celui de-al doilea disc, mi-am dat seama că acesta este un depozit cu suplimentar. în pachete. Și uitându-mă la /etc/apt/sources.list, mi-am dat seama că trebuie montat în /mnt/cdrom. Dar nu am găsit /etc/os-release. Dar există /etc/mcst-versiune cu conținutul 3.0-rc36. 3.0 este probabil versiunea - pare să se potrivească, dar rc36? În general, software-ul terțului cel mai probabil nu va putea recunoaște această distribuție în modul clasic.

În partiția rădăcină, directorul /mcst îmi atrage atenția și acolo, cu inima năucită, am descoperit /mcst/backup. Adică, există un instrument de rezervă și este încorporat în sistem! „Grozat”, m-am gândit, „Hai să vedem cum funcționează!”

S-a dovedit că există un script bash de 4Kb /mcst/bin/backup care oferă copierea fișierelor. Implicit - în directorul /mcst/backup. În codul sursă mă așteptam să văd comanda rsync, dar nu este în configurația implicită. Scriptul pur și simplu copiază fișierele. Comanda arată cam așa:

cp -rpdx <file backup> <file>

Întregul fișier /mcst/bin/backup este aiciVă avertizez imediat că acest script în sine nu este suficient pentru a înțelege pe deplin. Extrage funcții din /mcst/bin/source, care este ceva ca o bibliotecă de funcții. Nu l-am inclus (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

Deși, poate nu am înțeles ceva? Poate cineva poate explica în comentarii: cum asigură acest script o copie de rezervă sigură și fiabilă a datelor? [TBD]

rsync, apropo, este inclus în supliment. depozite. Versiunea 3.1.3. Cred că utilizarea rsync este încă o alternativă mai bună la aplicația /mcst/bin/backup.

În continuare, am decis să pun una proaspătă Agent Veeam pentru Linux. Cineva va întreba: „Ce legătură are Veeam și înlocuirea importurilor cu asta?” Da, nu este in registru, dar este certificat de FSTEC, ceea ce inseamna ca in lipsa alternativelor poate fi folosit. Petrecând cincisprezece minute pe alternative de la registru, am reușit să găsesc 3 link-uri pentru cuvântul „backup” (nici unul legat de întrebarea mea pentru cuvântul „rezervă”). Nu am făcut o analiză profundă a acestor programe, așa că nu voi încerca să judec cât de potrivite sunt pentru a face copii de rezervă ale mașinilor care rulează Linux. Cine are nevoie de el va trage propria concluzie și o va împărtăși în comentarii.

etapa a treia — instalarea Veeam Agent pentru Linux.
Deci, Veeam Agent pentru Linux constă din două pachete: modulul kernel veeamsnap (apropo, sursa aici) și codul proprietar al spațiului utilizator sub forma pachetului veeam.

A existat o mică problemă cu instalarea modulului kernel - pachetul dkms lipsă. Acesta este un serviciu care vă permite să construiți module de kernel din sursă. De regulă, este disponibil pentru toate distribuțiile deb. A trebuit să-l descarc dintr-un depozit deb terță parte. Un lucru care m-a bucurat este că pachetul nu depinde de arhitectură, așa că se potrivește ca unul nativ. De ce nu a fost inclus în lista de pachete disponibile sau, mai degrabă, nu a fost dezvoltat [TBD]? Poate că se presupune că nimeni nu ar trebui să construiască și să ruleze module de nucleu care nu sunt MCST. Există într-adevăr o discrepanță aici - deoarece există anteturi Linux. Adică, modulul, dacă se dorește, poate fi asamblat manual și lansat printr-un script atunci când mașina pornește. Cred că nu ar trebui să vă așteptați la actualizări frecvente de la MCST [TBD].

„OK, modulul este instalat - partea cea mai grea s-a terminat”, m-am gândit... Pachetul veeam pentru depozitul deb este pentru platforma amd64, iar sistemul de operare Elbrus are o platformă x86_64 [TBD]. Diferența, desigur, este doar în nume, dar această diferență face ca aproape toate pachetele din depozitele deb terțe să fie incompatibile cu sistemul de operare Elbrus. Această neînțelegere enervantă poate fi eliminată simplu: doar dezasamblați pachetul, corectați informațiile despre arhitectură și puneți-l la loc. Cum să o facă A căutat-o ​​pe Google imediat.

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

O altă problemă sunt dependențele. Fișierele necesare par să fie acolo, dar pachetele nu sunt. Impresia a fost că numele pachetelor diferă de „analogii lor importați”. Poate că bibliotecile sunt ambalate diferit. Nu am intrat în prea multe detalii, am eliminat aproape toate dependențele și instalarea a continuat.

Apoi au apărut probleme cu codul de pornire al serviciului. Scriptul /lib/init/vars.sh lipsea. Din anumite motive, Elbrus se descurcă fără el, așa că îl vom elimina și noi. În continuare, a trebuit să înlocuim funcția de ieșire a mesajului: funcțiile log_daemon_msg și log_end_msg lipseau. După ce am scotocit în fișierul /lib/lsb/init-functions, am găsit funcția log_success_msg - ne va fi bine pentru experimente. Apropo, în fișierul /lib/lsb/init-functions linia „# Source SuSE`s rc functions” se află la începutul fișierului [TBD].

După o astfel de procesare brută a pachetului cu un fișier, a fost lansată cu succes copierea de rezervă a întregii mașini pe partajarea NFS. Montarea de rezervă a avut, de asemenea, succes. Așadar, cred că pentru a face backup unei mașini cu Elbrus PDK, descărcat „așa” fără nicio obligație, Veeam Agent pentru Linux este cu siguranță potrivit. Chiar și după toate modificările cu un fișier.

Desigur, kitul de distribuție Elbrus OS nu este acceptat oficial, deoarece nu este inclus în lista celor acceptate. În plus, Veeam Agent pentru Linux nu a fost testat pe el de către departamentul QA, deci acelea. nu există suport (cel puțin la momentul publicării articolului).

Sper că articolul va fi de folos celor care încearcă să pună în aplicare ordinul nr. 334 din 29.06.2017 iunie XNUMX. Al meu pentru tine... [TBD].

Sursa: www.habr.com

Adauga un comentariu