RE:NODE

Minecraft10 წუთის საკითხავი

Minecraft სამყაროს backup და აღდგენა

Minecraft სერვერის რომელი საქაღალდეების backup გააკეთო, როგორ აიღო თანმიმდევრული ასლი save-off-ით და save-all-ით და როგორ აღადგინო სამყარო, ერთი უბანი ან ერთი მოთამაშე.

0 მკითხველი

Minecraft სერვერის backup არის სამყაროს საქაღალდეები - world, world_nether და world_the_end Paper-ზე, ან ერთი world საქაღალდე vanilla-სა და Fabric-ზე - პლუს რამდენიმე ფაილი მათ გვერდით: server.properties, op-ების, whitelist-ისა და ბანების სიები და plugins/ ან config/ საქაღალდე. ასლის თანმიმდევრულობისთვის გაუშვი save-off, მერე save-all flush, აიღე ასლი, მერე save-on. ყველაფრის აღსადგენად გააჩერე სერვერი და საქაღალდეები ადგილზე დააბრუნე. ერთი უბნის უკან დასაბრუნებლად შეცვალე მხოლოდ შესაბამისი region ფაილები; ერთი მოთამაშის უკან დასაბრუნებლად - მისი ფაილი playerdata/-ში. ეს პოსტი თითოეულ მათგანს განიხილავს, სწორი region ფაილის საპოვნელი არითმეტიკითა და შეცდომებით, რომლებიც აღდგენას მეორე კატასტროფად აქცევს.

რა არის Minecraft-ის სამყარო დისკზე#

სამყარო ერთი ფაილი არ არის. ეს ბევრი ფაილის საქაღალდეა, და იმის ცოდნა, რომელი ფაილი რას ინახავს, არის სხვაობა გაძარცვული სოფლის აღდგენასა და მთელი სერვერის გასული სამშაბათის მდგომარეობაზე დაბრუნებას შორის.

Paper და Bukkit-იდან წარმოშობილი ყველა სერვერი სამ განზომილებას სამ ზედა დონის საქაღალდედ ყოფს. Vanilla, Fabric, Forge და NeoForge ყველას ერთში ინახავს. სახელი world მოდის level-name-იდან server.properties-ში.

შიგთავსიVanilla, Fabric, NeoForgePaper
Overworld-ის რელიეფიworld/region/world/region/
Nether-ის რელიეფიworld/DIM-1/region/world_nether/DIM-1/region/
End-ის რელიეფიworld/DIM1/region/world_the_end/DIM1/region/
მოთამაშეების ინვენტარები და პოზიციებიworld/playerdata/world/playerdata/
სამყაროს პარამეტრები, seed, დროworld/level.datworld/level.dat

თითოეული განზომილების შიგნით სამი საქაღალდე chunk-ების მონაცემებს region ფაილების ერთსა და იმავე ფორმატში ინახავს:

  • `region/` - ბლოკები, block entity-ები, როგორიცაა სკივრები და ღუმელები, და ბიომები. თავად რელიეფი.
  • `entities/` - 1.17-დან mob-ები, ცხოველები, item frame-ები, armour stand-ები, ვაგონეტები და დაგდებული ნივთები აქ ცხოვრობენ, რელიეფის ფაილების ნაცვლად.
  • `poi/` - ინტერესის წერტილები: სოფლელების სამუშაო ადგილები, საწოლები, ფუტკრის ბუდეები, პორტალები. სოფლელები ამას სამუშაოსა და სახლის საპოვნელად იყენებენ.

მთავარი სამყაროს საქაღალდის თავში კი:

  • `level.dat` ინახავს seed-ს, spawn-ის წერტილს, game rule-ებს, სამყაროს საზღვარს, დროს და datapack-ების სიას. level.dat_old წინა ასლია, რომელიც ყოველ ჯერზე იწერება, როცა level.dat ინახება.
  • `playerdata/<uuid>.dat` ინახავს თითოეული მოთამაშის ინვენტარს, ender chest-ს, პოზიციას, სიცოცხლეს და გამოცდილებას. ეს საქაღალდე მხოლოდ მთავარ სამყაროს აქვს, Paper-ზეც კი.
  • `advancements/` და `stats/` თითოეული მოთამაშის JSON-ს ინახავს.
  • `data/` ინახავს რუკებს (map_*.dat), რეიდებს, scoreboard-ს და ბრძანებების საცავს.
  • `datapacks/` სამყაროს datapack-ებს ინახავს.

სამყარო, რომელზეც ერთი წელი თამაშობდნენ, ზომით ძირითადად region/-ია. დანარჩენი ყველაფერი პატარაა და, playerdata/-ის გარდა, თავისთავად იშვიათად არის საინტერესო.

ყველაფერი დანარჩენი, რაც backup-ს ეკუთვნის#

აღდგენილი სამყარო ახალი სერვერის საქაღალდის გვერდით მომუშავე სერვერი არ არის. სერვერის ძირის დანარჩენი ნაწილიც მნიშვნელოვანია:

ფაილი ან საქაღალდერატომ არის მნიშვნელოვანი
server.propertiesseed, თამაშის რეჟიმი, view distance, ყველა პარამეტრი
ops.json, whitelist.jsonვისაც ძალაუფლება აქვს, ვისაც შემოსვლა შეუძლია
banned-players.json, banned-ips.jsonვისაც არ შეუძლია
plugins/ (Paper)plugin-ების config-ები და მათი მონაცემები - claim-ები, ნებართვები, ეკონომიკა, log-ები
config/, bukkit.yml, spigot.ymlPaper-ისა და Spigot-ის პარამეტრები
mods/, config/, defaultconfigs/ (mod-იანი)mod-ების ზუსტი ნაკრები, რომლითაც სამყარო შეინახა

plugin-ების მონაცემები ცალკე წინადადებას იმსახურებს. claim-ის plugin-ები, ნებართვები და ეკონომიკები თავიანთ მდგომარეობას ხშირად plugins/-ის შიგნით ლოკალური მონაცემთა ბაზის ფაილში ინახავენ - LuckPerms-იც და CoreProtect-იც ნაგულისხმევად ასე აკეთებენ. შესაბამისი plugin-ის მონაცემების გარეშე აღდგენილი სამყარო მოთამაშეებს ნაგებობებს უბრუნებს მათი claim-ების გარეშე, ან claim-ებს ნაგებობების გარეშე. backup ერთად გააკეთე და ერთად აღადგინე.

რისი გამოტოვებაც შეგიძლია: logs/ (სასარგებლოა, მაგრამ მდგომარეობის ნაწილი არ არის), cache/, libraries/, versions/ და სერვერის jar-ი, რომელთა ხელახლა ჩამოტვირთვაც შეიძლება. მათი გამოტოვება backup-ებს უფრო პატარას და სწრაფს ხდის.

თანმიმდევრული ასლის აღება#

სერვერი სამყაროს უწყვეტად არ წერს. chunk-ები მეხსიერებაში ცხოვრობენ და თავიანთ region ფაილებში autosave-ების დროს და მათი გადმოტვირთვისას იწერება. თუ საქაღალდეს ამ დროს აკოპირებ, შეიძლება region ფაილი ჩაწერის შუაში დაიჭირო, ან level.dat ერთი მომენტიდან და region ფაილები მეორედან.

გამოსავალი კონსოლის სამი ბრძანებაა:

code
save-offsave-all flush... take the copy ...save-on

save-off ავტომატურ შენახვას აჩერებს. save-all flush მეხსიერებაში არსებულ ყველაფერს დისკზე წერს და არ ბრუნდება, სანამ ჩაწერა არ დასრულდება. ამის შემდეგ აღებული ასლი თანმიმდევრული snapshot-ია. save-on ჩვეულებრივ შენახვას აგრძელებს; თუ დაგავიწყდა, სერვერი ისე მუშაობს, რომ დისკზე არაფერი იწერება შემდეგ გადატვირთვამდე, ამიტომ თუ ამას სკრიპტით აკეთებ, დარწმუნდი, რომ save-on მაშინაც სრულდება, როცა კოპირება ჩავარდება.

საკუთარ მანქანაზე backup შეიძლება ამდენად მარტივი იყოს:

bash
$ tar -czf backups/world-$(date +%F-%H%M).tar.gz \    world world_nether world_the_end plugins server.properties \    ops.json whitelist.json banned-players.json banned-ips.json

გაუშვი ის save-all flush-სა და save-on-ს შორის და არქივი სადმე ისეთ ადგილას დააკოპირე, რომელიც იგივე დისკი არ არის - backup იმავე დისკზე, რომელსაც იცავს, დაზიანებულ chunk-ს ფარავს და მეტს არაფერს. Backup-ები, რომლებიც ნამდვილად აღდგება განიხილავს, სად უნდა ინახებოდეს ასლები და რამდენი შეინახო.

პანელზე იგივე თანმიმდევრობა განრიგად იქცევა. RE:NODE-ზე Schedules ჩანართი დალაგებულ დავალებებს cron გამოსახულებით უშვებს, ასე რომ, ერთ განრიგს შეუძლია გაგზავნოს save-off, მერე save-all flush, დაელოდოს, აიღოს backup და გაგზავნოს save-on. backup-ის სლოტები ყველა Minecraft-ის გეგმაშია, ინახება იმ მანქანის გარეთ, რომელსაც იცავს, და ჩამოტვირთვადია, და შეგიძლია ერთი დაბლოკო, რომ როტაციამ არ წაშალოს. დაგეგმილი დავალებები, რომლებიც ღირს ამის დროის სრულ ცხრილს შეიცავს.

მთელი სამყაროს აღდგენა#

ყველაფრის აღდგენა ყველაზე მარტივი აღდგენაა და ის, რომელსაც ხალხი ზეწოლის ქვეშ ყველაზე ხშირად აფუჭებს.

  1. გააჩერე სერვერი და დაელოდე, სანამ გათიშვას დაასრულებს.
  2. შეინარჩუნე მიმდინარე მდგომარეობა. გადაარქვი world world-broken-ად (და Nether-ისა და End-ის საქაღალდეებიც) ან მისი ახალი backup გააკეთე. მიმდინარე სამყარო შეიძლება საათობით კანონიერ პროგრესს შეიცავდეს, რომლის გადარჩენაც მოგინდება, და ის მტკიცებულებაა, თუ griefer-თან გაქვს საქმე.
  3. ჩადე backup-ის საქაღალდეები ადგილზე, ზუსტად იგივე სახელებით. Paper-ზე ეს სამი საქაღალდეა; vanilla-ზე - ერთი.
  4. აღადგინე შესაბამისი plugin-ების მონაცემები იმავე backup-იდან, თუ claim-ები, ნებართვები ან ეკონომიკა მას შემდეგ შეიცვალა.
  5. გაუშვი სერვერი და წაიკითხე log-ი. Preparing level "world" და დაკარგულ chunk-ებზე გაფრთხილებების არარსებობა ნიშნავს, რომ ჩაიტვირთა.
  6. შედი და შეამოწმე სამივე განზომილება. ახალი, ცარიელი Nether ნიშნავს, რომ Nether-ის საქაღალდე არასწორ ადგილასაა ან არასწორი სახელი აქვს - შენი მონაცემები ისევ იქაა, სხვა სახელით.

RE:NODE-ზე backup-ის აღდგენა პანელში ერთი ღილაკია. იგივე დისციპლინა მოქმედებს: თუ მიმდინარე მდგომარეობის შენახვა შეიძლება ღირდეს, ჯერ მისი backup გააკეთე. სერვერის წაშლა მის backup-ებსაც შლის, დაბლოკილების ჩათვლით, ამიტომ გაუქმებამდე ან ხელახლა დაყენებამდე ყველაფრის ჩამოტვირთული ასლი შეინახე, რისი დაკარგვაც არ შეგიძლია.

ერთი უბნის უკან დაბრუნება#

მთელი სამყაროს აღდგენა ერთი გაძარცვული ბაზის გამოსასწორებლად ყველა დანარჩენის პროგრესს ყრის. region ფაილები მხოლოდ დაზიანებული უბნის აღდგენის საშუალებას გაძლევს.

ყოველი region ფაილი 32-ზე 32 chunk-ს ფარავს, ანუ 512-ზე 512 ბლოკს, და თავისი region კოორდინატების მიხედვით ჰქვია: r.<x>.<z>.mca. იმის გასარკვევად, რომელი ფაილი ინახავს ბლოკის პოზიციას, გაყავი 512-ზე და დაამრგვალე ქვემოთ:

code
region x = floor(block x / 512)region z = floor(block z / 512)Block (1200, -300)  ->  r.2.-1.mcaBlock (-40, 700)    ->  r.-1.1.mcaBlock (511, 512)    ->  r.0.1.mca

ქვემოთ დამრგვალება უარყოფითი რიცხვებისთვის მნიშვნელოვანია: ბლოკი -40 region -1-შია და არა region 0-ში. region-ის საზღვართან ახლოს მდებარე ბაზა ორ ან ოთხ ფაილს მოიცავს.

პროცედურა:

  1. ჩაიწერე დაზიანებული უბნის კოორდინატები F3-იდან და გამოთვალე ყველა region ფაილი, რომელსაც ის ეხება.
  2. გააჩერე სერვერი.
  3. backup-იდან დააკოპირე ეს ფაილები region/-იდან, და იგივე სახელის ფაილები entities/-იდან და poi/-იდან, ცოცხალების თავზე სწორი განზომილების საქაღალდეში.
  4. გაუშვი სერვერი და შეამოწმე უბანი.

მხოლოდ region/-ის კოპირება კლასიკური შეცდომაა. 1.17-ზე და შემდეგ რელიეფი ბრუნდება, მაგრამ entity-ები არ ემთხვევა: item frame-ები და armour stand-ები ქრება ან ორმაგდება, ცხოველები აკლია, სოფლელები სამუშაო ადგილებს კარგავენ, რადგან poi/ ჯერ კიდევ გაძარცვულ მდგომარეობას აღწერს.

region ფაილები უხეშია - 512 ბლოკი სხვა ადამიანების ბევრი ნაგებობაა. უფრო პატარა რამისთვის MCA Selector სტანდარტული ინსტრუმენტია. ის სამყაროს შენს კომპიუტერზე ხსნის, რუკას აჩვენებს და ცალკეული chunk-ების მონიშვნის საშუალებას გაძლევს წასაშლელად ან სამყაროს სხვა ასლიდან იმპორტისთვის. სამუშაო პროცესი ასეთია: ჩამოტვირთე backup და მიმდინარე სამყარო, MCA Selector-ით გადაიტანე დაზიანებული chunk-ები backup-იდან მიმდინარე სამყაროს ასლში, მერე კი შედეგი ატვირთე სერვერის გაჩერებით.

თუ ზიანი grief-ია და არა დაზიანება, ბლოკების ლოგირების plugin-ი, როგორც წესი, ნებისმიერ backup-ზე უკეთესი ინსტრუმენტია, რადგან ის ერთი ადამიანის მოქმედებებს აუქმებს და ყველა დანარჩენისას ინარჩუნებს. CoreProtect-ის rollback მომხმარებლით, რადიუსით და დროით grief-ისგან დაცვასა და anti-cheat-შია განხილული. backup-ები იმისთვისაა, რასაც ლოგირების plugin-ი ვერ ხედავს: დაზიანება, ცუდი plugin-ი, შეცდომით გაშვებული ბრძანება ან mod-ი, რომელმაც chunk შეჭამა.

ერთი მოთამაშის აღდგენა#

დაკარგული ინვენტარები აღდგენის ყველაზე გავრცელებული მოთხოვნაა, და მათ სამყაროს rollback არასოდეს სჭირდება.

  1. იპოვე მოთამაშის UUID. usercache.json სერვერის ძირში ბოლოდროინდელ სახელებს UUID-ებთან აკავშირებს, online-mode სერვერზე კი UUID იგივეა, რასაც Minecraft-ის პროფილის ნებისმიერი ძებნა აჩვენებს.
  2. დარწმუნდი, რომ მოთამაშე ოფლაინშია. სერვერი მის ფაილს გასვლისას წერს და შენსას გადააწერს, თუ ის ონლაინშია.
  3. დააკოპირე world/playerdata/<uuid>.dat backup-იდან ცოცხალი ფაილის თავზე. დააკოპირე advancements/<uuid>.json და stats/<uuid>.json-იც, თუ ისინი მნიშვნელოვანია.
  4. სთხოვე მოთამაშეს შემოსვლა.

მოთამაშის ფაილი ინვენტართან ერთად პოზიციასაც ინახავს, ასე რომ, აღდგენილი მოთამაშე იქ ჩნდება, სადაც იყო backup-ის აღებისას. უთხარი მას, თორემ teleport-ის ბაგს შეგატყობინებს. ender chest-ის შიგთავსი იმავე ფაილშია და მასთან ერთად ბრუნდება.

როცა level.dat დაზიანებულია#

თუ სერვერი უარს ამბობს სამყაროს ჩატვირთვაზე level.dat-ის შესახებ შეცდომით, ან ტვირთავს არასწორი seed-ით, spawn-ით ან game rule-ებით, ფაილი, სავარაუდოდ, დაზიანებულია - როგორც წესი, შენახვისას პროცესის მოკვლით. რადგან level.dat_old წინა ასლია:

  1. გააჩერე სერვერი.
  2. გადაარქვი level.dat level.dat_broken-ად.
  3. დააკოპირე level.dat_old level.dat-ად.
  4. გაუშვი სერვერი.

თუ ორივე დაზიანებულია, backup-იდან მხოლოდ level.dat აღადგინე. ის სამყაროს მასშტაბის მდგომარეობას ინახავს და არა რელიეფს, ასე რომ, ძველი ასლი ძალიან ცოტა ჯდება: დღის დრო, სამყაროს საზღვარი და game rule-ების ბოლოდროინდელი ცვლილებები შეიძლება უკან დაბრუნდეს.

ესეც მიზეზია, რის გამოც სუფთა გაჩერება მნიშვნელოვანია. RE:NODE-ზე Stop და Restart ღილაკები სუფთა გაჩერებას აგზავნიან, რომელიც ჯერ ინახავს. კონტეინერი, რომელიც მეხსიერების ლიმიტს აღწევს, ჩერდება და სუფთად გადაიტვირთება, swap-ზე დატოვების ნაცვლად, რაც მანქანას იცავს, მაგრამ შენახვა არ არის - ყველაფერი ბოლო autosave-ის შემდეგ იკარგება. მეხსიერების მარაგის შენარჩუნება სამყაროს უსაფრთხოების ნაწილია.

backup-ის გატესტვა, სანამ დაგჭირდება#

backup, რომელიც არასოდეს აღგიდგენია, ვარაუდია. ყველაზე იაფ ტესტს ათი წუთი სჭირდება:

  1. ჩამოტვირთე ბოლოდროინდელი backup.
  2. გახსენი ის საკუთარ კომპიუტერზე, იგივე სერვერის jar-ისა და Java-ს ვერსიის გვერდით.
  3. გაუშვი ლოკალურად და დაუკავშირდი localhost-ს.
  4. მიდი ბოლოდროინდელ ნაგებობასთან, გახსენი სკივრი, შეამოწმე Nether.

თუ ეს მუშაობს, backup მუშაობს. თუ არა, ეს წყნარ დღეს გაიგე და არა გათიშვის დროს. აღდგენის გატესტვა, სანამ დაგჭირდება ამას რუტინად აქცევს.

გონივრული განრიგი აქტიური სერვერისთვის:

backupროდისშეინახე
ავტომატურიყოველდღე, ყველაზე წყნარ საათზებოლო რამდენიმე
ხელით, დაბლოკილიყოველი განახლების, plugin-ის დაყენების ან დიდი ღონისძიების წინსანამ ცვლილება თავს არ გაამართლებს
ჩამოტვირთულიყოველკვირეულად ან ყოველთვიურადჰოსტის გარეთ, განუსაზღვრელი ვადით

FAQ#

შემიძლია Minecraft-ის სამყაროს backup გავაკეთო, სანამ სერვერი მუშაობს?

კი, თუ ჯერ save-off-ს და save-all flush-ს გაუშვებ, მერე კი save-on-ს. flush ყველაფერს დისკზე წერს და შემდგომ ჩაწერებს აჩერებს, სანამ აკოპირებ. ამის გარეშე კოპირებამ შეიძლება region ფაილები ჩაწერის შუაში დაიჭიროს.

როგორ დავაბრუნო სამყაროს მხოლოდ ერთი უბანი?

გამოთვალე, რომელი region ფაილები ფარავს მას - გაყავი ბლოკის კოორდინატები 512-ზე და დაამრგვალე ქვემოთ - მერე, სერვერის გაჩერებით, დააკოპირე ეს ფაილები backup-ის region/, entities/ და poi/ საქაღალდეებიდან ცოცხალების თავზე. region-ზე პატარა უბნებისთვის გამოიყენე MCA Selector ცალკეული chunk-ების იმპორტისთვის.

როგორ აღვადგინო ერთი მოთამაშის ინვენტარი?

როცა მოთამაშე ოფლაინშია, სერვერი კი მუშაობს ან გაჩერებულია, შეცვალე world/playerdata/<uuid>.dat backup-იდან აღებული ასლით. UUID usercache.json-შია. მოთამაშე ასევე იქ გადავა, სადაც იდგა backup-ის აღებისას.

რატომ არის Nether ცარიელი აღდგენის შემდეგ?

Nether-ის საქაღალდე შენი სერვერული პროგრამისთვის არასწორ ადგილასაა. Paper იყენებს world_nether/DIM-1/region-ს, vanilla და Fabric - world/DIM-1/region-ს. სერვერმა ახალი Nether დააგენერირა, რადგან იქ, სადაც ეძებდა, ვერაფერი იპოვა.

კარგი იდეაა backup-ის plugin-ები?

თავისთავად, როგორც წესი, არა. plugin-ი თავის არქივებს სამყაროს იმავე დისკზე წერს, რაც დაზიანებული chunk-ისგან იცავს და მეტს არაფრისგან. გამოიყენე მანქანის გარეთ შენახული backup-ები, და თუ plugin-ი საერთოდ გინდა, გამოიყენე ის save-all flush-ის ირგვლივ დაგეგმვისთვის და არა ერთადერთ ასლად.


კომენტარები

სრულიად ანონიმურად: ანგარიშის, ელფოსტის და cookie-ის გარეშე. ინახება მხოლოდ სახელი, ტექსტი და დრო - სხვა არაფერი. ბმულების რაოდენობა ლიმიტირებულია.

0/2000