পুরো ডিস্কে ডিডি করুন, তবে খালি অংশ চান না


33

আমার একটি ডিস্ক আছে, বলুন / দেব / এসডিএ।

এখানে fdisk -l:

 Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          27      209920   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              27         525     4000768    5  Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5              27         353     2621440   83  Linux
/dev/sda6             353         405      416768   83  Linux
/dev/sda7             405         490      675840   83  Linux
/dev/sda8             490         525      282624   83  Linux

আমাদের উত্পাদন অন্যান্য ডিভাইসগুলি ফ্ল্যাশিংয়ের জন্য আমাদের ফাইল সার্ভারে সঞ্চয় করার জন্য আমার একটি চিত্র তৈরি করা দরকার যাতে আমি কেবল ব্যবহৃত স্থানটি চাই (প্রায় 4 জিবি)। আমি এমবিআর ইত্যাদি রাখতে চাই ... কারণ অনুলিপিটি শেষ হওয়ার সাথে সাথে এই ডিভাইসটি বুট প্রস্তুত হওয়া উচিত।

কোন ধারনা? আমি আগে ব্যবহার করে আসছি dd if=/dev/sda of=[//fileserver/file], কিন্তু সেই সময়ে, আমার মাস্টার অনুলিপিটি 4 জিবি ফ্ল্যাশ আইডিতে ছিল।


2
নীচে সমস্ত উত্তর @ সুডোয়ার ব্যতীত ভুল। সঠিক উত্তরটি ব্যবহার করা dd conv=sparse
বাহামাত

@ বাহাহাত, না, জিপিপ আরও ভাল কারণ এটি ডেটা সংকুচিত করবে।
psusi

1
বিরল হিসাবে একই জিনিস না।
বাহামাত

@ বাহামা, প্রশ্ন স্প্রেসের জন্য বিশেষভাবে জিজ্ঞাসা করছে না; কীভাবে চিত্রটি কম স্থান গ্রহণ করবে।
psusi

উত্তর:


37

যেদিন আমি এম্বেডড লিনাক্স বিতরণগুলির সাথে একই ধরণের সমস্যায় পড়েছিলাম - চিত্রটি সংকুচিত করার আগে সমস্ত জাঙ্ক থেকে মুক্তি পান get

dd if=/dev/zero of=asdf.txt। এটি মারা না হওয়া পর্যন্ত অপেক্ষা করুন। सादড.টি.এস.টি.টি মুছুন।

আপনি সবেমাত্র ডিভাইসের সমস্ত ফাঁকা জায়গায় শূন্য লিখেছেন।

এখন একটি ডিস্ক ইমেজ নিন এবং gzip মাধ্যমে এটি চালান। ভয়েলা, বিরল চিত্র।

সম্ভবত খুব ভাল স্কেল করে না এবং সমস্যাটি তৈরি করতে পারে যদি আপনার যদি ডিস্কে আসলেই লিখতে হয় তবে হেই।

আপনি ডিস্কের আরএসআইএনসি স্ন্যাপশটটি অন্য ভলিউমে নিতে পারেন, এটি শূন্য এবং তারপরে সেই ডিস্ক চিত্রটি নিতে পারেন।

দ্রষ্টব্য: এসএসডি-র জন্য বিপজ্জনক হতে পারে, ব্যবহারকারীর প্রতিশ্রুতিবদ্ধ হওয়ার জন্য এই অপারেশনটি বিবেচনা করা উচিত।


যদি আমি এটি জিজিপ এর মাধ্যমে চালনা করি তবে এটি ব্যবহার করার আগে আমাকে কি আনজিপ করতে হবে? এবং জিজিপ দিয়ে এটি চালিয়ে, আমি কি ডিডি প্রক্রিয়া চলাকালীন পাইপ করব?
জোনাথন হেনসন

3
হ্যাঁ। dd if=sda2.gz | gunzip > /dev/sda2এবংdd if=/dev/sda2 | gzip > sda2.gz
রব বোস

3
"আপনি ডিভাইসের সমস্ত বিনামূল্যে জায়গাতে সবেমাত্র জিরো লিখেছেন"। আপনি মনে করেন ডিভাইস নয়, বিভাজন। সুতরাং আপনার ofপ্রতিটি বিভাজনের জন্য একটি কমান্ড চালাতে হবে ।
jiggunjer

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

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

17

ধরে নেওয়া যাক আপনি সংরক্ষণ করতে চান /dev/sdXNকরতে /tgtfs/image.rawএবং আপনার রুট আছেন:

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. জিরোফিল বা কেবল ব্যবহার করুন: dd if=/dev/zero of=/srcfs/tmpzero.txtঅব্যবহৃত ব্লকগুলিকে শূন্য দিয়ে পূরণ করতে (তারপরে সম্পূর্ণ ফাইল ফাইলটি পূরণ করার জন্য অপেক্ষা করুন rm /srcfs/tmpzero.txt)

  3. ছবিটি ডিডি সহ নিয়ে যান এবং ফ্লাইটে শূন্যগুলিকে ঘুষি দেওয়ার জন্য কনভ = স্পার্স ব্যবহার করুন: dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw

আপনি যদি সংকোচনের ব্যবহার করতে চান তবে শূন্য ব্লকগুলি অত্যন্ত সংকোচনযোগ্য হওয়ায় আপনাকে ডিডি দিয়ে জিরোগুলিকে ঘুষি লাগতে হবে না:

dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw

পিএস: আপনার লক্ষ্য করা উচিত যে এটি কোনও ফ্ল্যাশ মেমরি ভিত্তিক স্টোরেজ মিডিয়াতে ভাল ধারণা নয় (যেমন আপনার উত্স ফাইল সিস্টেমটি এসএসডি হওয়া উচিত)


5
এটা সঠিক উত্তর. ব্যবহার dd conv=sparse
বাহামাত

1
ফ্ল্যাশ স্টোরেজে এটি করতে সমস্যা কি?
ড্যান

2
@ ড্যান (হার্ডওয়্যার এবং সফ্টওয়্যার ডিজাইন এবং কনফিগারেশনের উপর নির্ভর করে) এটি আপনার এসএসডি-তে ব্যাপক লেখার কারণ হতে পারে এবং এর জীবনকাল হ্রাস করতে পারে। এবং সামগ্রিকভাবে, পুরানো ডিস্ক থেকে নতুনকে ডেটা স্থানান্তর করার জন্য এটি ঠিক আছে (বা ওপি কী করতে চেয়েছিল) তবে এইচডিডি-তে এমনকি ডিস্ক / পার্টিশন স্তরের ব্যাকআপ নিয়মিত ব্যাকআপ এবং পুনরুদ্ধারের জন্য ভাল সমাধান নয়। ফাইল লেভেল ব্যাকআপ (যেমন একটি ফাইল-সিস্টেম থেকে অন্য ফাইলগুলিতে ফাইলগুলি কপি করা), বা ফাইল-সিস্টেমের স্তরের ব্যাকআপ (বিটিআরএফএস btrfs snapshotএবং btrfs sendসরঞ্জামগুলির সাথে ফাইল-সিস্টেমের সাথে ) একটি আরও ভাল সমাধান আইএমএইচও।
সুডোয়ার

ইঙ্গিত: আপনি না থাকে তাহলে gzআপনার PATH(যেমন আমি না, GParted- র লাইভে), আপনি ব্যবহার করতে পারেন gzip -cপরিবর্তে।
এক্সট্রাস্পিলিটি

11

গণনা বিকল্পের সাথে ডিডি ব্যবহার করুন।

আপনার ক্ষেত্রে আপনি fdisk ব্যবহার করছিলেন তাই আমি সেই পদ্ধতিটি গ্রহণ করব। আপনার "sudo fdisk -l" উত্পাদিত:

    Disk /dev/sda: 64.0 GB, 64023257088 bytes
    255 heads, 63 sectors/track, 7783 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x0000e4b5

    Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          27      209920   83  Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2              27         525     4000768    5  Extended
    Partition 2 does not end on cylinder boundary.
    /dev/sda5              27         353     2621440   83  Linux
    /dev/sda6             353         405      416768   83  Linux
    /dev/sda7             405         490      675840   83  Linux
    /dev/sda8             490         525      282624   83  Linux

দুটি বিষয় যা আপনার লক্ষ্য করা উচিত তা হ'ল 1) ইউনিটের আকার এবং 2) "শেষ" কলাম। আপনার ক্ষেত্রে আপনার কাছে সিলিন্ডার রয়েছে যা 8225280 বাইটের সমান। "শেষ" কলামে sda8 525 এ শেষ হয় (যা 525 [ইউনিট] * 16065 * 512 = ~ 4.3 গিগাবাইট)

ডিডি অনেক কিছু করতে পারে যেমন অফসেটের পরে শুরু করা বা নির্দিষ্ট সংখ্যক ব্লকের পরে থামানো। আমরা ডিডিতে গণনা বিকল্পটি ব্যবহার করে পরবর্তীটি করব। কমান্ড নিম্নলিখিত হিসাবে প্রদর্শিত হবে:

    sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526

যেখানে -b ব্লকের আকার হয় (এফডিস্ক ব্যবহার করে এমন ইউনিটটি ব্যবহার করা সবচেয়ে সহজ তবে এই ইউনিটগুলিতে গণনা বিকল্পটি ঘোষিত হওয়ার পরে যে কোনও ইউনিট এতক্ষণ কাজ করবে), এবং গণনা হ'ল আমরা যে ইউনিটগুলি অনুলিপি করতে চাইছি তা (নোট আমরা শেষের ব্লকটি ক্যাপচারের জন্য গণনাটি 1 দ্বারা বাড়িয়ে দিই)।


অবগতির জন্য: সিলিন্ডার মধ্যে ইউনিট দেখানোর জন্য, ব্যবহারfdisk -l -u=cylinders /dev/sda
xinthose

3
কেন এটি গৃহীত উত্তর নয়? এটি উত্সটি সংশোধন না করায় এটি অন্তত অন্তর্নিহিত বিকল্প বলে মনে হচ্ছে।
ব্যবহারকারী 33326

@ ব্যবহারকারী 33৩ because66 কারণ এই উত্তরটি ড্রাইভে অবিভাজনিত স্থান অনুলিপি করার জন্য ভাল, পার্টিশনের মধ্যে অব্যবহৃত স্থান নয়, যা ওপি যত্নশীল।
জিডর্ন

8

/dev/zeroফ্রি-ডিস্ক-স্পেসে ইঙ্গিত করার সময় এবং ব্যবহার সম্ভব dd conv=sparse/ gz -cসম্ভাব্য, 100 গিগাবাইটে ফাঁকা স্থান সহ বিশাল ডিস্কগুলিতে, আইং /dev/zeroব্যথাজনকভাবে ধীরে ধীরে - অন্য উত্তরগুলির হিসাবে উল্লেখ করা উচিত নয়, /dev/zeroইওএফ পর্যন্ত এসডিডি যুক্ত করা উচিত।

এই পরিস্থিতিতে যখন আমি দৌড়ালাম তখন এখানে আমি কী করেছি:

  • লুবুন্টু লাইভ সিডিতে gpartedডিস্কটি ন্যূনতম সম্ভাব্য আকারে 'সঙ্কুচিত' করতে ব্যবহৃত হত, বাকি স্থানটি নির্বিঘ্নে রেখে


  • dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gz দ্রুত-সংকুচিত চিত্র তৈরি করতে ব্যবহৃত (এটি বলা বাহুল্য, আপনার যদি কাঁচা ডেটা সঞ্চয় করার পর্যাপ্ত জায়গা থাকে (বা অন্যথায় সিপিইউ লোডিং হ্রাস করতে ঝুঁকছেন) তবে আপনি সংক্ষেপণটি এড়িয়ে যেতে চাইতে পারেন)


  • dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdY বিভিন্ন ডিস্কে ডেটা অনুলিপি করতে ব্যবহৃত হয়
  • gpartedপার্টিশনটি 'প্রসারিত' করতে আবার ব্যবহৃত হয়

আমি এটি একাধিক পার্টিশনের জন্য চেষ্টা করে দেখিনি তবে আমি বিশ্বাস করি যে গন্তব্য ডিস্কে পার্টিশন-টেবিলটি প্রথমে তৈরি করা হয় এবং কেবলমাত্র পার্টিশনে থাকা ডেটা অনুলিপি করা dd- পড়া / লেখার অফসেটের মাধ্যমে অনুলিপি করা হয় তবে উপরের প্রক্রিয়াটি 'পার্টিশনগুলি' অনুলিপি করতে সক্ষম হবে ( skip/ যথাযথ seekবিকল্পের বিকল্প dd) যথাযথ হিসাবে প্রয়োজন হবে।


1
এটি আসল উত্তর, কেবলমাত্র countপ্যারামিটারটি ব্যবহার করুন
গর্ডি

7

আপনি পারবেন না। ddখুব নিম্ন স্তরের একটি সরঞ্জাম এবং এর ফাইল এবং খালি জায়গার মধ্যে পার্থক্য করার কোনও উপায় নেই।

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


7
ধরে নিলাম খালি জায়গাটি আগে ব্যবহার করা হয়নি। প্রত্যাশার মতো সংকোচনের কাজটি নিশ্চিত করার জন্য আপনি প্রথমে শূন্যস্থান পূরণ করতে পারেন।
সাইরেক্স

1
সত্য। এবং এটি কেবল প্রক্রিয়াটিকে জটিল করে তোলে এবং আরও বেশি সময় নেয়।
c2h5oh

6

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

আপনি যদি প্যারিটিমেজ , ক্লোনজিলা বা অন্য কিছু লিনাক্স ক্লোনিং সরঞ্জামের মতো কোনও সরঞ্জাম ব্যবহার করেন তবে তারা এগুলির বেশিরভাগ স্বয়ংক্রিয়ভাবে আপনার জন্য পরিচালনা করবে।


পার্টিম্যাজ এবং ক্লোনজিলা খালি জায়গাগুলি পড়া বাদ দেওয়ার পক্ষে যথেষ্ট পরিমাণে স্মার্ট , এতে জিরো লিখতে আপনার উপর নির্ভর না করে ডিডি বা গিজিপ পড়ে বা শূন্যগুলি পড়ার পরে সেগুলি পড়ে
PSusi

2

গৃহীত উত্তর সঠিক নয়। আমি উপরের মন্তব্যে একমত আমি নিয়মিত বেসে আমার ডিস্কটি ব্যাক আপ করতে গণনা প্যারামিটার সহ ডিডি ব্যবহার করি । আপনার ডিভাইসের BACKUP_FOLDER এবং চিঠিটি কেবল "এক্স" দিয়ে প্রতিস্থাপন করুন:

ডিস্কের সর্বশেষ ব্যবহৃত ব্লক সংজ্ঞায়িত করুন:

ct=$(fdisk -l | awk '$1 == "/dev/sdX" { print $3 }')

তারপরে ডিস্কটি ক্লোনিং করুন (এটি খালি জায়গা বাদে):

dd if=/dev/sdX bs=512 count=$ct | gzip > BACKUP_FOLDER/sdX_$(date +"%Y-%m-%d").img.gz >>"$LOG"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.