Linux Backup iz Veeam-a na Elbrus OS-u. Zamjena uvoza ['?' | '.' | '!']

Pozdrav svima.
Nedavni članci o Habréu Zamjena uvoza u praksi. Dio 1. Opcije и Muzika nije puštala dugo vremena ... ili kako Elbrus OS nije postao slobodan nije me ostavio ravnodušnim. Odlučio sam da proučim ovo pitanje u kontekstu rezervnog zadatka. Štaviše, u ovaj članak Spominju se Veeam softverski proizvodi, što znači da problem može biti relevantan posebno u kontekstu zamjene uvoza.

Linux Backup iz Veeam-a na Elbrus OS-u. Zamjena uvoza ['?' | '.' | '!']
izvorni izvor slike

Prije svega, odlučio sam preuzeti Elbrus OS, odnosno samo dostupnu distribuciju za arhitekturu x86_64, vidjeti kako funkcionira i pokušati instalirati Veeam Agent za Linux na njega. Ako želite da znate šta je ispalo iz ovoga, pogledajte mačku.

Dakle, mala digresija, ako neko ne zna. "Elbrus" je takav procesor sa prilično specifičnim komandnim sistemom. Pored njega, tu je i Elbrus OS softver. I – suprotno uobičajenoj zabludi – da bi Elbrus OS radio, nije neophodno imati hardverski sistem baziran na Elbrus procesoru. Postoji “PDK “Elbrus” za x86” - u stvari, pojavio se u javnom vlasništvu u obliku instalacionog diska. Uzgred, postoji fusnota „PDK - razvojni komplet platforme, komplet za razvojne programere“ - odlično, što znači da postoji barem kompajler.

Još jedno malo prisilno povlačenje. Činjenica je da sam se nekada bavio domaćim softverom, kao što su MSVS i Baguette RTOS. Imao sam iskustvo rada sa domaćim komponentama, uključujući i procesor iz MCST-a. Stoga sa punom odgovornošću mogu reći da postoji određena specifičnost u ovoj oblasti i trudiću se da je ne dotičem u članku. Kada zaista želim, staviću oznaku [TBD]. Zato ćemo pokušati bez otvorenog trolanja i banalnog stenjanja. Na kraju, rusku odbrambenu industriju i vladine agencije treba razumjeti. Velika zemlja - mali budžet.. [TBD].

Zero stage - skinuti. Važno je napomenuti da je vijest da je Elbrus OS postao dostupan izazvala rezonanciju, toliko da je server za distribuciju pao. [TBD] Hvala Yandexu i inženjeru koji je smislio da ga preseli tamo. Dakle, brzina preuzimanja je dobra.

U prvoj fazi - instalacija. Instalirao sam ga na prvom hipervizoru koji je bio dostupan za besplatno korištenje. Dodijelio sam dvije jezgre, par giga RAM-a, 32 MB za video (mislio sam da će postojati grafički interfejs). Disk je kao i obično - 32 GB.
Počeo sam sa instalacijom. Nisam koristio upute za instalaciju, pa ne mogu komentirati. TUI instalacioni interfejs je veoma minimalistički.

Linux Backup iz Veeam-a na Elbrus OS-u. Zamjena uvoza ['?' | '.' | '!']
Pa super, možemo i bez miša.

Uspio sam sljedeći prozor iz drugog pokušaja. Zašto ne biste odabrali zadani uređaj sr0 [TBD] prilikom instaliranja s diska?
Odaberite CD-ROM izvor i nastavite dalje.

Linux Backup iz Veeam-a na Elbrus OS-u. Zamjena uvoza ['?' | '.' | '!']

Dok sam birao vremensku zonu, odjednom sam shvatio da sistem koristi init boot proces, a ja radim od TTY0.

Linux Backup iz Veeam-a na Elbrus OS-u. Zamjena uvoza ['?' | '.' | '!']

OK, onda hajde da klasifikujemo "Elbrus" kao zajednicu Old Believers[TBD]. U principu, ovo je dobro: ne morate tražiti izvorni kod da vidite kako proces preuzimanja funkcionira, jer je sve skriptirano.

Ostalo je gotovo nevažno: stavljamo sve i slažemo se. Usput saznajemo da se kernel koristi 3.14.79-13.84. Hmm, Debian 7 je imao 3.2 [TBD].

Zatim izaberite podrazumevano particionisanje diska i... Vidimo upozorenje:

Linux Backup iz Veeam-a na Elbrus OS-u. Zamjena uvoza ['?' | '.' | '!']

Hmm, nekako se automatsko particioniranje nije dobro nosilo s diskom od 32 gigabajta. Nisam mijenjao disk; zadatak sam završio ručnim particioniranjem diska u stilu "sve u jednom". Morao sam da instaliram ext3, pošto /boot nije mogao biti u ext4.
Sistem je prošao bez incidenata.

Druga faza - traženje alternativa.
Nakon što sam preturao po sadržaju drugog diska, shvatio sam da je ovo spremište sa dodatnim. u paketima. I gledajući /etc/apt/sources.list, shvatio sam da ga treba montirati u /mnt/cdrom. Ali nisam našao /etc/os-release. Ali postoji /etc/mcst-verzija sa sadržajem 3.0-rc36. 3.0 je vjerovatno verzija - izgleda da odgovara, ali rc36? Općenito, softver treće strane najvjerovatnije neće moći prepoznati ovu distribuciju na klasičan način.

U korijenskoj particiji, direktorij /mcst mi je zapao za oko i tamo sam, s potonulom u srcu, otkrio /mcst/backup. Odnosno, postoji alat za pravljenje rezervnih kopija i ugrađen je u sistem! „Odlično“, pomislio sam, „Da vidimo kako ovo funkcioniše!“

Ispostavilo se da postoji 4Kb bash skripta /mcst/bin/backup koja omogućava kopiranje datoteka. Po defaultu - u /mcst/backup direktorij. Očekivao sam da ću u izvornom kodu vidjeti komandu rsync, ali ona nije u zadanoj konfiguraciji. Skripta jednostavno kopira fajlove. Naredba izgleda otprilike ovako:

cp -rpdx <file backup> <file>

Cijeli fajl /mcst/bin/backup je ovdjeOdmah vas upozoravam da ovaj scenario sam po sebi nije dovoljan za potpuno razumijevanje. Povlači funkcije iz /mcst/bin/source, što je nešto poput biblioteke funkcija. Nisam ga uključio (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

Mada, možda nešto nisam razumeo? Možda neko može objasniti u komentarima: kako ova skripta osigurava siguran i pouzdan backup podataka? [TBD]

rsync je, inače, uključen u dodatak. spremišta. Verzija 3.1.3. Mislim da je korištenje rsync i dalje bolja alternativa aplikaciji /mcst/bin/backup.

Zatim sam odlučio da stavim novi Veeam Agent za Linux. Neko će pitati: "Kakve veze Veeam i zamjena uvoza imaju s tim?" Da, nije u registru, ali je certificiran od strane FSTEC-a, što znači da se u nedostatku alternativa može koristiti. Provodeći petnaest minuta na alternative iz registar, uspio sam pronaći 3 veze za riječ “rezervna” (nijedna nije vezana za moje pitanje za riječ “rezerva”). Nisam uradio duboku analizu ovih programa, tako da neću pokušavati da procenim koliko su prikladni za pravljenje rezervnih kopija mašina koje koriste Linux. Kome zatreba izvući će svoj zaključak i podijeliti ga u komentarima.

Treća faza — instalacija Veeam Agenta za Linux.
Dakle, Veeam Agent za Linux se sastoji od dva paketa: veeamsnap kernel modula (usput, izvor ovdje) i vlasnički kod korisničkog prostora u obliku veeam paketa.

Postojao je jedan mali problem sa instaliranjem modula kernela - nedostajući dkms paket. Ovo je usluga koja vam omogućava da napravite module kernela iz izvora. U pravilu je dostupan na svim deb distribucijama. Morao sam da ga preuzmem iz deb repozitorija treće strane. Jedna stvar koja me obradovala je to što paket ne zavisi od arhitekture, pa se uklapa kao izvorni. Zašto nije uvršten na listu dostupnih paketa, odnosno nije razvijen [TBD]? Možda se pretpostavlja da nitko ne bi trebao graditi i pokretati module kernela koji nisu MCST. Ovde zaista postoji neslaganje - pošto postoje linux zaglavlja. To jest, modul se, po želji, može sastaviti ručno i pokrenuti skriptom kada se mašina pokrene. Mislim da ne biste trebali očekivati ​​česta ažuriranja od MCST-a [TBD].

“U redu, modul je instaliran – najteži dio je gotov”, pomislio sam... Veeam paket za deb spremište je za amd64 platformu, a Elbrus OS ima x86_64 [TBD] platformu. Razlika je, naravno, samo u imenu, ali ova razlika čini skoro sve pakete iz deb repozitorija trećih strana nekompatibilnim sa Elbrus OS-om. Ovaj dosadni nesporazum se može jednostavno otkloniti: samo rastavite paket, ispravite informacije o arhitekturi i ponovo ga sastavite. Kako uraditi Guglao odmah.

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

Drugi problem su zavisnosti. Čini se da potrebni fajlovi postoje, ali paketi nisu. Utisak je bio da se nazivi pakovanja razlikuju od njihovih „uvezenih analoga“. Možda su biblioteke drugačije pakirane. Nisam ulazio previše u detalje, uklonio sam skoro sve zavisnosti i instalacija je krenula dalje.

Tada su se pojavili problemi sa startnim kodom usluge. Nedostajala je skripta /lib/init/vars.sh. Elbrus se iz nekog razloga snalazi i bez njega, pa ćemo i njega ukloniti. Zatim smo morali zamijeniti funkciju izlaza poruke: nedostajale su funkcije log_daemon_msg i log_end_msg. Nakon što sam preturao po datoteci /lib/lsb/init-functions, pronašao sam funkciju log_success_msg - bit će nam dobra za eksperimente. Usput, u datoteci /lib/lsb/init-functions red “# Source SuSE`s rc functions” je na početku datoteke [TBD].

Nakon ovako grube obrade paketa sa fajlom, sigurnosna kopija cijele mašine na NFS share je uspješno pokrenuta. Rezervno montiranje je također bilo uspješno. Dakle, vjerujem da je Veeam Agent za Linux definitivno prikladan za pravljenje rezervne kopije mašine sa Elbrus PDK-om, preuzetom „baš tako“ bez ikakvih obaveza. Čak i nakon svih modifikacija sa fajlom.

Naravno, Elbrus OS distribucijski komplet nije formalno podržan, jer nije uključen u listu podržanih. Osim toga, Veeam Agent za Linux nije testiran na njemu od strane QA odjela, pa oni. nema podrške (barem u trenutku objavljivanja članka).

Nadam se da će članak biti koristan onima koji pokušavaju da sprovedu naredbu br. 334 od 29.06.2017. juna XNUMX. Moje tebi... [TBD].

izvor: www.habr.com

Dodajte komentar