ব্লক ডিভাইস সামগ্রীতে সংরক্ষণাগার রাখতে কীভাবে টার (ইত্যাদি) বোঝাবেন?


13

আমার কাছে লিনাক্সের ছয়টি লজিক্যাল ভলিউম রয়েছে যা একসাথে ভার্চুয়াল মেশিনটিকে ফিরে দেয়। ভিএম বর্তমানে শাটডাউন, সুতরাং সেগুলির ধারাবাহিক চিত্র নেওয়া সহজ।

আমি একটি সংরক্ষণাগারে সমস্ত ছয়টি চিত্র একসাথে প্যাক করতে চাই। তুচ্ছভাবে, আমি এই জাতীয় কিছু করতে পারি:

cp /dev/Zia/vm_lvraid_* /tmp/somedir
tar c /tmp/somedir | whatever

তবে অবশ্যই এটি একটি অতিরিক্ত অনুলিপি তৈরি করে। আমি অতিরিক্ত কপি এড়াতে চাই।

সুস্পষ্ট পদ্ধতি:

tar c /dev/Zia/vm_lvraid_* | whatever

ট্যার কাজ করে না, কারণ টার ফাইলগুলি একটি বিশেষ (এই ক্ষেত্রে প্রতিলিঙ্ক) স্বীকৃতি দেয় এবং মূলত ln -sসংরক্ষণাগারটিতে স্টোরগুলি সঞ্চয় করে । অথবা সহ --dereferenceবা সরাসরি নির্দেশিত /dev/dm-X, এটি তাদের বিশেষ (ডিভাইস ফাইল) হিসাবে স্বীকৃতি দেয় এবং মূলত mknodসংরক্ষণাগারে সংরক্ষণ করে।

আমি এই আচরণটি ওভাররাইড করার জন্য কমান্ড-লাইন বিকল্পগুলি অনুসন্ধান করেছি এবং কোনও খুঁজে পেলাম না। আমিও cpioএকই সমস্যা চেষ্টা করে দেখেছি এবং সেখানে ওভাররাইড করার কোনও বিকল্প খুঁজে পাইনি। আমিও চেষ্টা করেছিলাম 7z(ডাইটো)। একই সাথে pax। এমনকি আমি চেষ্টা করেছিলাম zip, যা নিজেই বিভ্রান্ত হয়ে পড়েছে।

সম্পাদনা করুন: জিএনইউ টার এবং জিএনইউ সিপিওর উত্স কোডের দিকে তাকালে দেখা যায় যে তারা উভয়েই এটি করতে পারে না। কমপক্ষে, গুরুতর কৌতুক ছাড়াই নয় (ডিভাইস ফাইলগুলির বিশেষ পরিচালনা পরিচালনা অক্ষম করা যায় না)। সুতরাং, গুরুতর কৌশল সম্পর্কিত পরামর্শ প্রশংসা বা বিকল্প ইউটিলিটি হবে।

টিএলডিআর: এমন কোনও আর্কিভার রয়েছে যা একাধিক ডিস্ক চিত্র একসাথে প্যাক করবে (কাঁচা ডিভাইস থেকে নেওয়া) এবং অতিরিক্ত অন ডিস্ক অনুলিপি না করেই আউটপুট প্রবাহিত করবে? আমার পছন্দটি পজিক্স বা জিএনইউ টারের মতো একটি সাধারণ ফর্ম্যাটে আউটপুট হবে।


আমি এটা নিশ্চিত।
মাইকজার্ভ

উত্তর:


11

তাই সম্প্রতি আমি এটি দিয়ে এটি করতে চেয়েছিলাম tar। কিছু তদন্ত আমাকে ইঙ্গিত করেছিল যে এটি অল্প সংবেদনশীলর চেয়ে বেশি যা আমি করতে পারি না। আমি এই অদ্ভুত split --filter="cat >file; tar -r ..."জিনিসটি নিয়ে এসেছি , তবে, ভাল, এটি অত্যন্ত ধীর ছিল। আর যতই পড়লাম তত tarবেশি সংবেদনশীল মনে হয়েছে।

আপনি দেখুন, tarরেকর্ডের একটি সংক্ষিপ্ত তালিকা। উপাদানগুলির ফাইলগুলি কোনওভাবেই পরিবর্তন করা যায় না - সেগুলি পুরো সংরক্ষণাগারটিতে রয়েছে। তবে এগুলি 512-বাইট ব্লক সীমানায় অবরুদ্ধ করা হয়েছে এবং প্রতিটি ফাইলের আগে একটি শিরোনাম রয়েছে । এটাই. শিরোনাম বিন্যাসটি সত্যই, খুব সহজ এছাড়াও।

সুতরাং, আমি আমার নিজের লিখেছি tar। আমি এটা কল ... shitar

z() (IFS=0; printf '%.s\\0' $(printf "%.$(($1-${#2}))d"))
chk() (IFS=${IFS#??}; set -f; set -- $(     
        printf "$(fmt)" "$n" "$@" '' "$un" "$gn"               
);  IFS=; a="$*"; printf %06o "$(($(
        while printf %d+ "'${a:?}"; do a=${a#?}; done 2>/dev/null
)0))")                                                                 
fmt() { printf '%s\\'"${1:-n}" %s "${1:+$(z 99 "$n")}%07d" \
    %07o %07o %011o %011o "%-${1:-7}s" ' 0' "${1:+$(z 99)}ustar  " %s \
    "${1:+$(z 31 "$un")}%s"
}

এটাই আসলে মাংস এবং আলু। এটি শিরোনাম লিখেছে এবং চকসুম গণনা করে - যা তুলনামূলকভাবে বলতে গেলে, এটিই একমাত্র শক্ত অংশ। এটি ustarশিরোনাম বিন্যাসটি করে ... সম্ভবত । কমপক্ষে, এটি জিএনইউ যা tarমনে করে বলে মনে হয় এটি ustarশিরোনাম বিন্যাসটি যে বিন্দুতে অভিযোগ করে না em এবং এটি আরও আছে, আমি এখনও এটি জড়িত না যে ঠিক । এখানে, আমি আপনাকে দেখাব:

for f in 1 2; do echo hey > file$f; done
{ tar -cf - file[123]; echo .; } | tr \\0 \\n | grep -b .

0:file1                      #filename - first 100 bytes
100:0000644                  #octal mode - next 8
108:0001750                  #octal uid,
116:0001750                  #gid - next 16
124:00000000004              #octal filesize - next 12
136:12401536267              #octal epoch mod time - next 12
148:012235                   #chksum - more on this
155: 0                       #file type - gnu is weird here - so is shitar
257:ustar                    #magic string - header type
265:mikeserv                 #owner
297:mikeserv                 #group - link name... others shitar doesnt do
512:hey                      #512-bytes - start of file   
1024:file2                   #512 more - start of header 2
1124:0000644
1132:0001750
1140:0001750
1148:00000000004
1160:12401536267
1172:012236
1179: 0
1281:ustar  
1289:mikeserv
1321:mikeserv
1536:hey
10240:.                     #default blocking factor 20 * 512

এটাই tar। সঙ্গে সবকিছু প্যাডেড \0NULLs তাই আমি ঠিক ঘুরিয়ে emমধ্যে \nপাঠযোগ্যতা জন্য ewlines। এবং shitar:

#the rest, kind of, calls z(), fmt(), chk() + gets $mdata and blocks w/ dd
for n in file[123]
do d=$n; un=$USER; gn=$(id --group --name)
   set -- $(stat --printf "%a\n%u\n%g\n%s\n%Y" "$n")
   printf "$(fmt 0)" "$n" "$@" "$(chk "$@")" "$un" "$gn"
   printf "$(z $((512-298)) "$gn")"; cat "$d"  
   printf "$(x=$(($4%512));z $(($4>512?($x>0?$x:512):512-$4)))"
done |
{ dd iflag=fullblock conv=sync bs=10240 2>/dev/null; echo .; } |
tr \\0 \\n | grep -b .

আউটপুট

0:file1                 #it's the same. I shortened it.
100:0000644             #but the whole first file is here
108:0001750
116:0001750
124:00000000004
136:12401536267
148:012235              #including its checksum
155: 0
257:ustar  
265:mikeserv
297:mikeserv
512:hey
1024:file2
...
1172:012236             #and file2s checksum
...
1536:hey
10240:.

আমি সেখানে এক ধরণের কথা বলি কারণ এটি shitarউদ্দেশ্য নয় - tarইতিমধ্যে এটি সুন্দরভাবে করেছে। আমি কেবল এটি কীভাবে কাজ করে তা দেখাতে চেয়েছিলাম - যার অর্থ আমার উপর স্পর্শ করা দরকার chksum। যদি এটির জন্য না হয় তবে আমি কেবল ddএকটি tarফাইলের মাথা বন্ধ করে দিয়েছিলাম এটি দিয়ে। এটি এমনকি কখনও কখনও কাজ করতে পারে তবে সংরক্ষণাগারে একাধিক সদস্য থাকলে এটি অগোছালো হয়ে যায়। তবুও, chksum সত্যিই সহজ।

প্রথমে এটি 7 টি স্পেস তৈরি করুন - (যা একটি অদ্ভুত জ্ঞানু জিনিস, আমি মনে করি, যেমন অনুমান 8 বলে, তবে যাই হোক না কেন - একটি হ্যাক একটি হ্যাক) । তারপরে শিরোনামে প্রতিটি বাইটের অক্টাল মান যুক্ত করুন। এটাই তোমার চাকসুম। সুতরাং আপনার শিরোনামের আগে ফাইল মেটাটাটা দরকার, অথবা আপনার চ্যাকসাম নেই। এবং এটি ustarবেশিরভাগই একটি সংরক্ষণাগার।

ঠিক আছে. এখন, এটি করার অর্থ কী:

cd /tmp; mkdir -p mnt     
for d in 1 2 3                                                
do  fallocate -l $((1024*1024*500)) disk$d
    lp=$(sudo losetup -f --show disk$d)
    sync
    sudo mkfs.vfat -n disk$d "$lp"
    sudo mount  "$lp" mnt
    echo disk$d file$d | sudo tee mnt/file$d
    sudo umount mnt
    sudo losetup -d "$lp"
done

এটি তিনটি 500 এম ডিস্ক চিত্র তৈরি করে, প্রতিটিকে ফর্ম্যাট করে এবং মাউন্ট করে এবং প্রতিটিটিতে একটি ফাইল লিখে।

for n in disk[123]
do d=$(sudo losetup -f --show "$n")
   un=$USER; gn=$(id --group --name)
   set -- $(stat --printf "%a\n%u\n%g\n$(lsblk -bno SIZE "$d")\n%Y" "$n")
   printf "$(fmt 0)" "$n" "$@" "$(chk "$@")" "$un" "$gn"
   printf "$(z $((512-298)) "$gn")"
   sudo cat "$d"
   sudo losetup -d "$d"
done | 
dd iflag=fullblock conv=sync bs=10240 2>/dev/null |
xz >disks.tar.xz

দ্রষ্টব্য - দৃশ্যত অবরুদ্ধ ডিভাইসগুলি সর্বদা সঠিকভাবে অবরুদ্ধ হবে। বেশ সহজ।

যে tar'ইন-স্ট্রিম এবং পাইপ আউটপুট ডিস্ক ডিভাইস ফাইলের সামগ্রী গুলি xz

ls -l disk*
-rw-r--r-- 1 mikeserv mikeserv 524288000 Sep  3 01:01 disk1
-rw-r--r-- 1 mikeserv mikeserv 524288000 Sep  3 01:01 disk2
-rw-r--r-- 1 mikeserv mikeserv 524288000 Sep  3 01:01 disk3
-rw-r--r-- 1 mikeserv mikeserv    229796 Sep  3 01:05 disks.tar.xz

এখন, সত্যের মুহূর্ত ...

 xz -d <./disks.tar.xz| tar -tvf -
-rw-r--r-- mikeserv/mikeserv 524288000 2014-09-03 01:01 disk1
-rw-r--r-- mikeserv/mikeserv 524288000 2014-09-03 01:01 disk2
-rw-r--r-- mikeserv/mikeserv 524288000 2014-09-03 01:01 disk3

হুররে! নিষ্কাশন ...

xz -d <./disks.tar.xz| tar -xf - --xform='s/[123]/1&/'  
ls -l disk*
-rw-r--r-- 1 mikeserv mikeserv 524288000 Sep  3 01:01 disk1
-rw-r--r-- 1 mikeserv mikeserv 524288000 Sep  3 01:01 disk11
-rw-r--r-- 1 mikeserv mikeserv 524288000 Sep  3 01:01 disk12
-rw-r--r-- 1 mikeserv mikeserv 524288000 Sep  3 01:01 disk13
-rw-r--r-- 1 mikeserv mikeserv 524288000 Sep  3 01:01 disk2
-rw-r--r-- 1 mikeserv mikeserv 524288000 Sep  3 01:01 disk3
-rw-r--r-- 1 mikeserv mikeserv    229796 Sep  3 01:05 disks.tar.xz

তুলনা ...

cmp disk1 disk11 && echo yay || echo shite
yay

এবং মাউন্ট ...

sudo mount disk13 mnt
cat mnt/*
disk3 file3

এবং তাই, এই ক্ষেত্রে, shitarঠিক আছে, আমার ধারণা। আমি বরং সমস্ত কিছুতে যাবো না যা এটি ভাল করবে না । তবে, আমি বলব - ফাইলের নামগুলিতে কমপক্ষে নতুন লাইনগুলি করবেন না।

আপনিও করতে পারেন - এবং আমার দেওয়া বিকল্পগুলির কথা বিবেচনা করেও হতে পারে squashfs। আপনি কেবল স্ট্রিম থেকে নির্মিত একক সংরক্ষণাগার পেতে পারেন না - এটি mountসক্ষম এবং কার্নেলের মধ্যে অন্তর্নির্মিত vfs:

থেকে সিউডো-file.example :

# Copy 10K from the device /dev/sda1 into the file input.  Ordinarily
# Mksquashfs given a device, fifo, or named socket will place that special file
# within the Squashfs filesystem, this allows input from these special
# files to be captured and placed in the Squashfs filesystem.
input f 444 root root dd if=/dev/sda1 bs=1024 count=10

# Creating a block or character device examples

# Create a character device "chr_dev" with major:minor 100:1 and
# a block device "blk_dev" with major:minor 200:200, both with root
# uid/gid and a mode of rw-rw-rw.
chr_dev c 666 root root 100 1
blk_dev b 666 0 0 200 200

আপনি btrfs (send|receive)যা stdinপছন্দসই-সক্ষম সক্ষম সংক্ষেপকটিতে সাবভলিউম প্রবাহিত করতে ব্যবহার করতে পারেন । অবশ্যই আপনি এটি সংক্ষেপণ ধারক হিসাবে ব্যবহার করার সিদ্ধান্ত নেওয়ার আগে অবশ্যই এই সাবভলিউমের অস্তিত্বের প্রয়োজন নেই।

এখনও, সম্পর্কে squashfs...

আমি বিশ্বাস করি না আমি এই ন্যায়বিচার করছি। এখানে একটি খুব সাধারণ উদাহরণ:

 cd /tmp; mkdir ./emptydir
 mksquashfs ./emptydir /tmp/tmp.sfs -p \
    'file f 644 mikeserv mikeserv echo "this is the contents of file"'                             

Parallel mksquashfs: Using 6 processors
Creating 4.0 filesystem on /tmp/tmp.sfs, block size 131072.
[==================================================================================|] 1/1 100%
Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 131072
        compressed data, compressed metadata, compressed fragments,... 
###...
###AND SO ON
###...

echo '/tmp/tmp.sfs /tmp/imgmnt squashfs loop,defaults,user 0 0'|
    sudo tee -a /etc/fstab >/dev/null

mount ./tmp.sfs     
cd ./imgmnt
ls

total 1
-rw-r--r-- 1 mikeserv mikeserv 29 Aug 20 11:34 file

cat file

this is the contents of file

cd ..
umount ./imgmnt

এটি কেবল ইনলাইন -pযুক্তি mksquash। আপনি নিজের পছন্দমতো ফাইল যুক্ত একটি ফাইল উত্স -pfকরতে পারেন। ফর্ম্যাটটি সহজ - আপনি নতুন সংরক্ষণাগারের ফাইল সিস্টেমে একটি টার্গেট ফাইলের নাম / পাথ সংজ্ঞায়িত করেন, আপনি এটিকে একটি মোড এবং একটি মালিক দেন এবং তারপরে আপনি স্টাডআউটটি কোনটি কার্যকর করতে এবং পড়তে হবে তা বলবেন। আপনি নিজের পছন্দ মতো অনেকগুলি তৈরি করতে পারেন - এবং আপনি LZMA, GZIP, LZ4, XZ ব্যবহার করতে পারেন ... হুম আরও রয়েছে ... আপনার পছন্দ মতো সংকোচনের বিন্যাস রয়েছে। এবং শেষের ফলাফলটি একটি সংরক্ষণাগার যা আপনি cd

যদিও ফর্ম্যাটে আরও:

এই কোর্স, না হয় শুধু এটি একটি সংকুচিত, অরোহণযোগ্য Linux ফাইল-সিস্টেম ইমেজ - একটি আর্কাইভ। এটির ফর্ম্যাটটি লিনাক্স কার্নেলের - এটি একটি ভ্যানিলা কার্নেল সমর্থিত ফাইল সিস্টেম। এইভাবে এটি ভ্যানিলা লিনাক্স কার্নেলের মতো সাধারণ। সুতরাং আপনি যদি আমাকে বলেন আপনি একটি ভ্যানিলা লিনাক্স সিস্টেম চালাচ্ছেন যার উপর tarপ্রোগ্রামটি ইনস্টল করা হয়নি তবে আমি সন্দেহজনক হব - তবে আমি সম্ভবত আপনাকে বিশ্বাস করব। তবে আপনি যদি আমাকে বলে থাকেন যে আপনি একটি ভ্যানিলা লিনাক্স সিস্টেম চালাচ্ছেন যার উপর squashfsফাইল সিস্টেমটি সমর্থন করে না আমি আপনাকে বিশ্বাস করব না।


মাইক, একটি ছোট স্ব-অন্তর্নিহিত উদাহরণ তৈরি করতে আমরা কি আপনাকে সমস্যায় ফেলতে পারি যাতে লোকেরা এটি ব্যবহার করতে পারে? দেখে মনে হচ্ছে আপনি সম্ভবত উপরের অংশটির কিছু করছেন তবে আমি নিশ্চিত নই। ইন input f 444 root root dd if=/dev/sda1 bs=1024 count=10চ ফাইল ইনপুট হয়? কোনও খেলনা ডিভাইস তৈরি করা, এটি ডেটা দিয়ে পূরণ করা এবং এটি থেকে লেখা আরও ভাল? এবং এই সব কি মূল প্রয়োজন?
ফাহিম মিঠা

@ ফাহিমমিঠা - হ্যাঁ আমি এটি করতে পারি তবে আমি এটি এখানে করি নি। লিঙ্কটি সরকারী ডকুমেন্টেশনের - এটি এখান থেকে সরাসরি নেওয়া হয়েছে। যদিও আমরা একটি কমান্ড উদাহরণ দিই তবে এটি আরও ভাল। আমি এটি আগে করেছি - এটি দুর্দান্ত। যাইহোক - inputফাইল squashfsসংরক্ষণাগারে একটি ফাইল - ফাইল সিস্টেম চিত্র যা কমান্ডটি চালানোর ফলে আসে। আপনি যখন করবেন তখন আপনি mksquashচালানো কমান্ডগুলির জন্য এই সিডোফিল কমান্ডগুলি নির্দিষ্ট করতে পারবেন এবং যেখান থেকে stdoutসংকোচনের সময় ক্যাপচার করা হয়েছে।
মাইকজার্ভ

@FaheemMitha - উহু, এবং এটি রুট করতে প্রয়োজন হয় না সংকুচিতকারী , অথচ তা মাউন্ট করতে পারে - এটি একটি ফাইল সিস্টেম চিত্র ফলাফল হল। এটি সমস্ত লিনাক্স লাইভ ডিস্ক ব্যবহার করে একই ফাইল সিস্টেম। আসলে - একটি খুব দুর্দান্ত জিনিস - এটি হ'ল আপনি রুট না হয়ে সেই সিউডো-ফাইলগুলি ব্যবহার করে একটি মূল মালিকানাধীন চিত্র তৈরি করতে পারেন - যেমন আপনার ডিভাইসের ফাইলগুলি নির্ধারণ করে এবং নির্বিচারে এমএজে: এমআইএন নম্বরগুলি।
মাইক্রজারভ

আমার ধারণা, কোনও ডিভাইস ফাইল তৈরি করা, এটিকে লিখতে এবং তারপরে এটি কখনও মাউন্ট না করেই সম্ভব হওয়া উচিত, তাই না? সুতরাং, সম্ভবত এটির মূল প্রয়োজন হয় না, এটি সম্ভবত পছন্দনীয়।
ফাহিম মিঠা

ভাল, এখানে কোনও বিটিআরএফ জড়িত নেই, যাতে এটি কাজ করে না। তবে স্কোয়াশফগুলি যথেষ্ট কাজ পাগল। যদিও এটি একটি সাধারণ সংরক্ষণাগার বিন্যাস না হওয়ার খারাপ দিক রয়েছে।
ডারোবার্ট

4

আপনি কিছু সময়ের জন্য সমস্যাটি আমাকে বিস্মিত করলেন এবং আমি মনে করি যে আমি একটি সমাধান পেয়েছি যা কার্যকর হবে।

আমি মনে করি আপনি -si{NAME}পতাকা ব্যবহার করে 7z দিয়ে যা চান তা অর্জন করতে পারেন ।

আপনি আপনার প্রয়োজনের সাথে খাপ খাইয়ে নিতে সক্ষম হবেন।

7z a test.7z -siSDA2.txt < /dev/sda1
7z a test.7z -siSDA2.txt < /dev/sda2

7z l test.7z 

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)

Listing archive: test.7z

--
Path = test.7z
Type = 7z
Method = LZMA
Solid = -
Blocks = 2
Physical Size = 1770
Headers Size = 162

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2014-08-19 22:01:08 .....         6314          804  SDA1.txt
2014-08-19 22:01:11 .....         6314          804  SDA2.txt
------------------- ----- ------------ ------------  ------------------------
                                 12628         1608  2 files, 0 folders

সম্পাদনা : বিড়ালের অকেজো ব্যবহার সরান


এটির একটি ছোট্ট উদাহরণ পাওয়া সহায়ক হবে যা লোকেরা চেষ্টা করতে পারে। উদাহরণস্বরূপ একটি ব্লক ডিভাইস তৈরি করুন, এটিকে লিখুন, তারপরে এটি লিখুন। মূল প্রয়োজন হয় না একটি প্লাস হতে হবে।
ফাহিম মিঠা

উদাহরণে / dev / sda1 একটি ব্লক ডিভাইস। বিড়াল কমান্ডটির উদ্দেশ্য ডিভাইসের সামগ্রীটি স্টাডআউটে ডাম্প করা hen তারপরে 7z সংরক্ষণাগারটি তৈরি (বা আপডেট) করুন এবং স্টিডিনের থেকে -si প্যারামিটার দ্বারা নির্দিষ্ট করা ফাইলের নামটিতে ডেটা সংরক্ষণ করুন। সংরক্ষণাগারের মধ্যে ফলাফলটি প্রতিটি ব্লক ডিভাইস (গুলি) এর সামগ্রী। "বিড়াল" কমান্ডের ডিভাইস থেকে ডেটা পড়তে রুট প্রয়োজন।
টনি

এটি বিড়ালের অপ্রয়োজনীয় ব্যবহার , তবে অন্যথায় বিলটি বেশ ভাল ফিট করে। অদ্ভুতভাবে আমার 7zম্যানপেজটি উল্লেখ করে না -যে কোনও ফাইলের নাম নিতে পারে তবে তা কার্যকর হয়। এটি নিখুঁত নয় (আউটপুট কোথাও পাইপ করা যায় না), তবে অবশ্যই এটি এখন পর্যন্ত সেরা যে সাধারণ ফরম্যাটে আউটপুট।
ডারোবার্ট

@ ফাহিমমিঠা আপনার সিস্টেমে অনুমতি সেটিংসের উপর নির্ভর করবে, যদিও কেবল রুটই নতুন ব্লক ডিভাইস তৈরি করতে পারে।
ডারোবার্ট

@ আডারবার্ট বিড়ালটি সরিয়েছেন :)
টনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.