bup-restore(1) General Commands Manual bup-restore(1)

bup-restore - بازیابی فایل‌ها و دایرکتوری‌ها از مخزن پشتیبان bup

bup restore [-r host:[path]] [--outdir=outdir] [--exclude-rx pattern] [--exclude-rx-from filename] [-v] [-q] <paths...>

دستور bup restore فایل‌ها را از یک مجموعه پشتیبان (ایجادشده با bup-save(1)) به سیستم‌فایل محلی بازیابی و استخراج می‌کند.

مسیرهای مشخص‌شده (paths) به صورت زیر هستند: /branch/revision/some/where. اجزای این مسیر به شرح زیر است:

نام مجموعه پشتیبان برای بازیابی از آن؛ این مورد با گزینه --name (-n) در دستور bup save مطابقت دارد.
نسخه یا بازبینی (revision) از مجموعه پشتیبان برای بازیابی. نسخه latest همواره تازه‌ترین پشتیبان روی شاخه داده‌شده است. می‌توانید سایر نسخه‌ها را با استفاده از bup ls /branch بیابید.
مسیر قبلاً ذخیره‌شده (پس از هرگونه حذف یا پیوند مسیر مانند stripping/grafting) که قصد بازیابی آن را دارید. برای نمونه، etc/passwd.

اگر some/where نام یک دایرکتوری باشد، دستور bup restore آن دایرکتوری را بازیابی کرده و سپس محتویات آن را به صورت بازگشتی بازیابی می‌کند.

اگر some/where نام یک دایرکتوری باشد و به یک اسلش ختم شود (مانند path/to/dir/)، دستور bup restore فرزندان و محتویات آن دایرکتوری را مستقیماً در دایرکتوری جاری (یا در --outdir) بازیابی می‌کند. اگر some/where به اسلش ختم نشود، فرزندان آن در یک زیردایرکتوری از دایرکتوری جاری بازیابی خواهند شد.

اگر some/where نام یک دایرکتوری باشد و به `/.` ختم شود (مانند path/to/dir/.)، دستور bup restore دقیقاً همان کاری را انجام می‌دهد که برای path/to/dir انجام می‌داد، و سپس متاداده (metadata) dir را در دایرکتوری جاری (یا --outdir) بازیابی می‌کند. بخش «مثال‌ها» را ببینید.

به عنوان یک حالت خاص، اگر some/where به پیوند نمادین “latest” اشاره کند، مانند bup restore /foo/latest، در این صورت bup دقیقاً به گونه‌ای عمل می‌کند که گویی ذخیره‌ای که “latest” به آن اشاره دارد مشخص شده است، و به جای خود پیوند نمادین “latest”، آن نسخه ذخیره‌شده را بازیابی می‌کند.

هر زمان که متاداده مسیر در دسترس باشد، bup restore تلاش می‌کند آن را بازیابی کند. هنگام بازیابی مالکیت، bup رفتاری مشابه tar/rsync را پیاده‌سازی می‌کند. در صورت در دسترس بودن، معمولاً نام کاربری و گروه را به uid و gid ترجیح می‌دهد، اما تلاش برای بازیابی کاربر را فقط در صورتی انجام می‌دهد که با دسترسی ریشه (root) اجرا شده باشد، و هر زمان متاداده حاوی نام کاربر یا گروهی باشد که در سیستم فعلی وجود ندارد، به uid یا gid عددی بازمی‌گردد. استفاده از نام‌های کاربر و گروه را می‌توان از طریق گزینه --numeric-ids غیرفعال کرد (که برای نمونه هنگام بازیابی یک chroot می‌تواند مهم باشد)، و به عنوان یک حالت خاص، uid یا gid با مقدار 0 هرگز بر اساس نام بازنگاشت نخواهد شد. علاوه بر این، برخی سیستم‌ها اجازه تنظیم uid/gid که با یک کاربر/گروه شناخته‌شده مطابقت ندارد را نمی‌دهند. در این سیستم‌ها، bup برای هر مسیر مربوطه خطایی را در گزارش ثبت می‌کند. هر مسیر «ساختگی» (synthetic)، برای نمونه یک دایرکتوری ریشه که تحت تأثیر bup save --graft قرار گرفته است، مجوزهای خواندن/اجرای گروه و دیگران (world) را به گونه‌ای خواهد داشت که گویی با umask برابر با 022 ایجاد شده است. هر مسیری که متاداده آن از دست رفته باشد (شاید از طریق bup get --repair یا نسخه‌های قبلی bup؛ طبقه‌بندی در سند DESIGN را ببینید) مجوزهای محدودکننده‌ای خواهد داشت، گویی که با umask برابر با 077 ایجاد شده است.

گزینه‌های --map-user، --map-group، --map-uid و --map-gid می‌توانند برای تنظیم اطلاعات مالکیت موجود قبل از اعمال هر یک از قوانین بالا استفاده شوند، اما توجه داشته باشید که به دلیل این قوانین، --map-uid و --map-gid هرگاه یک مسیر دارای کاربر یا گروه معتبر باشد هیچ تأثیری نخواهند داشت. در این موارد، یا باید --numeric-ids مشخص شود، یا کاربر یا گروه باید توسط یک مشخصه مناسب --map-user foo= یا --map-group foo= پاک شود.

پیوندهای سخت (Hardlinks) نیز در صورت امکان بازیابی خواهند شد، اما دست‌کم در حال حاضر، هیچ پیوندی به اهداف خارج از درخت بازیابی ایجاد نخواهد شد، و اگر درخت بازیابی ساختار متفاوتی از سیستم‌های فایل را نسبت به درخت ذخیره پوشش دهد، ممکن است برخی از مجموعه‌های پیوند سخت به طور کامل بازیابی نشوند.

همچنین توجه داشته باشید که تغییر مجموعه‌های پیوند سخت روی دیسک بین نمایه‌سازی (index) و ذخیره‌سازی (save) ممکن است نتایج غیرمنتظره‌ای ایجاد کند. با پیاده‌سازی فعلی، bup تلاش خواهد کرد تا هر مجموعه پیوند سخت مشخص را همان‌گونه که در زمان نمایه‌سازی وجود داشته است بازسازی کند، حتی اگر همه فایل‌های موجود در آن مجموعه در زمان ذخیره‌سازی دیگر پیوند سخت نداشته باشند (اما از سایر جهات یکسان باشند).

توجه داشته باشید که در طول فرآیند بازیابی، دسترسی به داده‌ها در داخل درخت بازیابی ممکن است بازتر و با مجوزهای بیشتری نسبت به منبع اصلی باشد. مگر اینکه امنیت اهمیتی نداشته باشد، باید در یک زیردایرکتوری خصوصی بازیابی را انجام دهید و سپس درخت حاصل را به مکان نهایی آن منتقل کنید. برای مشاهده نمونه عملی، بخش «مثال‌ها» را ببینید.

بازیابی از مخزن دوردست مشخص‌شده، به طور پیش‌فرض از طریق SSH. برای اطلاعات بیشتر به بخش REMOTE OPTIONS در bup(1) مراجعه کنید.
ایجاد و تغییر مسیر به دایرکتوری outdir پیش از استخراج فایل‌ها.
بازیابی شناسه‌های عددی (کاربر، گروه و غیره) به جای نام‌ها.
مستثنی کردن هر مسیری که با pattern مطابقت داشته باشد، که باید یک عبارت باقاعده (Regular Expression) پایتون باشد (http://docs.python.org/library/re.html). الگو بدون مهاربندی (anchoring) با مسیر کامل که ریشه آن در بالای درخت بازیابی است مقایسه می‌شود، بنابراین “x/y” با “ox/yard” یا “box/yards” مطابقت خواهد داشت. برای مستثنی کردن محتویات /tmp، بدون مستثنی کردن خود دایرکتوری، از “^/tmp/.” استفاده کنید. (می‌تواند بیش از یک بار مشخص شود)
توجه داشته باشید که ریشه درخت بازیابی (که با `^/` مطابقت دارد) بالای درخت بایگانی در حال بازیابی است و هیچ ارتباطی با مقصد در سیستم‌فایل ندارد. با فرض “restore ... /foo/latest/etc/”، الگوی `^/passwd$` در صورتی مطابقت خواهد داشت که فایلی به نام passwd به عنوان `/foo/latest/etc/passwd` ذخیره شده باشد. مثال‌ها:
  • /foo$ - مستثنی کردن هر فایلی به نام foo
  • /foo/$ - مستثنی کردن هر دایرکتوری به نام foo
  • /foo/. - مستثنی کردن محتوای هر دایرکتوری به نام foo
  • ^/tmp/. - مستثنی کردن محتوای دایرکتوری tmp در سطح ریشه
خواندن الگوهای –exclude-rx از filename، یک الگو در هر خط (می‌تواند تکرار شود). خطوط کاملاً خالی نادیده گرفته می‌شوند.
نوشتن خروجی داده‌ها به صورت تنک (sparse) در صورت منطقی بودن. در حال حاضر، منطقی بودن صرفاً به معنای «حداقل هر زمان که ۵۱۲ صفر متوالی یا بیشتر وجود داشته باشد» است.
برای هر مسیر، نام کاربری old (ذخیره‌شده) را به عنوان new بازیابی می‌کند. مشخص کردن “” برای new کاربر را پاک می‌کند. برای نمونه “–map-user foo=” اجازه می‌دهد تا uid برای هر مسیری که در اصل کاربری به نام “foo” داشته است اعمال شود، مگر اینکه با یک مشخصه بعدی “–map-user foo=...” نقض و لغو گردد. برای اطلاعات بیشتر بخش «توضیحات» در بالا را ببینید.
برای هر مسیر، نام گروه old (ذخیره‌شده) را به عنوان new بازیابی می‌کند. مشخص کردن “” برای new گروه را پاک می‌کند. برای نمونه “–map-group foo=” اجازه می‌دهد تا gid برای هر مسیری که در اصل دارای گروه “foo” بوده است اعمال شود، مگر اینکه با یک مشخصه بعدی “–map-group foo=...” لغو گردد. برای اطلاعات بیشتر بخش «توضیحات» در بالا را ببینید.
برای هر مسیر، شناسه uid قبلی (old) را به عنوان new بازیابی می‌کند، مگر اینکه با گزینه بعدی “–map-uid old=...” نقض و لغو گردد. توجه داشته باشید که uid تنها برای مسیرهای فاقد کاربر معتبر خواهد بود. برای اطلاعات بیشتر بخش «توضیحات» در بالا را ببینید.
برای هر مسیر، شناسه gid قبلی (old) را به عنوان new بازیابی می‌کند، مگر اینکه با گزینه بعدی “–map-gid old=...” لغو گردد. توجه داشته باشید که gid تنها برای مسیرهای فاقد کاربر معتبر خواهد بود. برای اطلاعات بیشتر بخش «توضیحات» در بالا را ببینید.
افزایش خروجی وقایع و گزارش‌ها. با یک بار مشخص شدن، هر دایرکتوری را هنگام بازیابی چاپ می‌کند؛ با دو بار مشخص شدن، هر فایل و دایرکتوری را چاپ می‌کند.
سرکوب خروجی، از جمله نوار پیشرفت. به طور معمول، اگر stderr یک tty باشد، یک نشانگر پیشرفت تعداد کل فایل‌های بازیابی‌شده را نمایش می‌دهد.

ایجاد یک مجموعه پشتیبان آزمایشی ساده:

$ bup index -u /etc
$ bup save -n mybackup /etc/passwd /etc/profile

بازیابی تنها یک فایل:

$ bup restore /mybackup/latest/etc/passwd
Restoring: 1, done.
$ ls -l passwd
-rw-r--r-- 1 apenwarr apenwarr 1478 2010-09-08 03:06 passwd

بازیابی etc در پوشه test (بدون اسلش پایانی):

$ bup restore -C test /mybackup/latest/etc
Restoring: 3, done.
$ find test
test
test/etc
test/etc/passwd
test/etc/profile

بازیابی محتویات etc در پوشه test (با اسلش پایانی):

$ bup restore -C test /mybackup/latest/etc/
Restoring: 2, done.
$ find test
test
test/passwd
test/profile

بازیابی محتویات etc و متاداده etc در پوشه test (با پسوند “/.” پایانی):

$ bup restore -C test /mybackup/latest/etc/.
Restoring: 2, done.
# At this point test and etc's metadata will match.
$ find test
test
test/passwd
test/profile

بازیابی یک درخت بدون خطر دسترسی غیرمجاز:

# mkdir --mode 0700 restore-tmp
# bup restore -C restore-tmp /somebackup/latest/foo
Restoring: 42, done.
# mv restore-tmp/foo somewhere
# rmdir restore-tmp

بازیابی یک درخت، همراه با نگاشت مجدد کاربر و گروه قدیمی به کاربر و گروه جدید:

# ls -l /original/y
-rw-r----- 1 foo baz  3610 Nov  4 11:31 y
# bup restore -C dest --map-user foo=bar --map-group baz=bax /x/latest/y
Restoring: 42, done.
# ls -l dest/y
-rw-r----- 1 bar bax  3610 Nov  4 11:31 y

بازیابی یک درخت، با نگاشت مجدد یک uid قدیمی به uid جدید. توجه داشته باشید که کاربر قدیمی باید پاک شود تا bup آن را بر uid ترجیح ندهد:

# ls -l /original/y
-rw-r----- 1 foo baz  3610 Nov  4 11:31 y
# ls -ln /original/y
-rw-r----- 1 1000 1007  3610 Nov  4 11:31 y
# bup restore -C dest --map-user foo= --map-uid 1000=1042 /x/latest/y
Restoring: 97, done.
# ls -ln dest/y
-rw-r----- 1 1042 1007  3610 Nov  4 11:31 y

روشی جایگزین برای انجام همین کار با نادیده گرفتن سراسری کاربران/گروه‌ها با استفاده از --numeric-ids:

# bup restore -C dest --numeric-ids --map-uid 1000=1042 /x/latest/y
Restoring: 97, done.

bup-save(1), bup-ftp(1), bup-fuse(1), bup-web(1)

بخشی از مجموعه bup(1).

Avery Pennarun apenwarr@gmail.com.

2026-09-01 Bup 0.34+