আমি কীভাবে নির্ধারণ করতে পারি যে চলমান টারটি ডিস্ক ভরাট করবে কিনা


22

যদি আমি tar -cvfগভীরভাবে নেস্ট করা ফোল্ডার কাঠামোর সহজেই ডাউনলোডযোগ্য অনুলিপি তৈরি করতে 937 এমবি আকারের ডিরেক্টরিতে চালিত হয়ে থাকি তবে আমি কি নিম্নলিখিত ডিসপুটটি দিয়ে ডিস্কটি পূরণ করার ঝুঁকি নেব df -h:

/dev/xvda1            7.9G  3.6G  4.3G  46% /
tmpfs                 298M     0  298M   0% /dev/shm

সম্পর্কিত প্রশ্নগুলি:

  • যদি ডিস্কটি পূরণ করতে পারে তবে লিনাক্স (আমাজন এএমআই) এবং / অথবা tarহুডের নীচে কী করবে?
  • আবার জিজ্ঞাসা না করে আমি কীভাবে এই তথ্যটি নির্ভুলভাবে নির্ধারণ করতে পারি?

সংরক্ষণাগারটি প্রক্রিয়াজাতকরণ না করে এটি সম্ভব কিনা তা আমি নিশ্চিত নই, তবে আপনি --totalsবিকল্পটি দিয়ে খেলতে পারবেন । যে কোনও উপায়ে যদি আপনি ডিস্কটি পূরণ করেন তবে আপনি কেবল সংরক্ষণাগারটি মুছতে পারেন, imho। উপলব্ধ সমস্ত বিকল্প যাচাই করার জন্য আপনি যেতে পারেন tar --help
ইউভিভি

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

উত্তর:


24

tar -c data_dir | wc -c সংকোচনের ছাড়াই

অথবা

tar -cz data_dir | wc -c gzip সংকোচনের সাথে

অথবা

tar -cj data_dir | wc -c bzip2 সংক্ষেপণের সাথে

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

নিম্নলিখিত কমান্ডটি সহ আপনি যদি নিজের ডিরেক্টরিটির আকার সম্পর্কে একটি ভুল অনুমান করা হয় তবে আপনি নিজেই ডিরেক্টরি ডিরেক্টরিটির আকার পরীক্ষা করতে পারেন:

du -h --max-depth=1 data_dir

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

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

https://en.wikipedia.org/wiki/Tar_(computing)#Format_details


ধন্যবাদ জেমি! এখানে '- মাইএসকিএল' কী করছে? এটা কি আপনার ফাইলের নাম?
কোডেকবয়

সবেমাত্র এটি পরিবর্তন হয়েছে ... এটি আপনার ডেটা ডিরেক্টরিতে যাওয়ার পথ।
চমত্কার

1
এটি সত্যিকার অর্থে গুরুত্বপূর্ণ নয়, তবে যুক্তির সংমিশ্রণটি -f -টারে ব্যবহার করা অপ্রয়োজনীয়, যেহেতু আপনি -fস্ট্যান্ডআউটকে (অর্থাৎ tar -c data_dir) ফলাফল লিখতে কেবল যুক্তিটি পুরোপুরি ছেড়ে দিতে পারেন ।

6

আপনার ট্যারি ফাইলের আকার 937MB প্লাস প্রতিটি ফাইল বা ডিরেক্টরিগুলির জন্য প্রয়োজনীয় মেটাডেটার আকার হবে (প্রতিটি বস্তুতে 512 বাইট), এবং প্যাডিংগুলি 512-বাইট সীমানায় ফাইলগুলি সারিবদ্ধ করার জন্য যুক্ত করা হবে।

খুব রুক্ষ গণনা আমাদের জানায় যে আপনার ডেটার আর একটি অনুলিপি আপনাকে 3.4 গিগাবাইট মুক্ত রাখবে। ৩.৪ জিবিতে আমাদের কাছে প্রায় million মিলিয়ন মেটাডেটা রেকর্ডের জন্য জায়গা রয়েছে, কোনও প্যাডিং নয়, বা আপনি যদি প্রতি ফাইলটিতে গড়ে ২৫ 'বাইটের প্যাডিং অনুমান করেন তবে কম। সুতরাং যদি আপনার কাছে লক্ষ লক্ষ ফাইল এবং ডিরেক্টরি রয়েছে তবে আপনি সমস্যার মধ্যে পড়তে পারেন।

আপনি সমস্যাটি প্রশমিত করতে পারেন

  • বিকল্পগুলি zবা jবিকল্পগুলি ব্যবহার করে ফ্লাইতে সংকুচিত করাtar
  • করছেন tarএকজন সাধারণ ব্যবহারকারী যাতে উপর সংরক্ষিত স্থান হিসেবে /পার্টিশন যদি আপনি সঞ্চয়ের সীমা ছাড়িয়ে স্পর্শ করা হবে না।

2

tarনিজেই --testবিকল্পটি দিয়ে তার সংরক্ষণাগারগুলির আকারের বিষয়ে রিপোর্ট করতে পারে :

tar -cf - ./* | tar --totals -tvf -

উপরের কমান্ডটি ডিস্কে কিছুই লিখেনি এবং তারবালটিতে থাকা প্রতিটি ফাইলের পৃথক ফাইলের আকার তালিকাভুক্ত করার অতিরিক্ত সুবিধা রয়েছে। ইচ্ছার z/j/xzদুপাশে বিভিন্ন অপারেশন যুক্ত করা আপনার হ'ল |pipeসংকোচনের হাতল ধরে রাখবে।

আউটপুট:

...
-rwxr-xr-x mikeserv/mikeserv         8 2014-03-13 20:58 ./somefile.sh
-rwxr-xr-x mikeserv/mikeserv        62 2014-03-13 20:53 ./somefile.txt
-rw-r--r-- mikeserv/mikeserv       574 2014-02-19 16:57 ./squash.sh
-rwxr-xr-x mikeserv/mikeserv        35 2014-01-28 17:25 ./ssh.shortcut
-rw-r--r-- mikeserv/mikeserv        51 2014-01-04 08:43 ./tab1.link
-rw-r--r-- mikeserv/mikeserv         0 2014-03-16 05:40 ./tee
-rw-r--r-- mikeserv/mikeserv         0 2014-04-08 10:00 ./typescript
-rw-r--r-- mikeserv/mikeserv       159 2014-02-26 18:32 ./vlc_out.sh
Total bytes read: 4300943360 (4.1GiB, 475MiB/s)

আপনার উদ্দেশ্য সম্পর্কে পুরোপুরি নিশ্চিত নয়, তবে এটি যদি টারবলটি ডাউনলোড করতে হয় তবে এটি আরও বেশি বিষয় হতে পারে:

ssh you@host 'tar -cf - ./* | cat' | cat >./path/to/saved/local/tarball.tar

অথবা কেবল কপি করার জন্য tar:

ssh you@host 'tar -cf - ./* | cat' | tar -C/path/to/download/tree/destination -vxf -

আমি এটি করার কারণটি হ'ল আমি বিশ্বাস করি যে প্রশ্নে থাকা ডিরেক্টরিটি df -i এর আউটপুট 99% এ পৌঁছেছে। আমি আরও বিশ্লেষণের জন্য ডিরেক্টরিটির একটি অনুলিপি রাখতে চাই তবে স্থানটি সাফ করতে চাই
কোডেকবয়

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

@ টাফকা'গোল্ডিলোকস 'না, কারণ এটি 99% ইনোড, 99% স্থানের নয়।
গিলস

-iঠিক আছে, দুঃখিত!
স্বর্ণলোকস

@ মাইক্রোভার্স আপনার প্রারম্ভিক লাইনে - সর্বশেষতম বিকল্পটির কথা উল্লেখ করেছেন তবে আপনি নিজের কমান্ডে এটি ব্যবহার করবেন বলে মনে হয় না যা তাৎক্ষণিকভাবে অনুসরণ করে (এটি
টোটালগুলি

2

আমি এ নিয়ে অনেক গবেষণা করেছি। আপনি একটি শব্দ গণনা দিয়ে ফাইলটিতে একটি পরীক্ষা করতে পারেন তবে এটি আপনাকে এ হিসাবে একই নম্বর দেবে না du -sb adir

tar -tvOf afile.tar | wc -c

duপ্রতিটি ডিরেক্টরিকে 4096 বাইট হিসাবে গণনা করা হয় এবং tarডিরেক্টরিগুলি 0 বাইট হিসাবে গণনা করা হয়। আপনাকে প্রতিটি ডিরেক্টরিতে 4096 যোগ করতে হবে:

$(( $(tar -tvOf afile.tar 2>&1 | grep '^d' | wc -l) * 4096)))

তারপরে আপনাকে সমস্ত অক্ষর যুক্ত করতে হবে। এর মতো দেখতে এমন কিছুর জন্য:

$(( $(tar -tvOf afile.tar 2>&1 | grep '^d' | wc -l) * 4096 + $(tar -xOf afile.tar | wc -c) ))

আমি স্পষ্ট নই যেহেতু আমি স্পর্শ করা ফাইলগুলি (0 বাইটের ফাইল) বা 1 অক্ষরযুক্ত ফাইলগুলি চেষ্টা করি নি। এটি আপনার আরও কাছাকাছি হওয়া উচিত।


1

-cvfকোনও সংক্ষেপণ অন্তর্ভুক্ত করে না, সুতরাং এটির জন্য GB 1 জিবি ফোল্ডারে একটি a 1 গিগাবাইট টার ফাইল হবে (ফ্লাবের উত্তরে টার ফাইলের অতিরিক্ত আকার সম্পর্কে আরও বিশদ রয়েছে, তবে 10,000 ফাইল রয়েছে কিনা তাও নোট করুন 5 এমবি)। যেহেতু আপনার কাছে 4+ গিগাবাইট বিনামূল্যে, আপনি কোনও পার্টিশন পূরণ করতে পারবেন না।

একটি সহজে ডাউনলোডযোগ্য অনুলিপি

বেশিরভাগ লোক ডাউনলোড করার ক্ষেত্রে "ছোট" এর সমার্থক "সহজ" বিবেচনা করবেন, সুতরাং আপনার এখানে কিছু সংক্ষেপণ ব্যবহার করা উচিত। bzip2এখনকার দিনে কোনও সিস্টেম ডাব্লু / টারে উপলভ্য হওয়া উচিত, আমার ধারণা, jআপনার সুইচগুলি অন্তর্ভুক্ত করা সম্ভবত সেরা পছন্দ। z( gzip) সম্ভবত আরও সাধারণ এবং আরও স্কোয়াশের সাথে অন্যান্য (কম সর্বব্যাপী) সম্ভাবনা রয়েছে।

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


0

তাহলে গতি গুরুত্বপূর্ণ এবং কম্প্রেশন প্রয়োজন নেই, আপনি প্রাপ্ত syscall দ্বারা ব্যবহৃত চাদরে হুক করতে পারেন tarব্যবহার LD_PRELOAD, পরিবর্তন করতে tarআমাদের জন্য এটি গণনা করা হবে। আমাদের প্রয়োজন অনুসারে এই ফাংশনগুলির কয়েকটি সংশোধন করে (সম্ভাব্য আউটপুট টের ডেটার আকার গণনা করে), আমরা প্রচুর পরিমাণে নির্মূল করতে সক্ষম readএবং writeএটি সাধারণ অপারেশনে সঞ্চালিত হয় tar। এটি tarতাত্পর্যপূর্ণ করে তোলে কারণ এর নিকটস্থ কোথাও কার্নেলের অভ্যন্তরে পিছনে স্যুইচ করার দরকার নেই এবং কেবলমাত্র statঅনুরোধ করা ইনপুট ফাইল / ফোল্ডার (গুলি) প্রকৃত ফাইল ডেটার পরিবর্তে ডিস্ক থেকে পড়তে হবে।

নিচের কোড এর বাস্তবায়নের অন্তর্ভুক্ত close, readএবং writePOSIX ফাংশন। আউটপুট ফাইল হিসাবে OUT_FDকোন ফাইল বর্ণনাকারী আমরা প্রত্যাশা করি tarতা ম্যাক্রো নিয়ন্ত্রণ করে । বর্তমানে এটি stdout সেট করা হয়।

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

writecountবৈশ্বিক ভেরিয়েবলের ইনপুট বাইটগুলি যোগ করতে totalএবং ফাইলের বর্ণনাকারীর সাথে মেলে কেবলমাত্রcount বাইটের সাফল্যের মান ফিরিয়ে আনার জন্য পরিবর্তন করা হয়েছিল , অন্যথায় এটি একই নামের সিস্কাল সম্পাদন করার মাধ্যমে অর্জিত আসল মোড়কে কল করে ।OUT_FDdlsym

closeতারপরেও তার মূল কার্যকারিতাটি সমস্তই প্রিফর্ম করে তবে ফাইল বর্ণনাকারী যদি OUT_FD এর সাথে মিলে যায় তবে এটি জানে যে tarএকটি টার ফাইল লেখার চেষ্টা করা হয়েছে, সুতরাং totalসংখ্যাটি চূড়ান্ত এবং এটি স্টাডআউটকে প্রিন্ট করে।

#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include <errno.h>
#include <dlfcn.h>
#include <string.h>

#define OUT_FD 1
uint64_t total = 0;
ssize_t (*original_write)(int, const void *, size_t) = NULL;
int (*original_close)(int) = NULL;
void print_total(void)
{
    printf("%" PRIu64 "\n", total);
}

int close(int fd)
{
    if(! original_close)
    {
        original_close = dlsym(RTLD_NEXT, "close");
    }
    if(fd == OUT_FD)
    {
        print_total();
    }
    return original_close(fd);
}

ssize_t read(int fd, void *buf, size_t count)
{
    return count;
}

ssize_t write(int fd, const void *buf, size_t count)
{
    if(!original_write)
    {
        original_write = dlsym(RTLD_NEXT, "write");
    }
    if(fd == OUT_FD)
    {
        total += count;
        return count;
    }
    return original_write(fd, buf, count);
}

বেঞ্চমার্ক এমন একটি সমাধানের সাথে তুলনা করে যেখানে রিড ডিস্ক অ্যাক্সেস এবং সাধারণ টার অপারেশনের সমস্ত সিস্টোল LD_PRELOADসমাধানের বিপরীতে সঞ্চালিত হয় ।

$ time tar -c /media/storage/music/Macintosh\ Plus-\ Floral\ Shoppe\ \(2011\)\ \[Flac\]/ | wc -c
332308480
real    0m0.457s
user    0m0.064s
sys     0m0.772s
tarsize$ time ./tarsize.sh -c /media/storage/music/Macintosh\ Plus-\ Floral\ Shoppe\ \(2011\)\ \[Flac\]/
332308480
real    0m0.016s
user    0m0.004s
sys     0m0.008s

উপরের কোডটি, ভাগ করে নেওয়া লাইব্রেরি হিসাবে উপরেরটি তৈরির জন্য একটি বেসিক বিল্ড স্ক্রিপ্ট এবং LD_PRELOADএটি ব্যবহার করে " কৌশল" সহ একটি স্ক্রিপ্ট রেপোতে সরবরাহ করা হয়েছে: https://github.com/G4Vi/tarsize

LD_PRELOAD ব্যবহার সম্পর্কে কিছু তথ্য: https ://rafalالنlak.wordpress.com/2013/04/02/dynamic-linker-tricks-used-ld_preload-to-cheat-inject-features-and-inquate-program/


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