Kopia zapasowa systemu Linux z firmy Veeam w systemie operacyjnym Elbrus. Zastępstwo importu ['?' | „.” | '!']

Cześć wszystkim
Najnowsze artykuły na temat Habré Substytucja importu w praktyce. Część 1. Opcje и Muzyka nie grała długo… czyli jak Elbrus OS nigdy nie stał się darmowy nie pozostawił mnie obojętnym. Postanowiłem przestudiować to zagadnienie w kontekście zadania tworzenia kopii zapasowych. Co więcej, w ten artykuł Wspomniano o produktach Veeam Software, co oznacza, że ​​problem może mieć znaczenie szczególnie w kontekście substytucji importu.

Kopia zapasowa systemu Linux z firmy Veeam w systemie operacyjnym Elbrus. Zastępstwo importu ['?' | „.” | '!']
oryginalne źródło obrazu

W pierwszej kolejności zdecydowałem się pobrać system Elbrus OS, a właściwie samą dostępną dystrybucję dla architektury x86_64, zobaczyć jak to działa i spróbować zainstalować na nim Veeam Agenta dla Linuksa. Jeśli chcesz wiedzieć co z tego wyszło, zajrzyj do cat.

A więc mała dygresja, gdyby ktoś nie wiedział. „Elbrus” taki właśnie jest procesor z dość specyficznym systemem dowodzenia. Oprócz tego istnieje oprogramowanie Elbrus OS. I – wbrew powszechnemu przekonaniu – do obsługi Elbrus OS nie jest konieczne posiadanie systemu sprzętowego opartego na procesorze Elbrus. Istnieje „PDK „Elbrus” dla x86” - w rzeczywistości pojawił się w domenie publicznej w postaci dysku instalacyjnego. Swoją drogą jest tam przypis „PDK - zestaw deweloperski platformy, zestaw deweloperski” – świetnie, czyli znaczy, że jest tam przynajmniej kompilator.

Kolejny mały, przymusowy odwrót. Fakt jest taki, że kiedyś miałem do czynienia z domowym oprogramowaniem, takim jak MSVS i Baguette RTOS. Miałem doświadczenie w pracy z krajowymi komponentami, w tym z procesorem firmy MCST. Dlatego z całą odpowiedzialnością mogę stwierdzić, że jest w tym zakresie pewna specyfika i będę starał się nie poruszać jej w artykule. Kiedy naprawdę chcę, dodam tag [do ustalenia]. Spróbujemy więc obejść się bez jawnego trollowania i banalnego jęczenia. W końcu trzeba zrozumieć rosyjski przemysł obronny i agencje rządowe. Duży kraj - mały budżet.. [do ustalenia].

Etap zerowy - pobierać. Warto zauważyć, że wiadomość o udostępnieniu systemu Elbrus OS wywołała oddźwięk do tego stopnia, że ​​serwer dystrybucyjny padł. [do ustalenia] Podziękowania dla Yandexa i inżyniera, którzy pomyśleli o przeniesieniu go tam. Więc prędkość pobierania jest dobra.

Pierwszy etap - instalacja. Zainstalowałem go na pierwszym hypervisorze, który był dostępny do bezpłatnego użytku. Przydzieliłem dwa rdzenie, kilka gigabajtów pamięci RAM, 32 MB na wideo (pomyślałem, że będzie interfejs graficzny). Dysk jest jak zwykle - 32 GB.
Zacząłem instalację. Nie korzystałem z instrukcji instalacji, więc nie mogę się na ten temat wypowiadać. Interfejs instalacyjny TUI jest mocno minimalistyczny.

Kopia zapasowa systemu Linux z firmy Veeam w systemie operacyjnym Elbrus. Zastępstwo importu ['?' | „.” | '!']
No cóż, świetnie, poradzimy sobie bez myszy.

Udało mi się otworzyć następne okno przy drugiej próbie. Dlaczego nie wybrać domyślnego urządzenia sr0 [do ustalenia] podczas instalacji z dysku?
Wybierz źródło CD-ROM i przejdź dalej.

Kopia zapasowa systemu Linux z firmy Veeam w systemie operacyjnym Elbrus. Zastępstwo importu ['?' | „.” | '!']

Wybierając strefę czasową, nagle zdałem sobie sprawę, że system korzysta z procesu init boot, a ja pracuję z TTY0.

Kopia zapasowa systemu Linux z firmy Veeam w systemie operacyjnym Elbrus. Zastępstwo importu ['?' | „.” | '!']

OK, w takim razie zaklasyfikujmy „Elbrus” jako społeczność Staroobrzędowcy[do ustalenia]. W zasadzie jest to dobre: ​​nie musisz pytać o kod źródłowy, aby zobaczyć, jak działa proces pobierania, ponieważ wszystko jest napisane w skrypcie.

Reszta jest prawie nieistotna: układamy wszystko i zgadzamy się. Po drodze dowiadujemy się, że używane jest jądro 3.14.79-13.84. Hmm, Debian 7 miał wersję 3.2 [do ustalenia].

Następnie wybierz domyślny podział dysku i... Pojawia się ostrzeżenie:

Kopia zapasowa systemu Linux z firmy Veeam w systemie operacyjnym Elbrus. Zastępstwo importu ['?' | „.” | '!']

Hmm, jakoś automatyczne partycjonowanie nie radziło sobie dobrze z dyskiem 32-gigabajtowym. Nie zmieniałem dysku, zakończyłem zadanie ręcznym partycjonowaniem dysku w stylu „wszystko w jednym”. Musiałem zainstalować ext3, ponieważ /boot nie mógł znajdować się w ext4.
System pojawił się bez żadnych incydentów.

Drugi etap - szukać alternatyw.
Po przeszukaniu zawartości drugiego dysku zorientowałem się, że jest to repozytorium z dodatkowymi plikami. w paczkach. Patrząc na plik /etc/apt/sources.list, zdałem sobie sprawę, że należy go zamontować w /mnt/cdrom. Ale nie znalazłem pliku /etc/os-release. Istnieje jednak wersja /etc/mcst z zawartością 3.0-rc36. Prawdopodobnie jest to wersja 3.0 - wydaje się pasować, ale rc36? Ogólnie rzecz biorąc, oprogramowanie innych firm najprawdopodobniej nie będzie w stanie rozpoznać tej dystrybucji w klasyczny sposób.

Na partycji root moją uwagę przykuł katalog /mcst i tam z zapartym tchem odkryłem /mcst/backup. Oznacza to, że istnieje narzędzie do tworzenia kopii zapasowych wbudowane w system! „Świetnie” – pomyślałem. „Zobaczymy, jak to działa!”

Okazało się, że istnieje skrypt bash o wielkości 4 KB /mcst/bin/backup, który umożliwia kopiowanie plików. Domyślnie - do katalogu /mcst/backup. W kodzie źródłowym spodziewałem się zobaczyć polecenie rsync, ale nie ma go w konfiguracji domyślnej. Skrypt po prostu kopiuje pliki. Polecenie wygląda mniej więcej tak:

cp -rpdx <file backup> <file>

Cały plik /mcst/bin/backup znajduje się tutajOd razu ostrzegam, że sam ten skrypt nie wystarczy do pełnego zrozumienia. Ściąga funkcje z /mcst/bin/source, który jest czymś w rodzaju biblioteki funkcji. Nie uwzględniłem go (44 KB).

#!/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

Chociaż może czegoś nie zrozumiałem? Może ktoś może wyjaśnić w komentarzach: w jaki sposób ten skrypt zapewnia bezpieczne i niezawodne tworzenie kopii zapasowych danych? [do ustalenia]

Nawiasem mówiąc, rsync jest zawarty w dodatku. repozytoria. Wersja 3.1.3. Myślę, że używanie rsync jest nadal lepszą alternatywą dla aplikacji /mcst/bin/backup.

Następnie zdecydowałem się założyć świeży Agent Veeam dla Linuksa. Ktoś zapyta: „Co ma z tym wspólnego Veeam i substytucja importu?” Tak, nie ma go w rejestrze, ale posiada certyfikat FSTEC, co oznacza, że ​​w przypadku braku alternatyw można z niego skorzystać. Spędzanie piętnastu minut na alternatywach z rejestr, udało mi się znaleźć 3 linki do słowa „kopia zapasowa” (żaden nie był związany z moim pytaniem dotyczącym słowa „rezerwa”). Nie przeprowadziłem dogłębnej analizy tych programów, więc nie będę próbował oceniać ich przydatności do tworzenia kopii zapasowych komputerów z systemem Linux. Kto potrzebuje, wyciągnie własne wnioski i podzieli się nimi w komentarzach.

Etap trzeci — instalacja narzędzia Veeam Agent dla systemu Linux.
Zatem narzędzie Veeam Agent dla systemu Linux składa się z dwóch pakietów: modułu jądra veeamsnap (nawiasem mówiąc, źródło tutaj) oraz zastrzeżony kod przestrzeni użytkownika w postaci pakietu Veeam.

Był jeden mały problem z instalacją modułu jądra - brakujący pakiet dkms. Jest to usługa umożliwiająca budowanie modułów jądra ze źródeł. Z reguły jest dostępny we wszystkich dystrybucjach deb. Musiałem pobrać go z repozytorium deb innej firmy. Ucieszyło mnie to, że pakiet nie jest zależny od architektury, więc pasuje jak natywny. Dlaczego nie znalazł się na liście dostępnych pakietów, a raczej nie został opracowany [do ustalenia]? Być może zakłada się, że nikt nie powinien budować i uruchamiać modułów jądra innych niż MCST. Naprawdę istnieje tu rozbieżność - ponieważ istnieją nagłówki Linuksa. Oznacza to, że moduł, w razie potrzeby, można zmontować ręcznie i uruchomić za pomocą skryptu po uruchomieniu maszyny. Myślę, że nie powinieneś oczekiwać częstych aktualizacji od MCST [do ustalenia].

„OK, moduł zainstalowany – najtrudniejsza część już za nami” – pomyślałem… Pakiet Veeam dla repozytorium deb jest przeznaczony dla platformy amd64, a system operacyjny Elbrus ma platformę x86_64 [do ustalenia]. Różnica jest oczywiście tylko w nazwie, ale ta różnica powoduje, że prawie wszystkie pakiety z zewnętrznych repozytoriów deb są niekompatybilne z systemem operacyjnym Elbrus. To irytujące nieporozumienie można w prosty sposób wyeliminować: wystarczy rozebrać pakiet, poprawić informacje o architekturze i złożyć go z powrotem. Jak to zrobić Wygooglowałem to natychmiast.

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

Kolejnym problemem są zależności. Wydaje się, że niezbędne pliki tam są, ale pakietów nie. Można było odnieść wrażenie, że nazwy opakowań odbiegały od ich „importowanych odpowiedników”. Być może biblioteki są pakowane inaczej. Nie wdawałem się w szczegóły, usunąłem prawie wszystkie zależności i instalacja poszła dalej.

Następnie pojawiły się problemy z kodem startowym usługi. Brakowało skryptu /lib/init/vars.sh. Z jakiegoś powodu Elbrus radzi sobie bez niego, więc go też usuniemy. Następnie musieliśmy zastąpić funkcję wysyłania komunikatów: brakowało funkcji log_daemon_msg i log_end_msg. Poszperając w pliku /lib/lsb/init-functions, znalazłem funkcję log_success_msg - przyda się nam do eksperymentów. Nawiasem mówiąc, w pliku /lib/lsb/init-functions linia „# Source SuSE`s rcfunctions” znajduje się na początku pliku [TBD].

Po tak zgrubnym przetworzeniu pakietu z plikiem pomyślnie uruchomiono tworzenie kopii zapasowej całej maszyny na udziale NFS. Montaż zapasowy również przebiegł pomyślnie. Dlatego uważam, że do tworzenia kopii zapasowych komputera za pomocą pakietu Elbrus PDK, pobranego „tak po prostu” bez żadnych zobowiązań, zdecydowanie nadaje się Veeam Agent dla Linuksa. Nawet po wszystkich modyfikacjach pliku.

Oczywiście pakiet dystrybucyjny Elbrus OS nie jest formalnie obsługiwany, ponieważ nie znajduje się na liście obsługiwanych. Ponadto narzędzie Veeam Agent dla systemu Linux nie było na nim testowane przez dział kontroli jakości, więc te. nie ma wsparcia (przynajmniej w momencie publikacji artykułu).

Mam nadzieję, że artykuł będzie przydatny dla tych, którzy próbują wdrożyć rozporządzenie nr 334 z dnia 29.06.2017 czerwca XNUMX r. Moje dla ciebie... [do ustalenia].

Źródło: www.habr.com

Dodaj komentarz