የሊኑክስ ምትኬ ከ Veeam በ Elbrus OS ላይ። ምትክ አስመጣ ['?' | '። | '!']

ሰላም.
ስለ Habré የቅርብ ጊዜ መጣጥፎች መተኪያን በተግባር አስመጣ። ክፍል 1. አማራጮች и ሙዚቃው ለረጅም ጊዜ አልተጫወተም ... ወይም Elbrus OS እንዴት ነጻ እንዳልወጣ ግዴለሽነት አልተወኝም። ይህንን ጉዳይ በመጠባበቂያው ሥራ አውድ ውስጥ ለማጥናት ወሰንኩ. በተጨማሪም ፣ በ ይህ ጽሑፍ የ Veeam ሶፍትዌር ምርቶች ተጠቅሰዋል፣ ይህ ማለት ጉዳዩ በተለይ ከውጪ በማስመጣት መተካት ላይ ጠቃሚ ሊሆን ይችላል።

የሊኑክስ ምትኬ ከ Veeam በኤልብሩስ ኦኤስ ላይ። ምትክ አስመጣ ['?' | '። | '!']
የመጀመሪያ ምስል ምንጭ

በመጀመሪያ ደረጃ የኤልብሩስ ስርዓተ ክወናን ለማውረድ ወሰንኩ ወይም ይልቁንስ ለ x86_64 አርክቴክቸር ያለውን ስርጭት ብቻ ፣ እንዴት እንደሚሰራ ይመልከቱ እና በላዩ ላይ የ Veeam Agent ለ Linux ለመጫን ሞከርኩ። ከዚህ ምን እንደመጣ ማወቅ ከፈለጉ እባክዎን ድመትን ይመልከቱ።

ስለዚህ, ትንሽ ዳይሬሽን, አንድ ሰው የማያውቅ ከሆነ. “ኤልብሩስ” እንደዛ ነው። ማቀናበሪያ በተለየ የትእዛዝ ስርዓት። ከእሱ በተጨማሪ የኤልብራስ ኦኤስ ሶፍትዌር አለ. እና - ከታዋቂ እምነት በተቃራኒ - Elbrus OS ን ለመስራት ፣ በኤልብሩስ ፕሮሰሰር ላይ የተመሠረተ የሃርድዌር ስርዓት መኖር አስፈላጊ አይደለም። “PDK “Elbrus” ለ x86 አለ - በእውነቱ ፣ በሕዝብ ጎራ ውስጥ በመጫኛ ዲስክ መልክ ታየ። በነገራችን ላይ የግርጌ ማስታወሻ አለ "PDK - የመድረክ ማጎልበቻ ኪት ፣ የገንቢ ኪት" - በጣም ጥሩ ፣ ያም ማለት እዚያ ቢያንስ አቀናባሪ አለ ማለት ነው።

ሌላ ትንሽ የግዳጅ ማፈግፈግ. እውነታው አንድ ጊዜ እንደ MSVS እና Baguette RTOS ካሉ የሀገር ውስጥ ሶፍትዌሮች ጋር ተገናኝቻለሁ። ከMCST የመጣ ፕሮሰሰርን ጨምሮ ከአገር ውስጥ አካላት ጋር የመሥራት ልምድ ነበረኝ። ስለዚህ, በዚህ አካባቢ ውስጥ የተወሰነ ልዩነት እንዳለ በሙሉ ሃላፊነት መናገር እችላለሁ እና በአንቀጹ ውስጥ እሱን ላለመንካት እሞክራለሁ. የምር ስፈልግ መለያውን [TBD] አኖራለሁ። እንግዲያውስ ያለምንም መጎተቻ እና ባናል ማቃሰት ለማድረግ እንሞክራለን። በመጨረሻም የሩስያ የመከላከያ ኢንዱስትሪ እና የመንግስት ኤጀንሲዎች መረዳት አለባቸው. ትልቅ አገር - ትንሽ በጀት.. [TBD].

ዜሮ ደረጃ - ማውረድ. የኤልብሩስ ስርዓተ ክወና መገኘቱን የሚገልጸው ዜና ከፍተኛ ድምጽ ማሰማቱ ትኩረት የሚስብ ነው, ይህም ስርጭት አገልጋዩ እስከ ታች ድረስ. [TBD] ለ Yandex ምስጋና ይግባውና ወደዚያ ለማንቀሳቀስ ያሰበውን መሐንዲስ። ስለዚህ የማውረድ ፍጥነት ጥሩ ነው.

የመጀመሪያ ደረጃ - መጫን. በነጻ ጥቅም ላይ የዋለው የመጀመሪያው ሃይፐርቫይዘር ላይ ጫንኩት። ሁለት ኮሮች፣ ሁለት ጊጋ ራም 32 ሜባ ለቪዲዮ መደብኩኝ (የግራፊክ በይነገጽ ይኖራል ብዬ አስቤ ነበር።) ዲስኩ እንደተለመደው - 32 ጂቢ.
መጫኑን ጀመርኩ. የመጫኛ መመሪያዎችን አልተጠቀምኩም, ስለዚህ በእሱ ላይ አስተያየት መስጠት አልችልም. የ TUI መጫኛ በይነገጽ በጣም አናሳ ነው።

የሊኑክስ ምትኬ ከ Veeam በኤልብሩስ ኦኤስ ላይ። ምትክ አስመጣ ['?' | '። | '!']
ደህና ፣ ጥሩ ፣ ያለ መዳፊት ማድረግ እንችላለን።

በሁለተኛው ሙከራ የሚቀጥለውን መስኮት ቻልኩ። ከዲስክ ሲጫኑ ለምን ነባሪውን መሳሪያ sr0 [TBD] አይመርጡም?
የሲዲ-ሮምን ምንጭ ይምረጡ እና ይቀጥሉ።

የሊኑክስ ምትኬ ከ Veeam በኤልብሩስ ኦኤስ ላይ። ምትክ አስመጣ ['?' | '። | '!']

የሰዓት ሰቅን በምመርጥበት ጊዜ ስርዓቱ የመግቢያ ሂደቱን እንደሚጠቀም በድንገት ተገነዘብኩ እና እኔ ከ TTY0 እየሰራሁ ነው።

የሊኑክስ ምትኬ ከ Veeam በኤልብሩስ ኦኤስ ላይ። ምትክ አስመጣ ['?' | '። | '!']

እሺ፣ እንግዲያውስ “ኤልብሩስ”ን እንደ ማህበረሰብ እንመድበው የድሮ አማኞች[TBD] በመርህ ደረጃ, ይህ ጥሩ ነው: ሁሉም ነገር ስክሪፕት ስለሆነ የማውረድ ሂደቱ እንዴት እንደሚሰራ ለማየት የምንጭ ኮድ መጠየቅ አያስፈልግዎትም.

ቀሪው ማለት ይቻላል አስፈላጊ አይደለም: ሁሉንም ነገር አስቀምጠናል እና ተስማምተናል. በመንገድ ላይ, ከርነል 3.14.79-13.84 ጥቅም ላይ እንደዋለ እናገኘዋለን. እም፣ ዴቢያን 7 3.2 [TBD] ነበረው።

በመቀጠል ነባሪውን የዲስክ ክፍልፍል ይምረጡ እና... ማስጠንቀቂያ እናያለን፡-

የሊኑክስ ምትኬ ከ Veeam በኤልብሩስ ኦኤስ ላይ። ምትክ አስመጣ ['?' | '። | '!']

ሆ፣ በሆነ መንገድ አውቶማቲክ ክፍፍሉ ከ 32 ጂግ ዲስክ ጋር በደንብ አልተቋቋመም። ዲስኩን አልቀየርኩትም፤ ፍለጋውን የጨረስኩት በእጅ የዲስክ ክፍፍል በ"ሁሉንም በአንድ" ዘይቤ ነው። /boot ext3 ውስጥ መሆን ስላልቻለ ext4 መጫን ነበረብኝ።
ስርዓቱ ያለምንም ችግር መጣ.

ሁለተኛ ደረጃ - አማራጮችን ይፈልጉ.
የሁለተኛውን ዲስክ ይዘት ካጣራሁ በኋላ፣ ይህ ተጨማሪ ያለው ማከማቻ እንደሆነ ተገነዘብኩ። በጥቅሎች ውስጥ. እና /etc/apt/sources.list ስመለከት፣ በ /mnt/cdrom ውስጥ መጫን እንዳለበት ተገነዘብኩ። ግን አላገኘሁም /etc/os-release. ግን ከይዘቱ 3.0-rc36 ጋር /etc/mcst-ስሪት አለ። 3.0 ምናልባት ስሪቱ ነው - ተስማሚ ይመስላል, ግን rc36? በአጠቃላይ፣ የሶስተኛ ወገን ሶፍትዌሮች ይህንን ስርጭት በጥንታዊው መንገድ ሊያውቁት አይችሉም።

በስር ክፍልፍል ውስጥ፣ የ/mcst ማውጫው ዓይኔን ይስባል፣ እና እዚያ፣ እየሰመጠ ባለው ልብ፣ /mcst/backup አገኘሁ። ያም ማለት, የመጠባበቂያ መሳሪያ አለ, እና በስርዓቱ ውስጥ ተገንብቷል! "በጣም ጥሩ" ብዬ አሰብኩ, "ይህ እንዴት እንደሚሰራ እንይ!"

የፋይል ቅጂን የሚያቀርብ 4Kb bash script /mcst/bin/backup እንዳለ ታወቀ። በነባሪ - ወደ /mcst/መጠባበቂያ ማውጫ። በምንጭ ኮድ ውስጥ የ 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 በ add-on ውስጥ ተካትቷል. ማከማቻዎች. ስሪት 3.1.3. rsyncን መጠቀም አሁንም ለ /mcst/bin/backup መተግበሪያ የተሻለ አማራጭ ይመስለኛል።

በመቀጠል, አዲስ ለማስቀመጥ ወሰንኩ Veeam ወኪል ለሊኑክስ. አንድ ሰው እንዲህ ብሎ ይጠይቃል፡- “Veam እና የማስመጣት ምትክ ከእሱ ጋር ምን አገናኘው?” አዎ, በመመዝገቢያ ውስጥ የለም, ነገር ግን በ FSTEC የተረጋገጠ ነው, ይህም ማለት አማራጮች በሌሉበት ጊዜ ጥቅም ላይ ሊውል ይችላል. ከ አማራጮች ላይ አሥራ አምስት ደቂቃ በማጥፋት መዝገብ ቤት፣ “መጠባበቂያ” ለሚለው ቃል 3 አገናኞችን ማግኘት ችያለሁ (“መጠባበቂያ” ለሚለው ቃል ከጥያቄዬ ጋር ምንም ግንኙነት የለውም)። ስለነዚህ ፕሮግራሞች ጥልቅ ትንታኔ አላደረኩም፣ ስለዚህ ሊኑክስን የሚያስኬዱ ማሽኖችን ለመደገፍ ምን ያህል ተስማሚ እንደሆኑ ለመፍረድ አልሞክርም። የሚያስፈልገው ሰው የራሱን መደምደሚያ ያዘጋጃል እና በአስተያየቶቹ ውስጥ ያካፍለዋል.

ደረጃ ሶስት ፡፡ - የ Veeam ወኪል ለሊኑክስ መጫን።
ስለዚህ የ Veeam ወኪል ለሊኑክስ ሁለት ፓኬጆችን ያቀፈ ነው፡ የ veeamsnap kernel module (በነገራችን ላይ፣ ምንጭ እዚህ) እና የባለቤትነት ተጠቃሚ-ቦታ ኮድ በ veeam ጥቅል መልክ።

የከርነል ሞጁሉን በመጫን ላይ አንድ ትንሽ ችግር ነበር - የጎደለው dkms ጥቅል። ይህ የከርነል ሞጁሎችን ከምንጩ እንዲገነቡ የሚያስችልዎ አገልግሎት ነው። እንደ ደንቡ በሁሉም የደብዳቤ ስርጭቶች ላይ ይገኛል. ከሶስተኛ ወገን ዴብ ማከማቻ ማውረድ ነበረብኝ። እኔን ያስደሰተኝ አንድ ነገር ጥቅሉ በህንፃው ላይ የተመሰረተ ስላልሆነ እንደ ተወላጅነት ይስማማል። ለምን በተገኙ ጥቅሎች ዝርዝር ውስጥ አልተካተተም ወይም ይልቁንም [TBD] ያልዳበረው? ምናልባት ማንም ሰው ማናቸውንም MCST ያልሆኑ የከርነል ሞጁሎችን መገንባት እና ማስኬድ እንደሌለበት ይታሰባል። እዚህ በእርግጥ አለመግባባት አለ - ሊኑክስ-ራስጌዎች ስላሉት። ያም ማለት ሞጁሉን ከተፈለገ ማሽኑ ሲጀምር በእጅ ሊሰበሰብ እና በስክሪፕት ሊጀምር ይችላል. ከMCST [TBD] ተደጋጋሚ ዝማኔዎችን መጠበቅ የለብህም ብዬ አስባለሁ።

“እሺ፣ ሞጁሉ ተጭኗል - ከባዱ ክፍል አልቋል” ብዬ አሰብኩ... የ veeam ጥቅል ለደብዳቤ ማከማቻው ለ amd64 መድረክ ነው፣ እና Elbrus OS x86_64 [TBD] መድረክ አለው። ልዩነቱ፣ በእርግጥ፣ በስም ብቻ ነው፣ ነገር ግን ይህ ልዩነት ከሶስተኛ ወገን ዴብ ማከማቻዎች የመጡ ሁሉንም ፓኬጆች ከኤልብሩስ ኦኤስ ጋር ተኳሃኝ እንዳይሆኑ ያደርጋል። ይህ የሚያበሳጭ አለመግባባት በቀላሉ ሊወገድ ይችላል: ጥቅሉን ብቻ ይሰብስቡ, ስለ ስነ-ህንፃው መረጃን ያርሙ እና መልሰው ያስቀምጡት. እንዴት ማድረግ እንደሚቻል ጎግል አድርጎታል። ወዲያውኑ።

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

ሌላው ችግር ጥገኝነት ነው። አስፈላጊዎቹ ፋይሎች እዚያ ያሉ ይመስላሉ, ነገር ግን ጥቅሎቹ አይደሉም. ግንዛቤው የፓኬጆቹ ስሞች ከ "ከውጪ ከሚመጡ አናሎግ" የሚለያዩ ናቸው. ምናልባት ቤተ-መጻሕፍቶቹ በተለያየ መንገድ የታሸጉ ናቸው. በጣም ብዙ ዝርዝር ውስጥ አልገባሁም, ሁሉንም ጥገኛዎች ከሞላ ጎደል አስወግድ, እና መጫኑ ቀጠለ.

ከዚያ በአገልግሎት ጅምር ኮድ ላይ ችግሮች ታዩ። ስክሪፕቱ /lib/init/vars.sh ጠፍቷል። በሆነ ምክንያት ኤልብራስ ያለ እሱ ያስተዳድራል, ስለዚህ እኛም እናስወግደዋለን. በመቀጠል የመልእክት ውፅዓት ተግባርን መተካት ነበረብን፡የሎግ_ዳሞን_msg እና log_end_msg ተግባራት ጠፍተዋል። በ /lib/lsb/init-functions ፋይል ውስጥ ከተዘዋወርኩ በኋላ፣ log_success_msg ተግባርን አገኘሁ - ለሙከራዎች ይጠቅመናል። በነገራችን ላይ በ / lib/lsb/init-functions ፋይል ውስጥ "# Source SuSE`s rc ተግባራት" የሚለው መስመር በ [TBD] ፋይል መጀመሪያ ላይ ነው.

ፓኬጁን በፋይል ከተሰራ በኋላ በኤንኤፍኤስ ድርሻ ላይ ያለው ሙሉ የማሽን ምትኬ በተሳካ ሁኔታ ተጀመረ። የመጠባበቂያ ማፈናጠጥም ስኬታማ ነበር። ስለዚህ፣ ማሽንን በኤልብሩስ ፒዲኬ ለመደገፍ፣ ያለ ምንም ግዴታ “ልክ እንደዛ” የወረደውን፣ Veeam Agent for Linux በእርግጠኝነት ተስማሚ ነው ብዬ አምናለሁ። በፋይል ከተደረጉት ማሻሻያዎች በኋላም እንኳ።

በእርግጥ የኤልብሩስ ስርዓተ ክወና ማከፋፈያ ኪት በሚደገፉ ሰዎች ዝርዝር ውስጥ ስላልተካተቱ በመደበኛነት አይደገፍም። በተጨማሪም ፣ የቪም ወኪል ለሊኑክስ በ QA ክፍል አልተሞከረም ፣ ስለዚህ እነዚያ። ምንም ድጋፍ የለም (ቢያንስ ጽሑፉ በሚታተምበት ጊዜ)።

ጽሑፉ ሰኔ 334 ቀን 29.06.2017 ትዕዛዝ ቁጥር XNUMX ተግባራዊ ለማድረግ ለሚሞክሩ ሰዎች ጠቃሚ እንደሚሆን ተስፋ አደርጋለሁ። የኔ ለአንተ... [TBD]።

ምንጭ: hab.com

አስተያየት ያክሉ