RE:NODE

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

დაზიანებული chunk-ები Minecraft-ში და აღდგენა

როგორ გავასწოროთ დაზიანებული Minecraft chunk-ები და region ფაილები: ლოგის შეცდომები, ცუდი region-ის პოვნა, MCA Selector, ერთი region-ის აღდგენა backup-იდან და პრევენცია.

0 მკითხველი

დაზიანებული chunk თითქმის ყოველთვის ერთ region ფაილშია ჩაკეტილი, და გამოსავალი თითქმის ყოველთვის ამ ერთი ფაილის - ან მის შიგნით დაზიანებული chunk-ების - შეცვლაა და არა მთელი სამყაროსი. იპოვე კოორდინატები სერვერის ლოგში, გაარკვიე, რომელი r.X.Z.mca ფაილი შეიცავს მათ, გააჩერე სერვერი და ან ეს ფაილი backup-იდან აღადგინე, ან ცუდი chunk-ები წაშალე, რომ ხელახლა დაგენერირდნენ. მეორე ვარიანტისთვის ინსტრუმენტი MCA Selector-ია. ამ პოსტში დანარჩენი ყველაფერი ეხება იმას, როგორ გააკეთო ეს ზუსტად, როგორ ამოიცნო შეცდომები, რომლებიც დაზიანებას ჰგავს, მაგრამ არ არის, და როგორ გახადო განმეორება ნაკლებად სავარაუდო.

როგორ ინახება Minecraft-ის სამყარო#

Java Edition-ის სამყარო პატარა ფაილების საქაღალდეა და არა ერთი დიდი ფაილი. სწორედ ამიტომ არის დაზიანება ჩვეულებრივ ლოკალური.

გზარას შეიცავს
level.datსამყაროს პარამეტრები, seed, დრო, თამაშის წესები, მონაცემების ვერსია
level.dat_oldlevel.dat-ის წინა ასლი
region/r.X.Z.mcaბლოკები და block entity-ები 32 x 32 chunk-ისთვის
entities/r.X.Z.mcaმობები, ნივთები, armour stand-ები (1.17 და შემდეგ)
poi/r.X.Z.mcaინტერესის წერტილები: საწოლები, სამუშაო ბლოკები, პორტალები
playerdata/<uuid>.datთითოეული მოთამაშის ინვენტარი, პოზიცია და სტატისტიკა
data/რუკები, raid-ები, scoreboard-ები, სტრუქტურების მონაცემები

ყოველი region ფაილი 32-ზე 32 chunk-ს ფარავს, ანუ 512-ზე 512 ბლოკს. შიგნით ფაილი 8 KiB-იანი header-ით იწყება - ცხრილი, რომელიც ამბობს, სად ინახება თითოეული 1,024 chunk-იდან, და დროის ნიშნულების ცხრილი - რასაც თავად chunk-ები მოსდევს, თითოეული შეკუმშული და 4 KiB-იან სექტორებში შენახული.

Paper-სა და Spigot-ზე nether და end ცალკე სამყაროს საქაღალდეებია: world_nether/DIM-1/region/ და world_the_end/DIM1/region/. Vanilla-ზე ისინი მთავარი სამყაროს საქაღალდის შიგნითაა, world/DIM-1/-სა და world/DIM1/-ში. ფაილის ძებნამდე შეამოწმე, რომელი განლაგება გაქვს.

ბლოკის კოორდინატებიდან region ფაილამდე

არითმეტიკა მოკლეა:

code
chunk X  = floor(block X / 16)chunk Z  = floor(block Z / 16)region X = floor(chunk X / 32)region Z = floor(chunk Z / 32)

ასე რომ, ბლოკი X -1200, Z 3400 არის chunk -75, 212-ში, რომელიც region -3, 6-შია: ფაილი r.-3.6.mca. ყურადღება მიაქციე floor-ს: უარყოფითი კოორდინატები ქვემოთ მრგვალდება, ამიტომ ბლოკი -1 არის chunk -1-სა და region -1-ში და არა 0-ში. თამაშში F3 ეკრანი პირდაპირ აჩვენებს chunk-სა და region ფაილის სახელს იქ, სადაც დგახარ, რაც გამოთვლების შემოწმების ყველაზე სწრაფი გზაა.

რას ნიშნავს ლოგის შეცდომები სინამდვილეში#

დაზიანება სერვერის ლოგში ჩანს, ხშირად stack trace-ის სახით, რომელიც იმდენად გრძელია, რომ სასარგებლო ხაზს მალავს. ეს გავრცელებული შეტყობინებებია და რაზე მიუთითებენ.

`Chunk file at [x, z] is in the wrong location; relocating. (Expected [a, b], got [c, d])` - chunk-ის შენახული კოორდინატები region ფაილში მის პოზიციას არ ემთხვევა. ჩვეულებრივ შედეგია იმისა, რომ ვინმემ region ფაილები დააკოპირა ან გადაარქვა სახელი, ან ძველი გარე ინსტრუმენტისა. სერვერი chunk-ს გადაიტანს და აგრძელებს. სასწრაფო არ არის, მაგრამ გაარკვიე, ვინ გადაიტანა ფაილები.

`Couldn't load chunk [x, z]` და მის შემდეგ გამონაკლისი - chunk-ის მონაცემები ვერ წაიკითხა. ქვემოთ მოცემული გამონაკლისი ამბობს, რატომ: გაშლის შეცდომა (ZipException, "incorrect header check", "unexpected end of ZLIB input stream") ნიშნავს, რომ შენახული ბაიტები დაზიანებულია; NBT-ის წაკითხვის შეცდომა ნიშნავს, რომ მონაცემები გაიშალა, მაგრამ ვალიდური არ არის. სერვერი ჩვეულებრივ chunk-ს ხელახლა დააგენერირებს, რაც ნიშნავს, რომ იქ არსებული რელიეფი ან ნაგებობები ახალი გენერაციით ჩანაცვლდება - შეამოწმე ადგილი თამაშში.

Region ფაილის შეცდომები, რომლებიც შეკვეცილ ფაილს ან არავალიდურ სექტორს ახსენებს - region ფაილის header ფაილის ბოლოს მიღმა მიუთითებს, ჩვეულებრივ იმიტომ, რომ პროცესი ჩაწერის დროს გაჩერდა. Paper დაზიანებული header-ის აღდგენას ფაილის სკანირებით ცდილობს და ლოგში წერს, რომ ამას აკეთებს; გადარჩება თუ არა chunk-ები, დამოკიდებულია იმაზე, რამდენი ჩაიწერა.

შეცდომები, რომლებიც entity-ს ან block entity-ს ასახელებს - ერთი ცუდი მობი, item frame, სკივრი ან ნიშანი სხვაგვარად ნორმალურ chunk-ში. ხშირად plugin-მა ან mod-მა ჩაწერა მონაცემები, რომლებსაც სერვერი ვერ კითხულობს. Crash report-ის "Entity being ticked" ან "Block entity being ticked" სექცია კოორდინატებს გაძლევს. Crash report-ების ახსნა აჩვენებს, როგორ წაიკითხო ეს სექცია.

სამყარო სრულიად ახალია ან გაშვებისას `level.dat`-ის შეცდომებია - level.dat აკლია ან ვერ იკითხება. ეს ერთადერთი ფაილია, რომლის დაკარგვაც მთელ სამყაროზე მოქმედებს; ქვემოთ განიხილება.

რა იწვევს დაზიანებას#

Region ფაილები მუდმივად გადაიწერება, რაც ჩაწერის მომენტს საშიშს ხდის. თითქმის ყველა შემთხვევა ერთ-ერთზე დადის:

  1. პროცესი ჩაწერის შუაში გაჩერდა. Kill სუფთა გაჩერების ნაცვლად, მეხსიერების ამოწურვით შეწყვეტა, ჰოსტის კრაში. რაც იმ წამს იწერებოდა, შეიძლება ნახევრად იყოს.
  2. დისკი გაივსო. ჩაწერა, რომელიც ვერ სრულდება, შეკვეცილ ფაილს ტოვებს. ჩვეულებრივი დამნაშავეები დისკის შემვსები backup-ები და ლოგებია; დისკის ადგილი განიხილავს, რა ჭამს მას.
  3. ფაილები სერვერის მუშაობისას დარედაქტირდა. Region ფაილის ატვირთვა, MCA Selector-ის ან რედაქტორის გაშვება ცოცხალ სამყაროზე, ან backup-ის აღდგენა გაშვებულ სერვერში. სერვერის შემდეგი შენახვა შენს ცვლილებას გადააწერს ან მასთან აირევა.
  4. ვერსიების შეუსაბამობა. სამყაროს გახსნა Minecraft-ის უფრო ძველ ვერსიაში, ვიდრე რომელშიც შეინახა, ან გარე ინსტრუმენტის გამოყენება, რომელსაც ამჟამინდელი ფორმატი არ ესმის. მონაცემები შეიძლება დაიკარგოს ან არასწორად წაიკითხოს.
  5. Plugin-ები და mod-ები ცუდ მონაცემებს წერენ. Plugin, რომელიც block entity-ში ან entity-ში არასწორ მონაცემებს ინახავს, რომელთა ჩატვირთვაც შემდეგ სერვერს არ შეუძლია.
  6. ნამდვილი შენახვის გაუმართაობა. იშვიათია თანამედროვე აპარატურაზე checksum-ის მქონე ფაილური სისტემებით, მაგრამ იაფ მანქანებზე შეუძლებელი არ არის.

მათი უმეტესობის თავიდან აცილება შეიძლება, რასაც ეს პოსტის ბოლო სექცია ეძღვნება.

დაზიანების პოვნა#

დაიწყე ლოგიდან. მოძებნე მასში შეცდომის კოორდინატები და ზემოთ აღწერილი წესით region ფაილად გადაიყვანე. თუ შეცდომა chunk-ის კოორდინატებს იძლევა (უმეტესობა იძლევა), მხოლოდ მეორე ნაბიჯი გჭირდება.

bash
$ grep -n "Couldn't load chunk\|wrong location\|region" logs/latest.log | tail -20

პანელზე იგივე საქმეს აკეთებს კონსოლის ძებნა ან ჩამოტვირთული logs/latest.log; ძველი ლოგები იმავე საქაღალდეში gzip-ით შეკუმშულია, როგორც YYYY-MM-DD-N.log.gz.

შემდეგ წადი და ფრთხილად შეხედე. Spectator რეჟიმში კოორდინატებთან ახლოს გადადი - არა მათში - და ნახე, როგორ გამოიყურება chunk: გამქრალი ნაგებობები, ახლად გენერირებული რელიეფი, რომელიც ბაზას კვეთს, სწორკიდიანი ხვრელი void-ში. ნაგებობის შუაში ხელახლა დაგენერირებულ chunk-ს მკვეთრი 16-ბლოკიანი საზღვარი აქვს, რომლის აღრევაც ძნელია.

თუ სხვადასხვა region-ში რამდენიმე chunk არის დაზიანებული, რემონტამდე საერთო მიზეზი მოძებნე. ერთდროული დაზიანება ბევრ region-ში დისკის გავსებაზე ან კრაშზე მიუთითებს, და შეიძლება იმაზე მეტი იყოს, ვიდრე იპოვე.

რემონტი MCA Selector-ით#

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

იმუშავე ასლზე, არასოდეს ცოცხალ სერვერზე:

  1. გააჩერე სერვერი და SFTP-ით ჩამოტვირთე სამყაროს საქაღალდე, ან მინიმუმ დაზიანებული განზომილების region, entities და poi საქაღალდეები. კავშირის დეტალები მოცემულია სტატიაში SFTP და ფაილების მენეჯერი.
  2. გახსენი სამყაროს საქაღალდე MCA Selector-ში. დაზიანებული chunk-ები ხშირად ცარიელად ჩანს ან ინსტრუმენტი მათზე წაკითხვის მცდელობისას გატყობინებს.
  3. მონიშნე დაზიანებული chunk-ები.
  4. წაშალე ისინი, ან backup-იდან შემცვლელები შემოიტანე (ორივე ვარიანტი ქვემოთაა ახსნილი).
  5. შეინახე, შეცვლილი ფაილები გაჩერებულ სერვერზე ატვირთე, გაუშვი და ადგილი თამაშში შეამოწმე.

მე-4 ნაბიჯის არჩევანი წყვეტს, როგორ გამოიყურება ადგილი შემდეგ:

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

MCA Selector-ის მოთხოვნის ფილტრი ასევე სწორი ინსტრუმენტია სხვა, მსგავსი ამოცანისთვის: სამყაროს შეკვეცისთვის. Chunk-ების InhabitedTime-ით მონიშვნა (რამდენი დრო გაატარეს მათში მოთამაშეებმა) პოულობს chunk-ებს, რომლებიც დაგენერირდა, მაგრამ რეალურად არასოდეს მოინახულეს, და მათი წაშლა გაბერილ სამყაროს ამცირებს ბაზებთან შეხების გარეშე. World border და წინასწარი გენერაცია ხსნის, რატომ იბერება სამყაროები საერთოდ.

MCA Selector განახლებული შეინახე. Region-ის ფორმატი Minecraft-ის ვერსიებს შორის იცვლება, და ნებისმიერი გარე ინსტრუმენტის ძველი ასლი დაზიანების მიზეზია და არა მისი გამოსავალი.

ერთი region ფაილის აღდგენა backup-იდან#

როცა დაზიანებული ადგილი ნაგებობაა და backup გაქვს, region ფაილის აღდგენა chunk-ის ქირურგიაზე სწრაფია და კარგავს მხოლოდ იმას, რაც ამ 512-ზე-512 კვადრატში backup-ის შემდეგ შეიცვალა.

  1. გააჩერე სერვერი.
  2. Backup-იდან აიღე დაზიანებული region-ის region/r.X.Z.mca. ასევე აიღე იმავე სახელის entities/r.X.Z.mca და poi/r.X.Z.mca, რომ მობები, item frame-ები, villager-ების სამუშაო ბლოკები და საწოლები ბლოკებს შეესაბამებოდეს.
  3. დააკოპირე ისინი სერვერზე ამჟამინდელი ფაილების თავზე.
  4. გაუშვი სერვერი და ადგილი შეამოწმე.

რას კარგავ: ამ კვადრატში backup-ის შემდეგ გაკეთებულ ნებისმიერ მშენებლობას. რას ინარჩუნებ: სამყაროში დანარჩენ ყველაფერს და ყველა მოთამაშის ინვენტარს, რადგან ინვენტარები playerdata-შია და არა region-ში. თუ მოთამაშემ backup-ის აღების შემდეგ აღდგენილი region-ის შიგნით სკივრებში ნივთები შეინახა, ისინი გაქრა; გააფრთხილე.

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

level.dat-ისა და playerdata-ს დაზიანება#

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

მოთამაშის ფაილები ინახება playerdata/<uuid>.dat-ში, თითოეულის გვერდით .dat_old ასლით. მოთამაშეს, რომლის ინვენტარიც გაქრა ან რომელიც კრაშის შემდეგ სამყაროს spawn-ზე ცარიელი ჩნდება, შეიძლება დაზიანებული ფაილი ჰქონდეს; _old ასლი ჩვეულებრივ ერთი შენახვით უკანაა. აღადგინე გაჩერებული სერვერით, ან მინიმუმ offline მოთამაშით, რადგან სერვერი ფაილს გასვლისას წერს.

code
playerdata/  4c2a9b1e-....dat  4c2a9b1e-....dat_old

დაზიანების თავიდან აცილება#

აქ არაფერია რთული, და სერვერების უმეტესობამ, რომელმაც chunk-ები დაკარგა, ერთ-ერთი ეს გამოტოვა:

  • გააჩერე სუფთად. stop კონსოლში ყველა სამყაროს ინახავს და გადის. პროცესის მოკვლა - არა. RE:NODE-ზე Stop და Restart ღილაკები სუფთა გაჩერებას აგზავნიან; Kill - არა, და ის სერვერისთვისაა, რომელიც აღარ პასუხობს.
  • დარჩი მეხსიერების ლიმიტში. სერვერი, რომელიც მეხსიერების ამოწურვის გამო მოკლეს, სუფთად არ გაჩერებულა. თუ შენი სერვერი განმეორებით აღწევს ლიმიტს, ეს დაზიანების რისკიცაა და სტაბილურობის პრობლემაც - რამდენი RAM სჭირდება Minecraft სერვერს და რატომ გადაიტვირთება შენი თამაშის სერვერი ნიშნებს ხსნიან.
  • შეინარჩუნე თავისუფალი ადგილი დისკზე. სერვერის დისკს არასოდეს მისცე გავსების საშუალება. ძველი ლოგები, სერვერის საქაღალდეში შენახული ძველი backup-ები და მიტოვებული სამყაროები ადგილის ჩვეულებრივი მჭამელებია.
  • ცოცხალ სამყაროს არასოდეს დაარედაქტირო. სამყაროს საქაღალდეებში რამის ატვირთვამდე, აღდგენამდე ან რედაქტირებამდე სერვერი გააჩერე.
  • გააკეთე თანმიმდევრული backup-ები. Backup-მა, რომელიც chunk-ების ჩაწერისას აიღეს, შეიძლება ნახევრად ჩაწერილი ფაილი დაიჭიროს. გამოიყენე save-off, save-all flush, გააკეთე backup, შემდეგ save-on - ან backup-ისთვის სერვერი გააჩერე - რომ ასლი თანმიმდევრული იყოს. სამყაროს backup-ის გზამკვლევი ამას დეტალურად გადის.
  • განაახლე ერთი მიმართულებით. სამყარო არასოდეს გახსნა იმაზე ძველ ვერსიაში, რომელშიც ბოლოს შეინახა. განახლებამდე გააკეთე backup; განახლების შემდეგ ამ backup-ის გარეშე უკან გზა აღარ არის. Minecraft-ის ვერსიების განახლებები უსაფრთხო თანმიმდევრობას განიხილავს.
code
save-offsave-all flush# take the backup heresave-on

FAQ#

შეიძლება დაზიანებული chunk სამყაროს დანარჩენ ნაწილზე გავრცელდეს?

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

დაზიანებული chunk-ის წაშლა ჩემს ნაგებობას წაშლის?

დიახ, თუ ნაგებობა მასში იყო. წაშლილი chunk seed-იდან ახალ რელიეფად დაგენერირდება. წაშლა ველური ბუნებისთვის გამოიყენე, ხოლო ყველაფრისთვის, რაც მოთამაშეებმა ააშენეს, backup-იდან აღდგენა.

აქვს Minecraft-ს ჩაშენებული სარემონტო ბრძანება?

დაზიანებული მონაცემებისთვის არა. სერვერის --forceUpgrade ოფცია ყოველ chunk-ს ამჟამინდელ ფორმატში გადაწერს, რაც შეიძლება დაეხმაროს ძველი ფორმატის chunk-ებს განახლების შემდეგ, მაგრამ დაზიანებულ ბაიტებს არ ასწორებს. Region-ის რემონტი გარე ინსტრუმენტებით ან backup-ებით კეთდება.

კრაშის შემდეგ ჩემი სამყარო ახალ რუკად გადაიქცა. ყველაფერი გაქრა?

სავარაუდოდ არა. შეამოწმე, ისევ ემთხვევა თუ არა server.properties-ში level-name სამყაროს საქაღალდეს და არსებობს თუ არა level.dat. თუ level.dat დაზიანებულია, აღადგინე level.dat_old-იდან. Region ფაილები შენი ყველა ნაგებობით ჩვეულებრივ ხელუხლებელია.

უსაფრთხოა MCA Selector-ის გაშვება ცოცხალ სერვერზე?

არა. ყოველთვის ჯერ სერვერი გააჩერე და ასლზე იმუშავე. სერვერი chunk-ებს მეხსიერებაში ინახავს და შემდეგ შენახვაზე შენს ცვლილებებს გადააწერს, ან ჩაწერებს შენსას შეურევს.


კომენტარები

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

0/2000