大家好。
關於哈布雷的最新文章
首先,我決定下載 Elbrus OS,或者更確切地說,只下載 x86_64 架構的可用發行版,看看它是如何運作的,並嘗試在其上安裝 Veeam Agent for Linux。 如果你想知道這是怎麼回事,請看貓。
所以,題外話,以防有人不知道。 「厄爾布魯士峰」就是這樣
又是一次小規模的被迫撤退。 事實是我曾經接觸過國產軟體,像是MSVS、Baguette RTOS。 我有使用國產組件的經驗,包括 MCST 的處理器。 因此,我可以負責任地說,這個領域有一定的特殊性,我會盡量不在文章中去觸及它。 當我真的想要的時候,我會貼上標籤[TBD]。 因此,我們將盡量避免公然的惡搞和平庸的抱怨。 最後,俄羅斯國防工業和政府機構需要被理解。 大國 - 小預算..[待定]。
零階段 - 下載。 值得注意的是,Elbrus作業系統上線的消息引起了軒然大波,甚至導致分發伺服器癱瘓。 [TBD] 感謝 Yandex 和考慮將其移至此處的工程師。 所以下載速度還是不錯的。
第一階段 - 安裝。 我將其安裝在第一個可供免費使用的虛擬機器管理程式上。 我分配了兩個核心、幾GB RAM、32 MB 用於視訊(我想會有一個圖形介面)。 磁碟與往常一樣 - 32 GB。
我開始安裝。 我沒有使用安裝說明,所以無法評論。 TUI 安裝介面極為簡約。
好吧,太好了,我們可以不用滑鼠了。
我在第二次嘗試中成功進入了下一個視窗。 從磁碟安裝時為什麼不選擇預設設備 sr0 [TBD]?
選擇 CD-ROM 來源並繼續。
在選擇時區時,我突然意識到系統使用了init引導進程,而我正在從TTY0工作。
好的,那麼我們將「Elbrus」歸類為一個社區
其餘的幾乎不重要:我們把一切都放在一起並達成一致。 一路上我們發現使用的核心是3.14.79-13.84。 嗯,Debian 7 有 3.2 [TBD]。
接下來,選擇預設磁碟分割並...我們看到一條警告:
嗯,不知何故,自動分割區不能很好地處理 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 認證,這意味著在沒有替代方案的情況下可以使用它。 花十五分鐘尋找替代方案
第三階段 — 安裝適用於 Linux 的 Veeam Agent。
因此,Veeam Agent for Linux 由兩個軟體包組成: veeamsnap 核心模組(順便說一下,
安裝核心模組時遇到一個小問題 - 缺少 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