„Linux“ atsarginė kopija iš Veeam „Elbrus“ OS. Importo pakaitalas ['?' | '.' | '!']

Sveiki visi.
Naujausi straipsniai apie Habré Importo pakeitimas praktikoje. 1 dalis. Parinktys и Muzika skambėjo neilgai... arba kaip Elbrus OS niekada netapo laisva nepaliko abejingos. Nusprendžiau išnagrinėti šią problemą atsarginės kopijos kūrimo užduoties kontekste. Be to, į Šis straipsnis Minėti Veeam programinės įrangos produktai, o tai reiškia, kad problema gali būti aktuali būtent importo pakeitimo kontekste.

„Linux“ atsarginė kopija iš Veeam „Elbrus“ OS. Importo pakaitalas ['?' | '.' | '!']
originalus vaizdo šaltinis

Visų pirma nusprendžiau atsisiųsti Elbrus OS, tiksliau, tik turimą x86_64 architektūros distribuciją, pažiūrėti kaip ji veikia ir pabandyti joje įdiegti Veeam Agent for Linux. Jei norite sužinoti, kas iš to išėjo, žiūrėkite katę.

Taigi, mažas nukrypimas, jei kas nors nežino. „Elbrusas“ yra toks Procesorius su gana specifine komandų sistema. Be jo, yra Elbrus OS programinė įranga. Ir – priešingai populiariems įsitikinimams – norint valdyti „Elbrus“ OS, nebūtina turėti „Elbrus“ procesoriaus pagrindu sukurtos techninės įrangos. Yra „PDK „Elbrus“, skirtas x86“ - iš tikrųjų jis pasirodė viešoje erdvėje diegimo disko pavidalu. Beje, yra išnaša "PDK - platformos kūrimo rinkinys, kūrėjo rinkinys" - puiku, tai reiškia, kad ten yra bent jau kompiliatorius.

Dar vienas nedidelis priverstinis pasitraukimas. Faktas yra tas, kad kažkada turėjau reikalų su vietine programine įranga, tokia kaip MSVS ir Baguette RTOS. Turėjau patirties dirbant su buitiniais komponentais, įskaitant MCST procesorių. Todėl su visa atsakomybe galiu pasakyti, kad šioje srityje yra tam tikra specifika ir pasistengsiu straipsnyje to neliesti. Kai labai norėsiu, įdėsiu žymą [TBD]. Taigi pasistengsime apsieiti be atviro trolinimo ir banalaus dejavimo. Galiausiai reikia suprasti Rusijos gynybos pramonę ir vyriausybines agentūras. Didelė šalis – mažas biudžetas.. [TBD].

Nulinis etapas - parsisiųsti. Pastebėtina, kad žinia, kad Elbrus OS tapo prieinama, sukėlė tokį rezonansą, kad paskirstymo serveris sugedo. [TBD] Ačiū „Yandex“ ir inžinieriui, kuris sumanė jį ten perkelti. Taigi atsisiuntimo greitis yra geras.

Pirmasis etapas - montavimas. Įdiegiau jį į pirmąjį hipervizorių, kurį buvo galima nemokamai naudoti. Paskyriau du branduolius, porą gigų RAM, 32 MB video (bus grafinė sąsaja, galvojau). Diskas kaip įprasta – 32 GB.
Pradėjau diegti. Diegimo instrukcijų nesinaudojau, todėl negaliu jos komentuoti. TUI diegimo sąsaja yra labai minimalistinė.

„Linux“ atsarginė kopija iš Veeam „Elbrus“ OS. Importo pakaitalas ['?' | '.' | '!']
Na, puiku, galime apsieiti ir be pelės.

Kitas langas man pavyko antruoju bandymu. Kodėl diegiant iš disko nepasirinkus numatytojo įrenginio sr0 [TBD]?
Pasirinkite CD-ROM šaltinį ir eikite toliau.

„Linux“ atsarginė kopija iš Veeam „Elbrus“ OS. Importo pakaitalas ['?' | '.' | '!']

Renkantis laiko juostą staiga supratau, kad sistema naudoja init įkrovos procesą, o aš dirbu iš TTY0.

„Linux“ atsarginė kopija iš Veeam „Elbrus“ OS. Importo pakaitalas ['?' | '.' | '!']

Gerai, tada priskirkime „Elbrusą“ prie bendruomenės Sentikiai[TBD]. Iš esmės tai yra gerai: jums nereikia prašyti šaltinio kodo, kad pamatytumėte, kaip veikia atsisiuntimo procesas, nes viskas yra surašyta.

Likusi dalis beveik nesvarbu: viską dedame ir susitariame. Pakeliui sužinome, kad branduolys naudojamas 3.14.79-13.84. Hmm, Debian 7 turėjo 3.2 [TBD].

Toliau pasirinkite numatytąjį disko skaidymą ir... Matome įspėjimą:

„Linux“ atsarginė kopija iš Veeam „Elbrus“ OS. Importo pakaitalas ['?' | '.' | '!']

Hmm, kažkaip automatinis skaidymas nesusitvarkė su 32 GB disku. Aš nekeičiau disko; užduotį užbaigiau rankiniu disko skaidymu „viskas viename“ stiliumi. Turėjau įdiegti ext3, nes /boot negalėjo būti ext4.
Sistema atsirado be incidentų.

Antrasis etapas - ieškoti alternatyvų.
Išknisęs antrojo disko turinį supratau, kad tai saugykla su papildomais. pakuotėse. Ir pažvelgęs į /etc/apt/sources.list supratau, kad jį reikia prijungti /mnt/cdrom. Bet neradau /etc/os-release. Tačiau yra /etc/mcst-version su 3.0-rc36 turiniu. 3.0 tikriausiai yra versija – atrodo, kad tinka, bet rc36? Apskritai trečiųjų šalių programinė įranga greičiausiai negalės atpažinti šio platinimo klasikiniu būdu.

Šakniniame skaidinyje mano dėmesį patraukia /mcst katalogas ir ten su grimztančia širdimi atradau /mcst/backup. Tai yra, yra atsarginis įrankis ir jis integruotas į sistemą! „Puiku, – pagalvojau, – pažiūrėkime, kaip tai veikia!

Paaiškėjo, kad yra 4Kb bash scenarijus /mcst/bin/backup, kuris suteikia failų kopijavimą. Pagal numatytuosius nustatymus – į /mcst/backup katalogą. Šaltinio kode tikėjausi pamatyti komandą rsync, bet ji nėra numatytosios konfigūracijos. Scenarijus tiesiog nukopijuoja failus. Komanda atrodo maždaug taip:

cp -rpdx <file backup> <file>

Visas failas /mcst/bin/backup yra čiaIš karto perspėju, kad vien šio scenarijaus nepakanka norint iki galo suprasti. Jis ištraukia funkcijas iš /mcst/bin/source, kuri yra kažkas panašaus į funkcijų biblioteką. Aš jo neįtraukiau (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

Nors gal aš kažko nesupratau? Gal kas gali paaiškinti komentaruose: kaip šis scenarijus užtikrina saugią ir patikimą duomenų atsarginę kopiją? [TBD]

rsync, beje, yra įtrauktas į priedą. saugyklos. 3.1.3 versija. Manau, kad rsync naudojimas vis dar yra geresnė alternatyva programai /mcst/bin/backup.

Toliau nusprendžiau įdėti naują Veeam agentas, skirtas Linux. Kažkas paklaus: „Ką su juo turi Veeam ir importo pakeitimas? Taip, jo nėra registre, bet yra sertifikuota FSTEC, o tai reiškia, kad nesant alternatyvų jį galima naudoti. Penkiolika minučių skiriant alternatyvoms nuo registrą, man pavyko rasti 3 nuorodas į žodį „atsarginė kopija“ (nė viena nesusijusi su mano klausimu dėl žodžio „rezervas“). Aš neatlikau gilios šių programų analizės, todėl nebandysiu spręsti, ar jos tinkamos atsarginėms mašinoms, kuriose veikia Linux, kurti. Kam to reikės, padarys savo išvadą ir pasidalins komentaruose.

Trečiasis etapas — „Veeam Agent“, skirtos „Linux“, įdiegimas.
Taigi „Veeam Agent for Linux“ susideda iš dviejų paketų: „veeamsnap“ branduolio modulio (beje, šaltinis čia) ir patentuotas vartotojo erdvės kodas „veeam“ paketo pavidalu.

Įdiegiant branduolio modulį iškilo viena nedidelė problema – trūkstamas dkms paketas. Tai paslauga, leidžianti kurti branduolio modulius iš šaltinio. Paprastai jis pasiekiamas visuose deb paskirstymuose. Turėjau jį atsisiųsti iš trečiosios šalies duomenų saugyklos. Vienas dalykas, kuris mane nudžiugino, yra tai, kad pakuotė nepriklauso nuo architektūros, todėl tinka kaip vietinė. Kodėl jis nebuvo įtrauktas į galimų paketų sąrašą arba, tiksliau, nebuvo sukurtas [TBD]? Galbūt manoma, kad niekas neturėtų kurti ir paleisti jokių ne MCST branduolio modulių. Čia tikrai yra neatitikimų, nes yra „Linux“ antraštės. Tai reiškia, kad modulį, jei pageidaujama, galima surinkti rankomis ir paleisti pagal scenarijų, kai mašina paleidžiama. Manau, kad neturėtumėte tikėtis dažnų atnaujinimų iš MCST [TBD].

„Gerai, modulis įdiegtas – sunkiausia dalis baigta“, – pagalvojau... Veeam paketas deb saugyklai skirtas amd64 platformai, o Elbrus OS turi x86_64 [TBD] platformą. Žinoma, skirtumas yra tik pavadinime, tačiau dėl šio skirtumo beveik visi paketai iš trečiųjų šalių deb saugyklų yra nesuderinami su Elbrus OS. Šį erzinantį nesusipratimą galima paprasčiausiai pašalinti: tiesiog išardykite pakuotę, pataisykite informaciją apie architektūrą ir vėl sudėkite. Kaip tai padaryti „Google“ tai akimirksniu.

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

Kita problema – priklausomybės. Atrodo, kad reikalingi failai yra, bet paketų nėra. Susidarė įspūdis, kad pakuočių pavadinimai skyrėsi nuo jų „importuotų analogų“. Galbūt bibliotekos supakuotos kitaip. Per daug nesigilinau, pašalinau beveik visas priklausomybes ir diegimas vyko į priekį.

Tada iškilo problemų dėl paslaugos pradžios kodo. Trūko scenarijaus /lib/init/vars.sh. Elbrusas kažkodėl apsieina be jo, todėl pašalinsime ir mes. Tada turėjome pakeisti pranešimo išvesties funkciją: trūko funkcijų log_daemon_msg ir log_end_msg. Pasiknisęs /lib/lsb/init-functions faile radau funkciją log_success_msg – ji bus naudinga mums eksperimentams. Beje, faile /lib/lsb/init-functions eilutė „# Source SuSE`s rc functions“ yra [TBD] failo pradžioje.

Po tokio grubaus paketo apdorojimo su failu buvo sėkmingai paleista viso įrenginio atsarginė kopija NFS dalinime. Atsarginis tvirtinimas taip pat buvo sėkmingas. Taigi, manau, kad norint sukurti atsarginę mašinos kopiją su Elbrus PDK, atsisiųsta „tiesiog taip“ be jokių įsipareigojimų, „Veeam Agent for Linux“ tikrai tinka. Net ir po visų modifikacijų su failu.

Žinoma, Elbrus OS platinimo rinkinys oficialiai nepalaikomas, nes jis nėra įtrauktas į palaikomų sąrašą. Be to, „Veeam Agent for Linux“ nebuvo išbandytas kokybės užtikrinimo skyriaus, todėl tie. palaikymo nėra (bent jau straipsnio publikavimo metu).

Tikiuosi, kad straipsnis bus naudingas tiems, kurie bando įgyvendinti 334-29.06.2017-XNUMX įsakymą Nr.XNUMX. Mano tau... [TBD].

Šaltinis: www.habr.com

Добавить комментарий