Linux Backup fra Veeam på Elbrus OS. Importerstatning ['?' | '.' | '!']

Hei alle sammen.
Nylige artikler om Habré Importsubstitusjon i praksis. Del 1. Alternativer и Musikken spilte ikke lenge ... eller hvordan Elbrus OS aldri ble gratis forlot meg ikke likegyldig. Jeg bestemte meg for å studere dette problemet i sammenheng med sikkerhetskopieringsoppgaven. Dessuten, i denne artikkelen Veeam Software-produkter er nevnt, noe som betyr at problemet kan være relevant spesifikt i sammenheng med importsubstitusjon.

Linux Backup fra Veeam på Elbrus OS. Importerstatning ['?' | '.' | '!']
original bildekilde

Først av alt bestemte jeg meg for å laste ned Elbrus OS, eller rettere sagt, bare den tilgjengelige distribusjonen for x86_64-arkitekturen, se hvordan den fungerer og prøve å installere Veeam Agent for Linux på den. Hvis du vil vite hva som kom ut av dette, se katt.

Så, en liten digresjon, i tilfelle noen ikke vet det. «Elbrus» er sånn prosessor med et ganske spesifikt kommandosystem. I tillegg til det er det Elbrus OS-programvare. Og - i motsetning til hva mange tror - for å betjene Elbrus OS, er det ikke nødvendig å ha et maskinvaresystem basert på Elbrus-prosessoren. Det er "PDK "Elbrus" for x86" - faktisk dukket det opp i det offentlige domene i form av en installasjonsdisk. Forresten, det er en fotnote "PDK - plattformutviklingssett, utviklersett" - flott, det betyr at det i det minste er en kompilator der.

Nok en liten tvungen retrett. Faktum er at jeg en gang jobbet med innenlandsk programvare, som MSVS og Baguette RTOS. Jeg hadde erfaring med å jobbe med husholdningskomponenter, inkludert en prosessor fra MCST. Derfor kan jeg med fullt ansvar si at det er en viss spesifisitet på dette området, og jeg vil prøve å ikke berøre det i artikkelen. Når jeg virkelig vil, setter jeg taggen [TBD]. Så vi skal prøve å klare oss uten direkte trolling og banal stønn. Til slutt må den russiske forsvarsindustrien og offentlige etater bli forstått. Stort land - lite budsjett. [TBD].

Null trinn - nedlasting. Det er bemerkelsesverdig at nyheten om at Elbrus OS har blitt tilgjengelig forårsaket resonans, så mye at distribusjonsserveren gikk ned. [TBD] Takk til Yandex og ingeniøren som tenkte på å flytte den dit. Så nedlastingshastigheten er god.

Den første fasen - installasjon. Jeg installerte den på den første hypervisoren som var tilgjengelig for gratis bruk. Jeg tildelte to kjerner, et par spillejobber RAM, 32 MB for video (det blir et grafisk grensesnitt, trodde jeg). Disken er som vanlig - 32 GB.
Jeg startet installasjonen. Jeg brukte ikke installasjonsveiledningen, så jeg kan ikke kommentere den. TUI-installasjonsgrensesnittet er svært minimalistisk.

Linux Backup fra Veeam på Elbrus OS. Importerstatning ['?' | '.' | '!']
Vel, flott, vi klarer oss uten mus.

Jeg klarte neste vindu på andre forsøk. Hvorfor ikke velge standardenheten sr0 [TBD] når du installerer fra disk?
Velg CD-ROM-kilden og gå videre.

Linux Backup fra Veeam på Elbrus OS. Importerstatning ['?' | '.' | '!']

Mens jeg valgte tidssonen, innså jeg plutselig at systemet bruker init-oppstartsprosessen, og jeg jobber fra TTY0.

Linux Backup fra Veeam på Elbrus OS. Importerstatning ['?' | '.' | '!']

OK, la oss klassifisere "Elbrus" som et fellesskap Gamle troende[TBD]. I prinsippet er dette bra: du trenger ikke be om kildekoden for å se hvordan nedlastingsprosessen fungerer, siden alt er skriptet.

Resten er nesten uviktig: vi legger alt og er enige. Underveis finner vi ut at kjernen er brukt 3.14.79-13.84. Hmm, Debian 7 hadde 3.2 [TBD].

Deretter velger du standard diskpartisjonering og... Vi ser en advarsel:

Linux Backup fra Veeam på Elbrus OS. Importerstatning ['?' | '.' | '!']

Hmm, på en eller annen måte taklet den automatiske partisjoneringen ikke bra med en 32 gig-disk. Jeg endret ikke disken; jeg fullførte oppdraget med manuell diskpartisjonering i "alt-i-ett"-stilen. Jeg måtte installere ext3, siden /boot ikke kunne være i ext4.
Systemet kom opp uten hendelser.

Den andre fasen - søk etter alternativer.
Etter å ha rotet gjennom innholdet på den andre disken, innså jeg at dette er et depot med ekstra. i pakker. Og ser på /etc/apt/sources.list, innså jeg at den må monteres i /mnt/cdrom. Men jeg fant ikke /etc/os-release. Men det er /etc/mcst-versjon med innholdet 3.0-rc36. 3.0 er nok versjonen - den ser ut til å passe, men rc36? Generelt vil tredjepartsprogramvare mest sannsynlig ikke kunne gjenkjenne denne distribusjonen på klassisk måte.

I rotpartisjonen fanger /mcst-katalogen meg, og der, med et synkende hjerte, oppdaget jeg /mcst/backup. Det vil si at det er et sikkerhetskopieringsverktøy, og det er innebygd i systemet! "Flott," tenkte jeg, "la oss se hvordan dette fungerer!"

Det viste seg at det er et 4Kb bash-skript /mcst/bin/backup som gir filkopiering. Som standard - til /mcst/backup-katalogen. I kildekoden forventet jeg å se rsync-kommandoen, men den er ikke i standardkonfigurasjonen. Skriptet kopierer ganske enkelt filer. Kommandoen ser omtrent slik ut:

cp -rpdx <file backup> <file>

Hele filen /mcst/bin/backup er herJeg advarer deg med en gang om at dette manuset alene ikke er nok til å forstå fullt ut. Den henter funksjoner fra /mcst/bin/source, som er noe sånt som et funksjonsbibliotek. Jeg tok ikke med det (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

Selv om jeg kanskje ikke forsto noe? Kanskje noen kan forklare i kommentarene: hvordan sikrer dette skriptet sikker og pålitelig sikkerhetskopiering av data? [TBD]

rsync er forresten inkludert i tillegget. depoter. Versjon 3.1.3. Jeg tror at bruk av rsync fortsatt er et bedre alternativ til /mcst/bin/backup-applikasjonen.

Deretter bestemte jeg meg for å sette en ny Veeam Agent for Linux. Noen vil spørre: "Hva har Veeam og importsubstitusjon å gjøre med det?" Ja, det er ikke i registeret, men det er sertifisert av FSTEC, noe som betyr at det i mangel av alternativer kan brukes. Bruker femten minutter på alternativer fra register, var jeg i stand til å finne 3 lenker for ordet "backup" (ingen relatert til spørsmålet mitt for ordet "reserve"). Jeg har ikke gjort en dyp analyse av disse programmene, så jeg vil ikke prøve å bedømme hvor egnet de er for å sikkerhetskopiere maskiner som kjører Linux. Den som trenger det vil trekke sin egen konklusjon og dele den i kommentarfeltet.

Stage tre — installasjon av Veeam Agent for Linux.
Så, Veeam Agent for Linux består av to pakker: veeamsnap-kjernemodulen (forresten, kilde her) og proprietær brukerplasskode i form av veeam-pakken.

Det var ett lite problem med å installere kjernemodulen - den manglende dkms-pakken. Dette er en tjeneste som lar deg bygge kjernemoduler fra kilden. Som regel er den tilgjengelig på alle deb-distribusjoner. Jeg måtte laste den ned fra et tredjeparts deb-lager. En ting som gjorde meg glad er at pakken ikke er avhengig av arkitekturen, så den passer som en innfødt. Hvorfor ble den ikke inkludert i listen over tilgjengelige pakker, eller rettere sagt, ikke utviklet [TBD]? Kanskje det antas at ingen skal bygge og kjøre noen ikke-MCST-kjernemoduler. Det er virkelig et avvik her - siden det er linux-headere. Det vil si at modulen, om ønskelig, kan settes sammen for hånd og startes av et script når maskinen starter. Jeg tror du ikke bør forvente hyppige oppdateringer fra MCST [TBD].

"OK, modulen er installert - den vanskeligste delen er over," tenkte jeg... Veeam-pakken for deb-lageret er for amd64-plattformen, og Elbrus OS har en x86_64 [TBD]-plattform. Forskjellen er selvfølgelig bare i navnet, men denne forskjellen gjør nesten alle pakker fra tredjeparts deb-repositories inkompatible med Elbrus OS. Denne irriterende misforståelsen kan enkelt elimineres: bare demonter pakken, korriger informasjonen om arkitekturen og sett den sammen igjen. Hvordan gjøre det Googlet det umiddelbart.

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

Et annet problem er avhengigheter. De nødvendige filene ser ut til å være der, men pakkene er ikke det. Inntrykket var at navnene på pakkene skilte seg fra deres "importerte analoger". Kanskje er bibliotekene pakket annerledes. Jeg gikk ikke inn for mye detaljer, fjernet nesten alle avhengighetene, og installasjonen gikk videre.

Så dukket det opp problemer med tjenestestartkoden. Skriptet /lib/init/vars.sh manglet. Av en eller annen grunn klarer Elbrus seg uten den, så vi fjerner den også. Deretter måtte vi erstatte meldingsutdatafunksjonen: log_daemon_msg og log_end_msg funksjonene manglet. Etter å ha rotet rundt i filen /lib/lsb/init-functions, fant jeg log_success_msg-funksjonen - den vil være bra for oss for eksperimenter. Forresten, i filen /lib/lsb/init-functions er linjen "# Source SuSE`s rc functions" i begynnelsen av [TBD]-filen.

Etter en så grov behandling av pakken med en fil, ble sikkerhetskopieringen av hele maskinen på NFS-andelen vellykket lansert. Backup-monteringen var også vellykket. Så jeg tror at for å sikkerhetskopiere en maskin med Elbrus PDK, lastet ned "akkurat sånn" uten noen forpliktelser, er Veeam Agent for Linux definitivt egnet. Selv etter alle endringene med en fil.

Elbrus OS-distribusjonssettet støttes selvfølgelig ikke formelt, siden det ikke er inkludert i listen over støttede. I tillegg ble ikke Veeam Agent for Linux testet på den av QA-avdelingen, så de. det er ingen støtte (i hvert fall på tidspunktet for publisering av artikkelen).

Jeg håper artikkelen vil være nyttig for de som prøver å implementere ordre nr. 334 av 29.06.2017. juni XNUMX. Min til deg... [TBD].

Kilde: www.habr.com

Legg til en kommentar