এতে যুক্ত হওয়া কোনও ফাইল সরিয়ে নেওয়া কি নিরাপদ?


28

আমার একটি নোড.জেএস প্রক্রিয়া রয়েছে যা fs.appendFileলাইন যুক্ত করতে ব্যবহার করে file.log। প্রতি লাইনে কেবল প্রায় 40 টি অক্ষরের সম্পূর্ণ লাইন যুক্ত করা হয়, যেমন কলগুলি যেমন fs.appendFile("start-end")2 টি কল fs.appendFile("start-")এবং তেমন নয় fs.appendFile("end")। আমি যদি এই ফাইলটিতে স্থানান্তরিত করি তবে আমি file2.logনিশ্চিত হতে পারি যে কোনও লাইন আংশিকভাবে হারিয়েছে বা অনুলিপি করা হয়েছে?

উত্তর:


36

যতক্ষণ আপনি ফাইল-সিস্টেমের সীমানা জুড়ে ফাইলটি সরান না ততক্ষণ অপারেশনটি নিরাপদ থাকা উচিত should এটি আসলে "চলমান" কীভাবে করা হয় তার প্রক্রিয়াটির কারণে।

আপনি যদি mvএকই ফাইল-সিস্টেমে ফাইল করেন তবে ফাইলটি আসলে ছোঁয়া যায় না, তবে কেবল ফাইল-সিস্টেমের এন্ট্রি পরিবর্তন করা হয়।

$ mv foo bar

আসলে কিছু একটা করে

$ ln foo bar
$ rm foo

এই তৈরি করবে হার্ড ফাইল (আসলে inode ফাইল-সিস্টেম এন্ট্রি দ্বারা নির্দিষ্ট) জন্য লিঙ্ক (একটি দ্বিতীয় ডিরেক্টরির এন্ট্রি) fooনামে barএবং অপসারণ fooএন্ট্রি। এখন থেকে অপসারণ করার সময় foo, একটি দ্বিতীয় ফাইল-সিস্টেম এন্ট্রি রয়েছে যা fooইনোডের দিকে নির্দেশ করছে , পুরানো এন্ট্রি সরানো fooআসলে ইনোডের সাথে সম্পর্কিত কোনও ব্লক সরিয়ে দেয় না।

আপনার প্রোগ্রামটি ফাইল-হ্যান্ডেলটি ফাইল-ইনডিতে নয়, যেহেতু এটির খোলা ফাইল-হ্যান্ডেলটি ফাইলের ইনোডের দিকে ইঙ্গিত করে, আনন্দের সাথে ফাইলটিতে যুক্ত হবে।

দ্রষ্টব্য: যদি আপনার প্রোগ্রামটি লেখার মধ্যে ফাইলটি বন্ধ করে এবং পুনরায় খোলে, আপনি পুরানো ফাইল-সিস্টেম এন্ট্রি দিয়ে একটি নতুন ফাইল তৈরি করে শেষ করবেন !

ক্রস ফাইল-সিস্টেমের চালনা:

আপনি যদি ফাইল-সিস্টেমের সীমানা জুড়ে ফাইলটি সরিয়ে থাকেন তবে জিনিসগুলি কুৎসিত হয়। এক্ষেত্রে আপনি নিজের ফাইলটিকে সামঞ্জস্য রেখে গ্যারান্টি দিতে পারবেন না, যেহেতু mvআসলে

  • লক্ষ্য ফাইল-সিস্টেমে একটি নতুন ফাইল তৈরি করুন
  • পুরানো ফাইলের সামগ্রীগুলি নতুন ফাইলে অনুলিপি করুন
  • পুরানো ফাইল সরান

অথবা

$ cp /path/to/foo /path/to/bar
$ rm /path/to/foo

রেস্প।

$ touch /path/to/bar
$ cat < /path/to/foo > /path/to/bar
$ rm /path/to/foo

অনুলিপিটি আপনার অ্যাপ্লিকেশনটি লেখার সময় ফাইলটির শেষের দিকে পৌঁছেছে কিনা তার উপর নির্ভর করে, এটি ঘটতে পারে যে নতুন ফাইলটিতে আপনার কেবলমাত্র অর্ধেক লাইন রয়েছে have

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


3
এফওয়াইআই, ইউনিক্সের প্রথম সংস্করণগুলিতে একটি rename()সিস্টেম কল ছিল না। সুতরাং আসল সংস্করণটি mvআসলে link()হার্ড লিঙ্কটি তৈরি করার জন্য কল করেছিল, তারপরে unlink()মূল নামটি সরিয়ে ফেলবে। rename()এটিকে কার্নেলের মধ্যে পরমাণুভাবে প্রয়োগ করতে ফ্রিবিএসডি-তে যুক্ত করা হয়েছিল।
বারমার

আমি দুঃখিত তবে কি file-system borders?
লাইক 9 মি

1
@ laike9m - ফাইল সিস্টেমের সীমানা বলতে এই বোঝায় যে একটি সাধারণ ফাইল সিস্টেমটি একটি ডিস্ক ড্রাইভের মতো একটি মেমরি ডিভাইসে একটি পার্টিশনে থাকতে হয়। আপনি যদি ফাইল সিস্টেমের মধ্যে কোনও ফাইলের নাম পরিবর্তন করেন, তবে সমস্ত পরিবর্তন এটি ডিরেক্টরিতে প্রবেশের নাম। এটি এখনও একই ইনোড রয়েছে - যদি এটি শুরু করার জন্য আইওনডের উপর ভিত্তি করে একটি ফাইল সিস্টেমে থাকত - যেমন বেশিরভাগ লিনাক্স ফাইল সিস্টেমগুলি। তবে, আপনি যদি ফাইলটিকে অন্য একটি ফাইল সিস্টেমে স্থানান্তরিত করেন তবে প্রকৃত ডেটা স্থানান্তর করতে হবে এবং ফাইলটি নতুন ফাইল সিস্টেম থেকে একটি নতুন ইনোড পাবে। এটি যখন ঘটেছিল তখন ফাইলে থাকা কোনও অপারেশন ব্যাহত হবে।
জো

9

যেহেতু আপনি বলেছেন যে আপনি নোড.জেএস ব্যবহার করছেন তাই আমি ধরে নিই যে আপনি ফাইলগুলির নাম পরিবর্তন করতে fs.rename()(বা fs.renameSync()) ব্যবহার করছেন । এই নোড.জেএস পদ্ধতিটি পুনর্নবীকরণ (2) সিস্টেম কলটি ব্যবহার করার জন্য নথিভুক্ত করা হয়েছে , যা কোনওভাবেই ফাইলটিকে নিজের হাতে স্পর্শ করে না, কেবল ফাইল সিস্টেমে তালিকাভুক্ত নামটি পরিবর্তিত করে:

" পুনর্নামকরণ () কোনও ফাইলের নাম পরিবর্তন করে , প্রয়োজনে ডিরেক্টরিগুলির মধ্যে স্থানান্তরিত করে। ফাইলের অন্য কোনও হার্ড লিঙ্ক ( লিঙ্ক (2) ব্যবহার করে তৈরি করা হয়েছে ) ক্ষতিগ্রস্থ নয় old পুরাতনপথের জন্য ওপেন ফাইল বর্ণনাকারীরাও ক্ষতিগ্রস্থ নয় ।"

বিশেষত, উপরের উদ্ধৃত সর্বশেষ বাক্যটি নোট করুন, যার মতে যে কোনও উন্মুক্ত ফাইল বর্ণনাকারী (যেমন আপনার প্রোগ্রামটি ফাইলটিতে লেখার জন্য ব্যবহার করবে) এটির পুনঃনামকরণের পরেও এটিকে নির্দেশ করতে থাকবে। সুতরাং, ফাইলটি একই সাথে লিখিত হওয়ার সময়ে নাম পরিবর্তন করা হলেও কোনও তথ্য ক্ষতি বা দুর্নীতি হবে না।


অ্যান্ড্রেস ওয়েইস তার উত্তরে নোট হিসাবে, পুনর্নবীকরণ (2) সিস্টেম কল (এবং এইভাবে fs.rename()নোড.জেজে) ফাইল সিস্টেমের সীমানা জুড়ে কাজ করবে না। সুতরাং, এই পদ্ধতিতে কোনও ফাইলকে অন্য একটি ফাইল সিস্টেমে স্থানান্তরিত করার চেষ্টা করা ব্যর্থ হবে।

ইউনিক্স mvকমান্ড ত্রুটিটি সনাক্ত করে এবং এর পরিবর্তে ফাইলটিকে একটি নতুন ফাইলে অনুলিপি করে মূলটি মুছে ফেলার মাধ্যমে এই সীমাবদ্ধতাটি আড়াল করার চেষ্টা করে। দুর্ভাগ্যবশত, এই মত ফাইল চলন্ত করে ফাইলটি যখন এটি লেখা হচ্ছে সরানোর সময় ঝুঁকি ডেটা হারিয়ে। সুতরাং, আপনি যদি একই সাথে লিখিত হতে পারে এমন ফাইলগুলি নিরাপদে নামকরণ করতে চান তবে আপনার ব্যবহার করা উচিত নয়mv (বা, কমপক্ষে, আপনার অবশ্যই একেবারে নিশ্চিত হওয়া উচিত যে নতুন এবং পুরানো পাথ একই ফাইল সিস্টেমে রয়েছে)।

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