Cześć wszystkim
Najnowsze artykuły na temat Habré
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
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.
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.
Wybierając strefę czasową, nagle zdałem sobie sprawę, że system korzysta z procesu init boot, a ja pracuję z TTY0.
OK, w takim razie zaklasyfikujmy „Elbrus” jako społeczność
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:
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
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,
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ć
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