লিনাক্সে / sys থেকে ফাইলগুলি অনুলিপি করতে rync কেন ব্যর্থ হয়?


12

আমার কাছে বাশ স্ক্রিপ্ট রয়েছে যা rsyncআর্চলিনাক্সে ফাইলগুলি ব্যাকআপ করতে ব্যবহার করে। আমি লক্ষ করেছি যে ঠিকঠাক কাজ করার সময় rsyncথেকে কোনও ফাইল অনুলিপি করতে ব্যর্থ হয়েছে :/syscp

# rsync /sys/class/net/enp3s1/address /tmp    
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
rsync: read errors mapping "/sys/class/net/enp3s1/address": No data available (61)
ERROR: address failed verification -- update discarded.
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1052) [sender=3.0.9]

# cp  /sys/class/net/enp3s1/address /tmp   ## this works

আমি ভাবছি কেন rsyncব্যর্থ হয়, এবং এটির সাথে ফাইলটি অনুলিপি করা সম্ভব?


4
কেন আপনি অনুলিপি করতে চান /sys/?
frostschutz

1
@ ফ্রস্টসচুটজ আমি ওপি-তে কমান্ডটি একটি নেটওয়ার্ক কার্ডের ম্যাক-ঠিকানাটি অনুলিপি করতে (একটি ফাইল হিসাবে)
ইউজিন ইয়ারম্যাশ

@ ইউজনি সুতরাং, যেখানে ম্যাক ঠিকানাটি সেট করা আছে সেখান থেকে কনফিগার করা ফাইলটি ব্যাকআপ করার পক্ষে কেন যথেষ্ট নয়?
ছাড়ুন

@ ইউজনি কি এখানে লিখতেও সম্ভব /sys/class/net/*/address(চেষ্টা করার পরে আমি "অনুমতি অস্বীকার" পাই)? যদি তা না হয় তবে আপনি এটি পুনরুদ্ধার করা যায় না বলে আপনি একটি আসল / দরকারী ব্যাকআপ তৈরি করছেন না।
depquid

উত্তর:


12

Rsync হয়েছে কোড যা একটি ফাইল পড়তে সময় ছেঁটে ফেলা হয়েছে এবং এই ত্রুটি দেয় বিশেষভাবে চেক - ENODATA। ফাইলগুলিতে এই আচরণটি কেন হয় তা আমি জানি না /sys, তবে যেহেতু তারা আসল ফাইল নয়, তাই অনুমান করি এটি খুব অবাক হওয়ার মতো নয়। এই নির্দিষ্ট চেকটি এড়াতে আরএসসিএনকে বলার কোনও উপায় বলে মনে হচ্ছে না।

আমি মনে করি আপনি সম্ভবত /sysচান জাতীয় তথ্য (নেটওয়ার্ক কার্ডের ঠিকানার মতো) চেরি-বাছাই করতে নির্দিষ্ট স্ক্রিপ্টগুলি ব্যবহার না করে এবং সম্ভবত নির্দিষ্ট স্ক্রিপ্টগুলি ব্যবহার না করাই ভাল ।


পিএফটি, বিশেষত আরএসসিএন কেন ব্যর্থ হয় তা অনুধাবন করতে মজা কোথায়?
ব্র্যাচলে

দুঃখিত, আমি পরিষ্কার ছিল না। Rsync বিশেষত পড়ার সময় সংক্ষিপ্ত ফাইলগুলির জন্য পরীক্ষা করে এবং এই ত্রুটিটি ছুঁড়ে দেয়।
mattdm

4
আমি মনে করব তাদের সাথে এই আচরণ রয়েছে কারণ আপনি যতক্ষণ না এগুলি পড়েন, "সেখানে" কী আছে তা একেবারে নিশ্চিত নয়; রিডটি আসলে কার্নেল থেকে গতিশীল তথ্যের জন্য একটি অনুরোধ। সুতরাং কার্নেলটি ফাইলের আকার ইত্যাদিতে ডাব্লুআরটি আগে থেকেই সঠিক বিবরণ দেওয়ার চেষ্টা করে না এবং আপনি যেমন উল্লেখ করেছেন, আরএসসিএনসি যেমন একটি তাত্পর্যকে খারাপ চিহ্ন হিসাবে গ্রহণ করে।
স্বর্ণলোকস

11

প্রথম বন্ধটি/sys একটি সিউডো ফাইল সিস্টেম । আপনি যদি তাকান তবে /proc/filesystemsআপনি নিবন্ধিত ফাইল সিস্টেমের একটি তালিকা পাবেন যেখানে বেশ কয়েকটি nodev সামনে রয়েছে। এটি নির্দেশ করে তারা ছদ্ম ফাইল সিস্টেম । এর অর্থ এটি একটি র‌্যাম-ভিত্তিক ফাইল সিস্টেম হিসাবে চলমান কার্নেলে বিদ্যমান। আরও তাদের একটি ব্লক ডিভাইস প্রয়োজন হয় না।

$ cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   bdev
...

বুট করার সময় কার্নেল এই সিস্টেমটি মাউন্ট করে এবং উপযুক্ত হলে এনট্রি আপডেট করে। যেমন বুট চলাকালীন বা এর মাধ্যমে নতুন হার্ডওয়্যার পাওয়া যায় udev

ইন /etc/mtabআপনি সাধারণত এটি দ্বারা মাউন্ট করুন:

sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0

বিষয়টিতে একটি দুর্দান্ত কাগজের জন্য প্যাট্রিক মোচেলস - দ্য সিএসএফএস ফাইল সিস্টেম পড়ুন


/ সিস্টেমে ফাইলের স্ট্যাটাস

আপনি অধীনে একটি ডিরেক্টরিতে যান তাহলে /sysকি একটি ls -lআপনি যে সমস্ত ফাইল এক সাইজ হয়েছে লক্ষ্য করবেন। সাধারণত 4096 বাইট এটি রিপোর্ট করেছেন sysfs

:/sys/devices/pci0000:00/0000:00:19.0/net/eth2$ ls -l
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_assign_type
-r--r--r-- 1 root root 4096 Apr 24 20:09 address
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_len
...

আরও আপনি statএকটি ফাইল করতে পারেন এবং অন্য একটি স্বতন্ত্র বৈশিষ্ট্য লক্ষ্য করতে পারেন ; এটি 0 টি ব্লক দখল করে। মূলের ইনোডের (স্টেট / সিএস) 1 হয় /stat/fsসাধারণত ইনোড 2 থাকে etc.

আরএসএনসি বনাম সিপি

সিউডো ফাইলগুলি সিঙ্ক্রোনাইজ করার ক্ষেত্রে আরএসসিএনএইচ ব্যর্থতার সহজতম ব্যাখ্যা সম্ভবত উদাহরণস্বরূপ।

বলুন আমাদের কাছে একটি ফাইল রয়েছে addressযা 18 বাইট। একটি lsবা statফাইল 4096 বাইট রিপোর্ট করে।


rsync

  1. ফাইল ডেস্ক্রিপ্টার খুলুন, fd।
  2. আকারের মতো তথ্য পেতে fstat (fd) ব্যবহার করে।
  3. আকারের বাইটগুলি পড়ার জন্য সেট করুন, অর্থাৎ 4096 @ এটি @ ম্যাটডেম দ্বারা সংযুক্ত কোডের 253 লাইন হবে ।read_size == 4096
    1. জিজ্ঞাসা করুন; পড়ুন: 4096 বাইট
    2. একটি সংক্ষিপ্ত স্ট্রিং অর্থাত 18 বাইট পড়া হয়। nread == 18
    3. read_size = read_size - nread (4096 - 18 = 4078)
    4. জিজ্ঞাসা করুন; পড়ুন: 4078 বাইট
    5. 0 বাইট পড়ুন (প্রথম পাঠ হিসাবে ফাইলের সমস্ত বাইট গ্রাস করে)।
    6. nread == 0, লাইন 255
    7. 4096বাইটস পড়তে অক্ষম । জিরো আউট বাফার
    8. ত্রুটি সেট করুন ENODATA
    9. রিটার্ন।
  4. ভুল প্রতিবেদন.
  5. পুনরায় চেষ্টা করা. (উপরে লুপ)
  6. ব্যর্থ হয়।
  7. ভুল প্রতিবেদন.
  8. ঠিক আছে।

এই প্রক্রিয়া চলাকালীন এটি সম্পূর্ণ ফাইলটি পড়ে। তবে কোনও আকারের উপলব্ধ না করে এটি ফলাফলকে বৈধতা দিতে পারে না - সুতরাং ব্যর্থতা কেবলমাত্র বিকল্প।

CP

  1. ফাইল ডেস্ক্রিপ্টার খুলুন, fd।
  2. St_size (এছাড়াও lstat এবং স্ট্যাট ব্যবহার করে) এর মতো তথ্য পেতে fstat (fd) ব্যবহার করে।
  3. ফাইলটি বিচ্ছিন্ন হওয়ার সম্ভাবনা আছে কিনা তা পরীক্ষা করে দেখুন। ফাইলটি হোল ইত্যাদি আছে

    copy.c:1010
    /* Use a heuristic to determine whether SRC_NAME contains any sparse
     * blocks.  If the file has fewer blocks than would normally be
     * needed for a file of its size, then at least one of the blocks in
     * the file is a hole.  */
    sparse_src = is_probably_sparse (&src_open_sb);
    

    statপ্রতিবেদনগুলিতে শূন্য ব্লক থাকার ফাইল হিসাবে এটি বিরল হিসাবে শ্রেণিবদ্ধ করা হয়।

  4. ব্যাপ্তি-অনুলিপি ( সাধারণ স্পার্স ফাইলগুলি অনুলিপি করার আরও কার্যকর উপায় ) দ্বারা ফাইল পড়ার চেষ্টা করে এবং ব্যর্থ হয়।

  5. স্পার্স-কপি দ্বারা অনুলিপি।
    1. MAXINT এর সর্বাধিক পঠন আকারের সাথে শুরু হয়।
      সাধারণত 1844674407370955161532 বিট সিস্টেমে বাইটস।
    2. জিজ্ঞাসা করুন; 4096 বাইট পড়ুন। (স্ট্যাট তথ্য থেকে স্মরণে বরাদ্দ বাফার আকার।)
    3. একটি সংক্ষিপ্ত স্ট্রিং অর্থাত 18 বাইট পড়া হয়।
    4. কোনও গর্ত প্রয়োজন কিনা তা পরীক্ষা করুন, না।
    5. লক্ষ্য করতে বাফার লিখুন।
    6. সর্বাধিক পঠনের আকার থেকে 18 বিয়োগ করুন।
    7. জিজ্ঞাসা করুন; 4096 বাইট পড়ুন।
    8. 0 টি বাইট হিসাবে সমস্ত প্রথম পঠিত হয়ে যায়।
    9. সাফল্য ফিরে।
  6. সব ঠিক আছে. ফাইলের জন্য পতাকা আপডেট করুন।
  7. ঠিক আছে।

2

সম্পর্কিত হতে পারে, তবে বর্ধিত বৈশিষ্ট্য কলগুলি sysfs এ ব্যর্থ হবে:

[রুট @ হাইপারভাইজার এথ0] # এলএসটার ঠিকানা

lsattr: ঠিকানায় পতাকা পড়ার সময় ডিভাইসের জন্য অনুপযুক্ত ioctl

[মূল @ হাইপারভাইজার এথ0] #

আমার স্ট্রেসের দিকে তাকানো দেখে মনে হচ্ছে আরএসসিএনসি বর্ধিত বৈশিষ্ট্যগুলি ডিফল্টরূপে টানতে চেষ্টা করে:

22964 <... getxattr পুনরায় শুরু হয়েছে>, 0x7fff42845110, 132) = -1 এনওডাটা (কোনও ডেটা উপলব্ধ নেই)

আমি বর্ধিত বৈশিষ্ট্যগুলি এড়িয়ে যাওয়া সমস্যার সমাধান করে তবে কিছুই খুঁজে পাওয়া যায়নি ( গন্তব্যে --xattrsএগুলিকে সরিয়ে দেয় ) তা দেখতে rsync দেওয়ার জন্য আমি একটি পতাকা খুঁজে পাওয়ার চেষ্টা করেছি ।


0

Rsync সাধারণত ফাইলটির তথ্য পড়ুন, ফাইলের সামগ্রীগুলি বা ডেল্টাগুলি গন্তব্য ডিরেক্টরিতে একটি অস্থায়ী ফাইলে স্থানান্তরিত করেন, তারপরে ফাইলটির ডেটা যাচাই করার পরে এটি গন্তব্য ফাইলের নামটিতে নামকরণ করে।

আমার বিশ্বাস, সিএসএফএসের সমস্যাটি হ'ল সমস্ত ফাইল 4k (একটি মেমরি পৃষ্ঠা) হিসাবে দেখায় তবে সেগুলিতে কেবলমাত্র কয়েকটি বাইট থাকতে পারে। গন্তব্যস্থলে একটি সম্ভাব্য দূষিত ফাইলের অনুলিপি এড়ানোর জন্য rsync ফাইলটির মেটাডেটা এবং আসলে কীভাবে অনুলিপি করা হয়েছিল তার মধ্যে কোনও মিল নেই বলে কপিটি বাতিল করে।

কমপক্ষে rsync v3.0.6 এ এই আচরণটি --inplaceস্যুইচ ব্যবহার করে এড়ানো যায় । Rsync এখনও ত্রুটি সনাক্ত করতে পারে তবে গন্তব্য ফাইলগুলি ইতিমধ্যে ওভাররাইট হয়ে যাবে যখন এটি সেখানে সম্ভাব্য দূষিত ফাইলগুলি ছেড়ে দেবে।

যদিও এর একটি পার্শ্ব প্রতিক্রিয়া নোট করুন যে ফাইলগুলি 4k তে শূন্য প্যাডযুক্ত হয়ে যায় কারণ এটি আকারের সিআরএনসি ফাইলগুলি মনে করে। এটি বেশিরভাগ ক্ষেত্রে কোনও পার্থক্য করা উচিত নয় কারণ নাল বাইটগুলি সাধারণত উপেক্ষা করা হয়।

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