Elbrus 作業系統上來自 Veeam 的 Linux 備份。 導入替換 ['?' | '.' | '!']

大家好。
關於哈布雷的最新文章 實務中的進口替代。 第 1 部分. 選項 и 音樂沒有播放很久…或者厄爾布魯士作業系統從未免費 並沒有讓我無動於衷。 我決定在備份任務的背景下研究這個問題。 此外,在 這篇文章 提到了 Veeam Software 產品,這意味著該問題可能與進口替代有關。

Elbrus 作業系統上來自 Veeam 的 Linux 備份。 導入替換 ['?' | '.' | '!']
原始影像來源

首先,我決定下載 Elbrus OS,或者更確切地說,只下載 x86_64 架構的可用發行版,看看它是如何運作的,並嘗試在其上安裝 Veeam Agent for Linux。 如果你想知道這是怎麼回事,請看貓。

所以,題外話,以防有人不知道。 「厄爾布魯士峰」就是這樣 處理器 有一個相當具體的命令系統。 除此之外,還有 Elbrus OS 軟體。 而且,與普遍的看法相反,要運行 Elbrus 作業系統,並不需要擁有基於 Elbrus 處理器的硬體系統。 有“PDK “Elbrus” for x86” - 事實上,它以安裝碟的形式出現在公共領域。 順便說一句,有一個腳註“PDK - 平台開發套件,開發人員套件” - 太棒了,這意味著那裡至少有一個編譯器。

又是一次小規模的被迫撤退。 事實是我曾經接觸過國產軟體,像是MSVS、Baguette RTOS。 我有使用國產組件的經驗,包括 MCST 的處理器。 因此,我可以負責任地說,這個領域有一定的特殊性,我會盡量不在文章中去觸及它。 當我真的想要的時候,我會貼上標籤[TBD]。 因此,我們將盡量避免公然的惡搞和平庸的抱怨。 最後,俄羅斯國防工業和政府機構需要被理解。 大國 - 小預算..[待定]。

零階段 - 下載。 值得注意的是,Elbrus作業系統上線的消息引起了軒然大波,甚至導致分發伺服器癱瘓。 [TBD] 感謝 Yandex 和考慮將其移至此處的工程師。 所以下載速度還是不錯的。

第一階段 - 安裝。 我將其安裝在第一個可供免費使用的虛擬機器管理程式上。 我分配了兩個核心、幾GB RAM、32 MB 用於視訊(我想會有一個圖形介面)。 磁碟與往常一樣 - 32 GB。
我開始安裝。 我沒有使用安裝說明,所以無法評論。 TUI 安裝介面極為簡約。

Elbrus 作業系統上來自 Veeam 的 Linux 備份。 導入替換 ['?' | '.' | '!']
好吧,太好了,我們可以不用滑鼠了。

我在第二次嘗試中成功進入了下一個視窗。 從磁碟安裝時為什麼不選擇預設設備 sr0 [TBD]?
選擇 CD-ROM 來源並繼續。

Elbrus 作業系統上來自 Veeam 的 Linux 備份。 導入替換 ['?' | '.' | '!']

在選擇時區時,我突然意識到系統使用了init引導進程,而我正在從TTY0工作。

Elbrus 作業系統上來自 Veeam 的 Linux 備份。 導入替換 ['?' | '.' | '!']

好的,那麼我們將「Elbrus」歸類為一個社區 老信徒[待定]。 原則上,這很好:您不需要詢問原始程式碼來查看下載過程如何運作,因為一切都是腳本化的。

其餘的幾乎不重要:我們把一切都放在一起並達成一致。 一路上我們發現使用的核心是3.14.79-13.84。 嗯,Debian 7 有 3.2 [TBD]。

接下來,選擇預設磁碟分割並...我們看到一條警告:

Elbrus 作業系統上來自 Veeam 的 Linux 備份。 導入替換 ['?' | '.' | '!']

嗯,不知何故,自動分割區不能很好地處理 32 GB 磁碟。 我沒有更換磁碟;我以「一體式」方式透過手動磁碟分割完成了任務。 我必須安裝 ext3,因為 /boot 不能在 ext4 中。
系統順利啟動。

第二階段 - 尋找替代方案。
在翻閱第二個磁碟的內容後,我意識到這是一個附加內容的儲存庫。 在包裹中。 查看/etc/apt/sources.list,我意識到它需要安裝在/mnt/cdrom中。 但我沒有找到/etc/os-release。 但 /etc/mcst-version 的內容為 3.0-rc36。 3.0 可能是版本 - 看起來很合適,但是 rc36? 一般來說,第三方軟體很可能無法以經典方式識別此發行版。

在根分區中,/mcst目錄吸引了我的注意,在那裡,我心一沉,發現了/mcst/backup。 也就是說,有一個備份工具,而且是系統內建的! “太好了,”我想,“讓我們看看這是如何運作的!”

原來,有一個4Kb的bash腳本/mcst/bin/backup提供檔案複製功能。 預設 - 到 /mcst/backup 目錄。 在原始程式碼中我期望看到 rsync 命令,但它不在預設配置中。 該腳本只是複製文件。 該命令看起來像這樣:

cp -rpdx <file backup> <file>

整個檔案 /mcst/bin/backup 在這裡我立即警告您,僅此腳本不足以完全理解。 它從 /mcst/bin/source 中提取函數,這類似於函數庫。 我沒有包含它 (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

雖然,也許我沒懂什麼? 也許有人可以在評論中解釋一下:這個腳本是如何保證資料備份安全可靠的? [待定]

順便說一下,rsync 包含在該附加元件中。 儲存庫。 版本 3.1.3。 我認為使用 rsync 仍然是 /mcst/bin/backup 應用程式的更好替代方案。

接下來我決定放一張新的 適用於 Linux 的 Veeam 代理。 有人會問:“Veeam 和進口替代有什麼關係?” 是的,它不在登記冊中,但它已通過 FSTEC 認證,這意味著在沒有替代方案的情況下可以使用它。 花十五分鐘尋找替代方案 登記處,我找到了 3 個關於「備份」一詞的連結(沒有一個與我對「保留」一詞的問題相關)。 我還沒有對這些程式進行深入分析,因此我不會嘗試判斷它們是否適合備份運行 Linux 的機器。 有需要的人會得出自己的結論並在評論中分享。

第三階段 — 安裝適用於 Linux 的 Veeam Agent。
因此,Veeam Agent for Linux 由兩個軟體包組成: veeamsnap 核心模組(順便說一下, 來源在這裡)和 veeam 套件形式的專有用戶空間代碼。

安裝核心模組時遇到一個小問題 - 缺少 dkms 軟體包。 這是一項允許您從原始程式碼建立核心模組的服務。 通常,它在所有 deb 發行版上都可使用。 我必須從第三方 deb 存儲庫下載它。 讓我高興的一件事是該套件不依賴架構,因此它像原生套件一樣適合。 為什麼它沒有包含在可用軟體包清單中,或者更確切地說,沒有開發[TBD]? 也許假設沒有人應該建立和運行任何非 MCST 內核模組。 這裡確實存在差異 - 因為有 linux-headers。 也就是說,如果需要,可以手動組裝該模組,並在機器啟動時透過腳本啟動該模組。 我認為您不應該期望 MCST 會頻繁更新 [TBD]。

「好的,模組已安裝 - 最困難的部分已經結束,」我想... deb 儲存庫的 veeam 軟體包適用於 amd64 平台,而 Elbrus 作業系統有一個 x86_64 [TBD] 平台。 當然,差異僅在於名稱,但這種區別使得來自第三方 deb 儲存庫的幾乎所有軟體包與 Elbrus 作業系統都不相容。 這種惱人的誤解可以簡單地消除:只需拆開包裝,更正有關架構的信息,然後將其放回原處即可。 怎麼做 谷歌搜尋了一下 即刻。

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

另一個問題是依賴性。 必要的文件似乎在那裡,但軟體包卻沒有。 給人的印像是這些軟體包的名稱與其「進口類似物」不同。 也許這些庫的打包方式不同。 我沒有講太多細節,刪除了幾乎所有依賴項,然後安裝繼續進行。

然後服務啟動代碼出現了問題。 腳本 /lib/init/vars.sh 遺失。 由於某種原因,厄爾布魯士峰沒有它也能正常運作,所以我們也將其刪除。 接下來,我們必須取代訊息輸出函數:缺少 log_daemon_msg 和 log_end_msg 函數。 在翻遍 /lib/lsb/init-functions 檔案後,我找到了 log_success_msg 函數 - 它對我們的實驗很有幫助。 順便說一句,在 /lib/lsb/init-functions 檔案中,「# Source SuSE`s rc Functions」行位於 [TBD] 檔案的開頭。

經過這樣一個檔案打包的粗略處理,NFS共享上的整機備份就成功啟動了。 備份掛載也成功。 因此,我相信,對於使用 Elbrus PDK 備份機器(「就像那樣」下載而無需承擔任何義務)的 Veeam Agent for Linux 絕對適合。 即使對文件進行了所有修改。

當然,Elbrus OS 發行套件並未得到正式支持,因為它未包含在受支援的清單中。 此外,QA 部門尚未對 Veeam Agent for Linux 進行測試,所以這些。 沒有支持(至少在文章發表時)。

我希望這篇文章對那些試圖執行 334 年 29.06.2017 月 XNUMX 日第 XNUMX 號命令的人有用。 我的給你...[待定]。

來源: www.habr.com

添加評論