du একই ফাইলের জন্য দুটি পৃথক ফলাফল দেয়


23

আমি লিনাক্স ক্লাস্টারে অ্যাক্সেস সহ গণ্য রসায়ন বিভাগের স্নাতক শিক্ষার্থী। ক্লাস্টারে একটি খুব বড় (25 টিবি) ফাইলসভার থাকে, যার সাথে বেশ কয়েকটি ডজন গণনা নোড সংযুক্ত থাকে। প্রতিটি গণনা নোডে 8 থেকে 24 ইন্টেল জিয়ন কোর থাকে। প্রতিটি কম্পিউট নোডে প্রায় 365 টিবি স্থানীয় ডিস্ক থাকে।

যেহেতু ফাইলসভারটি নিয়মিতভাবে এক ডজন বা ততোধিক গবেষণা দলের ব্যবহারকারীদের দ্বারা অ্যাক্সেস করা হয়, ফাইলসার্ভারটি মূলত দীর্ঘমেয়াদী ফাইল স্টোরেজের জন্য ব্যবহৃত হয় (এটি রাত্রে ব্যাক আপ করা হয়, যেখানে কম্পিউট নোডের স্থানীয় ডিস্কগুলি কখনই ব্যাক আপ হয় না)। এইভাবে, সিস্টেম অ্যাডমিনিস্ট্রেটর আমাদের স্থানীয় ডিস্কগুলিতে সিমুলেশনগুলি চালনার নির্দেশনা দিয়েছেন - যা ফাইলসভারের চেয়ে দ্রুত I / O রয়েছে - যাতে অন্য ব্যবহারকারীর জন্য ফাইলসভারটি ধীর না করে।

সুতরাং, আমি স্থানীয় ডিস্কগুলিতে সিমুলেশনগুলি চালনা করি এবং তারপরে, সেগুলি সমাপ্ত হওয়ার পরে, আমি ট্র্যাজেক্টরি ফাইলগুলি অনুলিপি করি - আমি মলিকুলার ডায়নামিক্স (এমডি) সিমুলেশনগুলি চালাচ্ছি - স্টোরেজের জন্য ফাইলসভারে to ধরুন আমার কাছে traj.trrনোডের স্থানীয় ডিস্কের একটি ডিরেক্টরিতে একটি ট্র্যাজেক্টরি ফাইল রয়েছে /home/myusername/mysimulation1/traj.trr,। দীর্ঘমেয়াদী স্টোরেজের জন্য, আমি সবসময় traj.trrফাইলসভারের একটি ডিরেক্টরিতে অনুলিপি করি ~/mysimulation1/traj.trr, যেখানে ফাইলসভারে ~আমার ডিরেক্টরিটি উপস্থাপন করে /export/home/myusername। এটি অনুলিপি করার পরে, তবে আমি অভ্যাসগতভাবে du -hযাচাই করতে ব্যবহার করি /home/myusername/mysimulation1/traj.trrযা এর মতো ফাইলের আকারের ~/mysimulation1/traj.trr। এইভাবে, আমি অন্তত যুক্তিসঙ্গতভাবে নিশ্চিত হতে পারি যে ফাইলসার্ভারে স্থানান্তর সফল হয়েছিল। উদাহরণ স্বরূপ:

cd /home/myusername/mysimulation1/
cp -v traj.trr ~/mysimulation1/
du /home/myusername/mysimulation1/traj.trr -h
du ~/mysimulation1/traj.trr -h

যদি দুটি কল du -hএকই মানব-পঠনযোগ্য ফাইল আকার দিতে দেয় তবে আমি যুক্তিযুক্তভাবে নিশ্চিত হতে পারি যে স্থানান্তর / অনুলিপি সফল হয়েছিল। (আমার সাধারণ traj.trrফাইলগুলি আকারে প্রায় 15 থেকে 20 গিগাবাইটের মধ্যে রয়েছে, আমি যে সঠিক সিমুলেশন চালিয়েছি তার উপর নির্ভর করে।) আমি যদি দুটি ফাইল চালনা করি du(অর্থাত্, -hস্যুইচ ছাড়াই ) traj.trr, তবে তাদের আকারগুলি বাইটে সাধারণত খুব একই রকম হয় - - সাধারণত মাত্র কয়েক বাইটের মধ্যে আমি গত দেড় বছর ধরে এই সামগ্রিক পদ্ধতিটি ব্যবহার করছি, কোনও সমস্যা নেই।

যাইহোক, সম্প্রতি আমি নিম্নলিখিত সমস্যার মধ্যে চলে এসেছি: কখনও কখনওdu -hরিপোর্ট করে যে দুটিtraj.trrফাইলের আকার বেশ কয়েকটি জিবি দ্বারা আলাদা। এখানে একটি উদাহরণ:

cd /home/myusername/mysimulation1/            # this is the local disk
cp -v traj.trr ~/mysimulation1/
du traj.trr -h
cd ~/mysimulation1/                           # this is the fileserver
du traj.trr -h

দুটি কল থেকে আউটপুট du -hযথাক্রমে:

20G     traj.trr
28G     traj.trr

আমি বিশ্বাস করি যে পূর্ববর্তীটি (যেমন traj.trrস্থানীয় ডিস্কে থাকা /home/myusername/mysimulation1/) সঠিক ফাইলের আকার, যেহেতু আমার সিমুলেশন ট্র্যাজেক্টরিগুলি প্রতিটি প্রায় 15 থেকে 20 জিবি হওয়ার আশা করা হয়। কিন্তু তারপরে ফাইলসার্ভারের ফাইলটি আসলে কীভাবে আরও বড় হতে পারে ? আমি দেখতে পেলাম কীভাবে এটি ছোট হতে পারে, যদি কোনওভাবে cpস্থানান্তর ব্যর্থ হয়। তবে আমি দেখতে পাচ্ছি না এটি কীভাবে আসলে আরও বড় হতে পারে ।

আমি উপরের মত একই কমান্ডগুলি কার্যকর করতে গিয়ে অনুরূপ আউটপুট পাই, তবে -hপ্রদত্ত সুইচটি ছাড়াই du:

20717480        traj.trr
28666688        traj.trr

পার্থক্যের কোনও কারণ কি আপনি ভাবতে পারেন?

যদি, কোনও সম্ভাবনার সম্ভাবনা না থাকলে duকোনওভাবে ত্রুটিযুক্ত হয় তবে আমি এটির সাথে ঠিক থাকতে পারি। তবে আমার ঠিক সত্যিই এটি নিশ্চিত করতে হবে যে traj.trrফাইলসার্ভারে থাকা অনুলিপিটি সম্পূর্ণরূপে এবং স্থানীয় ডিস্কে এর উত্স সংস্করণের সাথে অভিন্ন। আমার লোকাল ফাইলটি মুছতে হবে যাতে আমার কাছে নতুন সিমুলেশনগুলি চালানোর জন্য পর্যাপ্ত লোকাল ডিস্কের জায়গা থাকতে traj.trrপারে তবে ফাইলসভারের সংস্করণটি নষ্ট হয়ে যায়।

.Trr ফাইল ফরম্যাট (Gromacs আণবিক গতিবিদ্যা প্যাকেজ থেকে) একটি বাইনারি ফরম্যাট, না লেখা আছে। সুতরাং, আমি নিশ্চিত না যে ফাইলগুলি যেমন কোনও প্রোগ্রামের মাধ্যমে নির্ভরযোগ্যভাবে তুলনা করা যায় কিনা diff


5
চলমান md5sumবা sha1sumফাইলগুলিতে চেষ্টা করুন । তারা কি মিলছে?
সিজেএম

2
@ সিজেএম আমি কেবল md5sumদুটি ফাইলের উপর দৌড়েছি । দুটি চেকসাম মিলছে। সুতরাং আমি অনুমান করি এর অর্থ এই যে দুটি ফাইল একই রকম?
অ্যান্ড্রু

3
কি আকার দ্বারা রিপোর্ট করা হয় ls -l? কমান্ডটি duজানায় যে আপনার ফাইলের জন্য ডিস্কে কত স্পেস ব্যবহৃত হয়, আপনার ফাইলটি কত বড় নয়। ডিস্কের আকার আপনার ফাইল সিস্টেম এবং এর বরাদ্দের কৌশল দ্বারা প্রভাবিত হতে পারে।
কেসি

2
@ কেসি ls -l -hবলেছেন যে দুটি ফাইলই 20 জিবি। তেমনি, ls -lউভয় ফাইলই 21214683940 বাইট বলে। সুতরাং আমি অনুমান করি যে ফাইলগুলি একই আকারের, তবে একই পরিমাণের ডিস্ক স্পেস ব্যবহার করবেন না (অনুযায়ী du)।
অ্যান্ড্রু

2
@ অ্যান্ড্রু এলএস দ্বারা রিপোর্ট করা আকারগুলি একই এবং হ্যাশগুলি সমান যা আপনি সিদ্ধান্ত নিতে পারেন যে ফাইলগুলি একই। এই সরঞ্জামগুলি হ'ল যা আপনাকে আপনার প্রয়োজনীয় আত্মবিশ্বাস দেয় এবং আপনাকে দেখায় যে আপনার প্রয়োজনীয়তাগুলি পূরণ করার সরঞ্জামটি ডু নয়।
কেসি

উত্তর:


32

আপনি সত্যিই ভালো কিছু ব্যবহার করা উচিত md5sumবা sha1sumচেক সততা।

আপনি যদি সত্যিই আকারের ব্যবহার করতে চান ls -lবা du -b

duউপযোগ স্বাভাবিকভাবে শুধুমাত্র ফাইলের ডিস্ক ব্যবহার, অর্থাত কিভাবে ফাইল সিস্টেম অনেক এটা দ্বারা ব্যবহৃত হয় দেখায়। এই মানটি সম্পূর্ণরূপে ব্যাকিং ফাইল সিস্টেম এবং স্পার্স ফাইলগুলির মতো অন্যান্য কারণের উপর নির্ভর করে।

উদাহরণ:

$ truncate -s 512M foo
$ cat foo >bar
$ ls -l foo bar
-rw-r--r-- 1 michas users 536870912 23. Dez 00:06 bar
-rw-r--r-- 1 michas users 536870912 23. Dez 00:03 foo
$ du foo bar
0       foo
524288  bar
$ du -b foo bar
536870912       foo
536870912       bar

আমাদের দুটি ফাইল রয়েছে যার মধ্যে 512 এমবি জিরো রয়েছে। প্রথমটি স্বল্প পরিমাণে সঞ্চিত থাকে এবং কোনও ডিস্কের স্থান ব্যবহার করে না, যখন দ্বিতীয়টি প্রতিটি বাইটকে স্পষ্টভাবে ডিস্কে সঞ্চয় করে। - একই ফাইল, তবে সম্পূর্ণ আলাদা ডিস্ক ব্যবহার usage

-bবিকল্প আপনার জন্য ভাল হতে পারে:

   -b, --bytes
          equivalent to '--apparent-size --block-size=1'

   --apparent-size
          print apparent sizes, rather than disk usage; although the apparent
          size is  usually  smaller,  it  may  be  larger  due  to  holes  in
          ('sparse')  files, internal fragmentation, indirect blocks, and the
          like

8

আপনি একই তথ্য 2 টি ভিন্ন এইচডিডি তে রাখলে এটি একটি সাধারণ সমস্যা। আপনি duকমান্ডটি চালাতে এবং অতিরিক্ত স্যুইচটি করতে চান, ধরে নিবেন এটি এতে রয়েছে - এটি এগুলি লিনাক্স নোডগুলি দেওয়া উচিত।

সুইচ?

   --apparent-size
          print  apparent  sizes,  rather  than  disk  usage;  although the 
          apparent size is usually smaller, it may be larger due to holes in
          ('sparse') files, internal fragmentation, indirect blocks, and the 
          like

উদাহরণ

$ du -sh --apparent-size /home/sam/scsconfig.log ~/scsconfig.log 
93K /home/sam/scsconfig.log
93K /root/scsconfig.log

উপরের ফাইল সিস্টেমগুলি একটি স্থানীয় ডিস্ক ( /root) /home/samঅন্যটিটি আমার এনএএস থেকে একটি এনএফএস শেয়ার।

$ df -h . /home/sam
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      222G  118G   92G  57% /
mulder:/export/raid1/home/sam
                      917G  566G  305G  65% /home/sam

তাহলে কি হচ্ছে?

এটি প্রচুর লোককে বিভ্রান্ত করে তবে মনে রাখবেন যে ফাইলগুলি যখন কোনও ডিস্কে সঞ্চিত থাকে তখন তারা কেবলমাত্র blocks ব্লকের একটি অংশ ব্যবহার করে এমনকি স্থানের ব্লকগুলি গ্রাস করে। আপনি যখন চালাবেন duনা তখন আপনি --apparent-sizeব্যবহৃত ডিস্কের ব্লক স্পেসের পরিমাণের উপর ভিত্তি করে আকার পাচ্ছেন, ফাইল (গুলি) দ্বারা ব্যবহৃত প্রকৃত স্থান নয়।

পরিবর্তে চেকসাম ব্যবহার করছেন?

আপনি যদি ফাইলের 2 টি গাছের তুলনা করার বিষয়ে উদ্বিগ্ন হন তবে এটি সম্ভবত আরও ভাল বিকল্প। আপনি এই কমান্ডটি সমস্ত ফাইলের জন্য একটি চেকসাম গণনা করতে, এবং তারপরে চেকসামের একটি চূড়ান্ত চেকসাম গণনা করতে পারেন। এই উদাহরণটি ব্যবহার করে sha1sumতবে md5sumপরিবর্তে আপনি সহজেই ব্যবহার করতে পারেন ।

$ cd /some/dir
$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum

উদাহরণ

$ cd ~/dir1
$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum
55e2672f8d6fccff6d83f0bffba1b67aeab87911  -

$ cd ~/dir2
$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum
55e2672f8d6fccff6d83f0bffba1b67aeab87911  -

সুতরাং আমরা দেখতে পাচ্ছি যে দুটি গাছ একই রকম।

(দ্রষ্টব্য: ফাইন্ড কমান্ড ফাইল সিস্টেমে উপস্থিত ফাইলগুলির তালিকা তৈরি করবে। সুতরাং, আপনি যদি বিভিন্ন ফাইল সিস্টেমের (যেমন Ext3 বনাম এপিএফএস) থেকে দুটি ডিরেক্টরি তুলনা করে থাকেন তবে আপনাকে চূড়ান্ত শে 1 সুমের আগে প্রথমে বাছাই করতে হবে by জিয়ানজুন ডং)


5

সংক্ষিপ্ত উত্তর: ফাইলের আকার পরীক্ষা করবেন না, কমান্ডের রিটার্নের স্ট্যাটাসটি পরীক্ষা করুন। রিটার্নের স্থিতি কপিটি সফল হয়েছে কিনা তার একমাত্র নির্ভরযোগ্য ইঙ্গিত (ইন্ডাস্ট্রিতে প্রত্যক্ষভাবে পরোক্ষভাবে বাইট বাই দুটি ফাইলের সাথে তুলনা করার সংক্ষিপ্ততা - যা অনুলিপি সফল হয় যদি)।

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

সমস্ত ইউনিক্স কমান্ডগুলি সফল হয়েছে কিনা তা চিহ্নিত করতে একটি স্থিতি ফিরিয়ে দেয়: সাফল্যের জন্য 0, ত্রুটির জন্য 1 বা আরও বেশি। সুতরাং প্রস্থান স্থিতি পরীক্ষা করুন cpcpত্রুটিটি কী তা নির্দেশ করে ব্যর্থ হলে সাধারণত ত্রুটি বার্তাটি মুদ্রণ করে। একটি স্ক্রিপ্টে, শেষ কমান্ডের প্রস্থান স্থিতি ম্যাজিক ভেরিয়েবলের মধ্যে রয়েছে $?

cp -v traj.trr ~/mysimulation1/
if [ $? -ne 0 ]; then
  echo 1>&2 "cp failed due to the error above"
  exit 2
 fi

$?শূন্য কিনা তা যাচাই করার পরিবর্তে , আপনি বুলিয়ান অপারেটরগুলি ব্যবহার করতে পারেন।

cp -v traj.trr ~/mysimulation1/ || exit 2

আপনি যদি কোনও স্ক্রিপ্ট চালাচ্ছেন এবং কোনও কমান্ড ব্যর্থ হলে স্ক্রিপ্টটি থামতে চান, চালান set -e। যদি কোনও কমান্ড ব্যর্থ হয় (যেমন একটি শূন্য-স্থিতি ফিরিয়ে দেয়), স্ক্রিপ্টটি তত্ক্ষণাত কমান্ডের মতো একই স্থিতি সহ প্রস্থান করবে।

set -e
…
cp -v traj.trr ~/mysimulation1/

আপনার অনুলিপি করা ফাইলটি যে কারণে বড় ছিল, এটি অবশ্যই হওয়া উচিত কারণ এটি খুব কম ফাইল । স্পার্স ফাইল হ'ল সংক্ষেপণের একটি অপরিশোধিত ফর্ম যেখানে কেবল নাল বাইটযুক্ত ব্লক সংরক্ষণ করা হয় না। আপনি যখন কোনও ফাইল অনুলিপি করেন, cpকমান্ডটি নাল বাইটগুলি পড়তে এবং লেখায়, যেখানে আসল ব্লকগুলি অনুপস্থিত ছিল, সেখানে অনুলিপিটি নাল বাইটে পূর্ণ has লিনাক্সের অধীনে, cpকমান্ডটি বিচ্ছিন্ন ফাইলগুলি সনাক্ত করার চেষ্টা করে, তবে এটি সর্বদা সফল হয় না; cp --sparse=alwaysএটি সিপিইউতে খুব সামান্য বৃদ্ধির ব্যয়ে কঠোর চেষ্টা করে।

সাধারণভাবে, duঅন্যান্য ধরণের সংকোচনের কারণে বিভিন্ন ফলাফল আসতে পারে। সংকুচিত ফাইল সিস্টেমগুলি বিরল, যদিও। যদি আপনি কোনও ফাইলের আকার যেমন ফাইলের বাইট সংখ্যার মতো জানতে চান তবে এটি ব্যবহার করা ডিস্ক ব্লকের সংখ্যার বিপরীতে ব্যবহার ls -lকরুন du


অনেক ধন্যবাদ! আপনি কি জানেন যে কোনও (পৃথক) ইউটিলিটি রয়েছে যা আমাকে বলতে পারে যে আমার ফাইলটি অপ্রয়োজনীয় কিনা?
অ্যান্ড্রু

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