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

Pozdrav.
Nedavni članci na Habréu Supstitucija uvoza u praksi. Dio 1. Mogućnosti и Glazba nije dugo svirala... ili kako Elbrus OS nikada nije postao besplatan nije me ostavio ravnodušnim. Odlučio sam proučiti ovo pitanje u kontekstu zadatka sigurnosne kopije. Štoviše, u ovaj članak Spominju se Veeam Software proizvodi, što znači da problem može biti relevantan upravo u kontekstu supstitucije uvoza.

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

Prije svega, odlučio sam preuzeti Elbrus OS, odnosno samo dostupnu distribuciju za x86_64 arhitekturu, vidjeti kako radi i pokušati instalirati Veeam Agent za Linux na njega. Ako želite znati što je ispalo iz ovoga, pogledajte cat.

Dakle, mala digresija, ako netko ne zna. "Elbrus" je takav procesor s prilično specifičnim sustavom zapovijedanja. Osim njega, tu je i softver Elbrus OS. I – suprotno uvriježenom mišljenju – za rad Elbrus OS-a nije potrebno imati hardverski sustav temeljen na Elbrus procesoru. Postoji “PDK “Elbrus” za x86” - zapravo, pojavio se u javnoj domeni u obliku instalacijskog diska. Usput, postoji fusnota "PDK - komplet za razvoj platforme, komplet za razvojne programere" - super, to znači da tamo postoji barem kompajler.

Još jedno malo prisilno povlačenje. Činjenica je da sam se svojedobno bavio domaćim softverom, poput MSVS i Baguette RTOS. Imao sam iskustva u radu s domaćim komponentama, uključujući procesor iz MCST-a. Stoga s punom odgovornošću mogu reći da u ovom području postoji određena specifičnost koju ću nastojati ne dirati u članku. Kad stvarno budem htio, stavit ću oznaku [TBD]. Stoga ćemo pokušati bez otvorenog trolanja i banalnog kukanje. Na kraju, treba razumjeti rusku obrambenu industriju i državne agencije. Velika država - mali budžet.. [TBD].

Nulta faza - preuzimanje datoteka. Važno je napomenuti da je vijest da je Elbrus OS postao dostupan izazvala odjek, toliko da je distribucijski poslužitelj pao. [TBD] Hvala Yandexu i inženjeru koji ga je smislio premjestiti tamo. Dakle, brzina preuzimanja je dobra.

Prva faza - instalacija. Instalirao sam ga na prvi hipervizor koji je bio dostupan za besplatno korištenje. Dodijelio sam dvije jezgre, nekoliko koncerata RAM-a, 32 MB za video (mislio sam da će biti grafičko sučelje). Disk je kao i obično - 32 GB.
Započeo sam instalaciju. Nisam koristio upute za instalaciju, pa ih ne mogu komentirati. Instalacijsko sučelje TUI-ja je izrazito minimalističko.

Linux Backup iz Veeama 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] kada instalirate s diska?
Odaberite CD-ROM izvor i krenite dalje.

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

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

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

OK, onda klasificirajmo "Elbrus" kao zajednicu starovjerci[TBD]. U principu, ovo je dobro: ne morate tražiti izvorni kod da biste vidjeli kako funkcionira proces preuzimanja, budući da je sve skriptirano.

Ostalo je gotovo nevažno: sve stavimo i dogovorimo se. Usput doznajemo da se kernel koristi 3.14.79-13.84. Hmm, Debian 7 je imao 3.2 [TBD].

Zatim odaberite zadano particioniranje diska i... Vidimo upozorenje:

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

Hmm, nekako se automatsko particioniranje nije dobro nosilo s diskom od 32 GB. Nisam mijenjao disk; dovršio sam zadatak ručnim particioniranjem diska u stilu "sve u jednom". Morao sam instalirati ext3 jer /boot nije mogao biti u ext4.
Sustav je nastao bez incidenata.

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

U root particiji upada mi u oči direktorij /mcst, a tu sam, klonulog srca, otkrio /mcst/backup. Odnosno, postoji alat za sigurnosno kopiranje i ugrađen je u sustav! "Sjajno", pomislio sam, "Da vidimo kako ovo funkcionira!"

Ispostavilo se da postoji 4Kb bash skripta /mcst/bin/backup koja omogućuje kopiranje datoteka. Prema zadanim postavkama - u direktorij /mcst/backup. Očekivao sam vidjeti naredbu rsync u izvornom kodu, ali ona nije u zadanoj konfiguraciji. Skripta jednostavno kopira datoteke. Naredba izgleda otprilike ovako:

cp -rpdx <file backup> <file>

Cijela datoteka /mcst/bin/backup je ovdjeOdmah vas upozoravam da sama ova skripta nije dovoljna za potpuno razumijevanje. Povlači funkcije iz /mcst/bin/source, što je nešto poput knjižnice 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

Iako, možda nešto nisam razumio? Možda netko može objasniti u komentarima: kako ova skripta osigurava sigurno i pouzdano sigurnosno kopiranje podataka? [TBD]

Usput, rsync je uključen u dodatak. spremišta. Verzija 3.1.3. Mislim da je korištenje rsync još uvijek bolja alternativa aplikaciji /mcst/bin/backup.

Zatim sam odlučio staviti svježi Veeam Agent za Linux. Netko će pitati: “Kakve veze imaju Veeam i zamjena uvoza?” 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 alternativama iz registar, uspio sam pronaći 3 veze za riječ "rezervna kopija" (nijedna vezana uz moje pitanje za riječ "rezerva"). Nisam napravio duboku analizu ovih programa, tako da neću pokušavati prosuditi koliko su prikladni za sigurnosno kopiranje strojeva koji pokreću Linux. Kome treba, sam će izvući zaključak i podijeliti ga u komentarima.

Faza tri — instalacija Veeam Agenta za Linux.
Dakle, Veeam Agent za Linux sastoji se od dva paketa: veeamsnap kernel modul (usput, izvor ovdje) i vlasnički kôd korisničkog prostora u obliku paketa veeam.

Postojao je jedan mali problem s instalacijom modula kernela - nedostajao je dkms paket. Ovo je usluga koja vam omogućuje izradu modula jezgre iz izvora. U pravilu je dostupan na svim deb distribucijama. Morao sam ga preuzeti iz deb repozitorija treće strane. Jedna stvar koja me razveselila je da paket ne ovisi o arhitekturi, tako da odgovara kao native. Zašto nije uključen u popis dostupnih paketa, odnosno nije razvijen [TBD]? Možda se pretpostavlja da nitko ne bi trebao graditi i pokretati module kernela koji nisu MCST. Ovdje stvarno postoji razlika - budući da postoje zaglavlja za linux. Odnosno, modul se, po želji, može sastaviti ručno i pokrenuti skriptom kada se stroj pokrene. Mislim da ne biste trebali očekivati ​​česta ažuriranja od MCST-a [TBD].

“OK, modul je instaliran - najteži dio je prošao,” pomislio sam... Veeam paket za deb repozitorij je za amd64 platformu, a Elbrus OS ima x86_64 [TBD] platformu. Razlika je, naravno, samo u nazivu, ali ta razlika čini gotovo sve pakete iz deb repozitorija trećih strana nekompatibilnim s Elbrus OS-om. Ovaj dosadni nesporazum može se jednostavno ukloniti: samo rastavite paket, ispravite informacije o arhitekturi i ponovno ga sastavite. Kako to učiniti Proguglao odmah.

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

Drugi problem su ovisnosti. Čini se da su potrebne datoteke tamo, ali paketi nisu. Dojam je bio da se nazivi paketa razlikuju od njihovih "uvezenih analoga". Možda su knjižnice pakirane drugačije. Nisam ulazio u detalje, uklonio sam gotovo sve ovisnosti i instalacija je krenula.

Zatim su se pojavili problemi s kodom za pokretanje usluge. Nedostajala je skripta /lib/init/vars.sh. Iz nekog razloga, Elbrus se snalazi 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 kopanja po datoteci /lib/lsb/init-functions, našao sam funkciju log_success_msg - dobro će nam doći za eksperimente. Usput, u datoteci /lib/lsb/init-functions redak “# Source SuSE`s rc functions” nalazi se na početku datoteke [TBD].

Nakon tako grube obrade paketa s datotekom, sigurnosna kopija cijelog stroja na NFS dijeljenju je uspješno pokrenuta. Sigurnosno montiranje također je bilo uspješno. Dakle, vjerujem da je Veeam Agent za Linux definitivno prikladan za sigurnosno kopiranje stroja s Elbrus PDK-om, preuzetog “samo tako” bez ikakvih obaveza. Čak i nakon svih izmjena s datotekom.

Naravno, distribucijski komplet Elbrus OS nije formalno podržan jer nije uključen u popis podržanih. Osim toga, QA odjel nije testirao Veeam Agent za Linux na njemu, tako da oni. nema podrške (barem u trenutku objave članka).

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

Izvor: www.habr.com

Dodajte komentar