Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Jestem w trakcie pisania artykułu, problem w tym, że wyliczenia mi się nie zgadzają.
To jest mój dysk:
root:/# fdisk -l /dev/sda Disk /dev/sda: 1500.3 GB, 1500301910016 bytes 255 heads, 63 sectors/track, 182401 cylinders, total 2930277168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000a8aae Device Boot Start End Blocks Id System /dev/sda1 * 2048 1953791 975872 83 Linux /dev/sda2 1953792 99610623 48828416 83 Linux /dev/sda3 99610624 1466798079 683593728 83 Linux /dev/sda4 1466800126 2930276351 731738113 5 Extended /dev/sda5 1857425408 2482423807 312499200 83 Linux /dev/sda6 2482425856 2930276351 223925248 83 Linux /dev/sda7 1466802176 1646376959 89787392 83 Linux /dev/sda8 1646379008 1857423359 105522176 83 Linux Partition table entries are not in disk order
Generalnie text będzie o tym jak się nie dać bad sektorom ale potrzebuję wiedzieć jedną rzecz i poniżej jest przedstawionych kilka obliczeń. Choć w sumie podczas pisania tego posta, wszystko się złożyło, niemniej jednak nadal, pozostaje kilka niejasnych dla mnie kwestii.
Pytania są oznaczone numerami, cały proces liczenia zostawiam, może komuś się przyda xD
Jeśli partycja zaczyna się 1953792 a kończy 99610623 to:
99610623−1953792=97656831
(97656831+1)/2=48828416 -- tyle ma bloków.
1. Czemu się dodaje jeden sektor oraz czemu jeden blok ma dwa sektory?
Dalej: Przepisanie rozmiaru dysku i partycji z bloków na sektory (bloki pomnożone przez 2)
dysk -- 2930277168 (taki sam jak był)
part1 -- 1951744
part2 -- 97656832
part3 -- 1367187456
part roz -- 1463476226
part4 -- 624998400
part5 -- 447850496
part6 -- 179574784
part7 -- 211044352
Liczenie wolnego miejsca, niezajętego przez systemy plików.
sektory dysku | 1part | 2part | 3 part | 4 part | 5 part | 6part | 7part
2930277168-1951744-97656832-1367187456-624998400-447850496-179574784-211044352=13104
Offsety partycji:
2048 -- partycja pierwsza, równanie do MiB
Dalej: Wyliczanie wolnego miejsca na końcu dysku:
13104-2048=11056
2. Czy ta końcówka jest wynikiem równania do MiB przy tworzeniu partycji? Gdyby nie równać, ten kawałek by został włączony do partycji?
Dalej: rozmiar rozszerzonej partycji i dysków logicznych:
Partycja ma rozmiar 1463476226 sektorów (731738113 bloków) ale odejmując od niej rozmiary dysków logicznych zawartych w tej partycji dostaję:
1463476226−624998400−447850496−179574784−211044352=8194
2050 -- 1466802176-1466800126 -- offset pierwszego dysku logicznego (nie wiedziałem wtedy, że nie trzeba go tworzyć)
Ten offset logiczny jest wyliczony przez odjęcie startu pierwszego logicznego dysku od startu partycji rozszerzonej. Czemu zwraca 2050 a nie 2048, skąd te dwa extra sektory? Z tego co się doczytałem na wiki to jeden odpowiada za EBR -- to taki MBR tyle, że rezyduje w rozszerzonej partycji, a miejsce przeznaczone na kod bootloadera zwykle jest wypełnione zerami. A ten drugi sektor to?
8194−2050=6144
Skąd się wzieło extra 6144 sektorów wolnej przestrzeni w granicach rozszerzonej partycji? Poprzestawiałem te partycje tak by było czytelniej (odpowiednia kolejność)
odejmowanie dolne początku od górnych końców (za wyjątkiem liczenia sda7-sda4):
/dev/sda4 1466800126 2930276351 Extended
/dev/sda7 1466802176 1646376959 Linux 1466802176−1466800126=2050
/dev/sda8 1646379008 1857423359 Linux 1646379008−1646376959=2049
/dev/sda5 1857425408 2482423807 Linux 1857425408−1857423359=2049
/dev/sda6 2482425856 2930276351 Linux 2482425856−2482423807=2049
Wychodzi na to, że każdy kolejny dysk logiczny jest przesunięty o 2049 sektorów. Przypuszczam, że 2048 jest dla równania do 1 MiB, a ten dodatkowy 1? Ale 6144/3=2048 a nie 2049.
W każdym razie jeśli by porównać wolne miejsce:
8194−(3⋅2049)−2050=-3 (?)
3. Nie mogę znaleźć tego posta ale gdzieś mi się obiło o oczy, odejmowanie 1 sektora w wynikach, być może to ten sektor? Wtedy jakby odjąć go od 2050 i 2049, dostałoby się pożądane wartości, a powyższe równanie dałoby wynik 1, czyli wolny sektor (nie zajęty przez system plików) dla EBR, z uwzględnieniem offsetów 2048 dla każdego dysku logicznego. Jeśli tak, to czemu się ten sektor odejmuje? Ma to coś wspólnego z dodawaniem 1 sektora przy przeliczaniu na bloki? Jeśli tak, to czemu się dodaje ten sektor przy przeliczaniu na bloki? (nr. 1)
Zakładając, że to powyżej jest ok, to po odjęciu tych sektorów uzyskamy wartość 8194 zamiast 8197, są to wolne sektory, które trzeba dodać do rozmiaru logicznych dysków czyli:
624998400+447850496+179574784+211044352+8194=1463476226
I jest to dokładnie tyle samo co rozmiar rozszerzonej partycji 1463476226. Ale jeśli odjąć to od dysku:
dysk part1 part2 part3 part roz
2930277168−1951744−97656832−1367187456−1463476226=4910
dla porównania:
sektory dysku | 1part | 2part | 3 part | 4 part | 5 part | 6part | 7part
2930277168-1951744-97656832-1367187456-624998400-447850496-179574784-211044352=13104
Ale 13104−4910=8194 -- offsety dla logicznych dysków(4x 2048 + EBR +1 sektor), czyli teoretycznie wszystko mi się teraz zgodziło i na końcu dysku jest nie 13104-2048=11056 sektorów wolnego miejsca, ani tym bardziej 4910. Od tych 4910 trzeba jeszcze odjąć offset pierwszej partycji, czyli 2048, co zostawia nam 2862 na końcu dysku, co daje 1.3974609 MiB
Choć nadal nie mam pojęcia czemu takie cuda z tym jednym sektorem się przeprowadza.
Ostatnio edytowany przez morfik (2013-11-22 02:44:35)
Offline
morfik nie wiem czy o to chodzi, bo pobieżne przeczytałem początek (jestem na telefonie), ale może pomoże. Matematyka masz np ciąg;
5 6 7 8
8-5=3
a ilość liczb to 4.
Offline
Nie wiem za bardzo co z tym zrobić xD
Ok może inaczej: To jest tablica partycji widziana przez sfdisk:
# partition table of /dev/sda unit: sectors /dev/sda1 : start= 2048, size= 1951744, Id=83, bootable /dev/sda2 : start= 1953792, size= 97656832, Id=83 /dev/sda3 : start= 99610624, size=1367187456, Id=83 /dev/sda4 : start=1466800126, size=1463476226, Id= 5 /dev/sda5 : start=1857425408, size=624998400, Id=83 /dev/sda6 : start=2482425856, size=447850496, Id=83 /dev/sda7 : start=1466802176, size=179574784, Id=83 /dev/sda8 : start=1646379008, size=211044352, Id=83
Gdy mi wcieło jeden wpis a resztę dysku oznaczyło jako pusty (przynajmniej w gparted) chciałem sobie przywrócić te wpisy, ale nie mogłem tego zrobić przy pomocy sfdiska, bo ten zwrócił błąd, że partycja się zaczyna na końcu dysku. No to ręcznie zacząłem wpisywać po kolei te wpisy do fdiska tworząc nową tablicę partycji, sprawdzając przy tym czy aby wynik fdiska jest taki jak być powinien.
I teraz tak: weźmy sobie jedną partycję dla przykładu:
/dev/sda2 : start= 1953792, size= 97656832, Id=83
W fdisku jest:
/dev/sda2 1953792 99610623 48828416 83 Linux
Różnica jest oczywista, sfdisk podaje start sektora i rozmiar w sektorach, a fdisk podaje start, koniec i liczbę bloków. Musiałem mieć pewność, że to wszystko się będzie zgadzać ze sobą i wtedy stanąłem przed pytaniem, jak mam pogodzić te wartości, żeby mi się czasem 1500GB danych nie skasowało przy okazji. xD
Fdisk może tworzyć partycje przez podanie początkowego sektora i końcowego albo przez podanie początku i liczby sektorów przez +sektory i tam parę innych sposobów ale te dwa są kluczowe. Jak popatrzysz teraz na tablice sfdiska, to tam nie ma końca partycji.
Co prawda ten dysk działał bez jednej partycji i mogłem zajrzeć w tę jego uszkodzoną tablicę i tylko chyba dlatego udało mi się to poskładać do kupy. Tablicę partycji tworzyłem przez podanie początku +sektory -- odczytane z backupu sfdiska. W tym przypadku to było start 1953792 enter +97656832 enter. Po wpisaniu tych parametrów, fdisk stworzył wpis który wylistowany wyglądał mniej więcej tak:
/dev/sda2 1953792 99610623 48828416+ 83 Linux
Różnił się on znakiem + przy blokach, jako, że miałem podgląd uszkodzonej tablicy partycji, to widziałem, że tam plusa nie było i musiałem wykombinować jak się go pozbyć. Więc usunąłem wpis i wklepałem go jeszcze raz tym razem start 1953792 enter +97656831 enter i po wylistowaniu tym razem + zniknął, bloków niby było tyle samo, ale przecie rozmiar się zmniejszył o jeden sektor. Po czym ponowiłem akcję dla każdego wpisu w sfdisku, odejmując o rozmiaru każdej partycji 1 i zapisałem tablicę. Odpaliłem gparted i wszystko wróciło na swoje miejsce. xD
W tym przypadku z liczeniem pewnych rzeczy jest podobnie, ciągle ten jeden sektor trzeba albo dodawać albo odejmować i pytanie jest skąd on się bierze i po co on w ogóle jest, bo jeśli sobie weźmiesz przykładową partycję z fdiska:
start koniec bloki 1953792 99610623 48828416
Jak odejmiesz od końca start 99610623-1953792 dostaniesz 97656831, jeśli to teraz podzielisz przez 2 to już na oko widać, że 1 się nie dzieli bez reszty i będzie 0,5 a dokładnie 48828415.5 i jak teraz posadzisz to obok 48828416, to ma się dziwne wrażenie, że to jakoś do siebie pasuje ale nie do końca, a jak popatrzysz na wszystkie partycje to zobaczysz dokładnie to samo, czyli różnicę o 0.5 ale jak dodasz mu 1 po wyliczeniu rozmiaru w sektorach, to zraz się zaczyna ładnie wszystko dzielić i liczba bloków jest dokładnie taka sama jak we wpisie w fdisku
I tak mi wyszła zależność (koniec - początek +1)/2=liczba bloków ale nie mam pojęcia skąd się wzieło to +1 sektor.
Offline
W sumie to wyliczenie wolnego miejsca też nie jest zbyt trafne, myślałem, że sam wpis rozszerzonej partycji nie jest przesunięty ale jednak jest:
1466800126−1466798079=2047, dziwne, że nie 2048. Choć, pewnie by było poprawne 2048 gdyby nie robić przesunięcia dysku logicznego, wtedy dysk logiczny by się zaczoł zaraz za EBR, a że EBR to 1 sektor, więc offset dysku logicznego by miał 2048. To zaczyna powoli nabierać sensu. xD
W każdym razie w fdisk jest opcja do sprawdzenia ile sektorów jest wolnych, wprawdzie nie mówi, gdzie ale liczba może trochę pomoc:
root:~# fdisk /dev/sda Command (m for help): v Remaining 13099 unallocated 512-byte sectors
Trochę się to różni od mojego wyliczenia 13104, aż o 5 sektorów, czyli coś za dużo, ale gdzie?
Tak sobie patrzę to te +5 sektorów i myślę, że mogą odpowiadać 5 offsetom
2049
2047+2050 --jak nie patrzeć to jest jeden offset a nie dwa osobne.
2049
2049
2049
I chyba przez przypadek doszedłem skąd się wziął ten dodatkowy sektor. xD Bo właśnie mi się przypomniało co było w tamtym poście i czemu offsety dysków logicznych zwracają 2049 zamiast 2048.
Są na tym dysku partycje bez offsetu i jeśli się odejmie ich wartości, przykładowo:
/dev/sda1 * 2048 1953791 975872 83 Linux
/dev/sda2 1953792 99610623 48828416 83 Linux
/dev/sda3 99610624 1466798079 683593728 83 Linux
sda2-sda1 1953792-1953791=?
sda3-sda2 99610624-99610623=?
To ile wyjdzie? -- 1. xD
To dlatego wszystko ma wartość +1, i to mniej więcej było w tamtym poście. Czyli jak nie patrzeć to taki mały offset xD
Jakby to teraz dokładnie policzyć to
13099-2048-2047-2049-(3*2048)=811 -- według fdiska,
13104−2049-2047-2050-(3*2049)=811 -- według mnie +5 sektorów
Tu wyjaśnienie 4partycje mają offset 2048 ale bez tego miały by offset 1, natomiast pozostałe dwa do offset rozszerzonej partycji (2047 bez EBR) oraz offset pierwszego dysku logicznego 2048 +EBR czyli 2049. Do każdego z nich trzeba dodać 1 i tu się rozwiązała zagadka 5 dodatkowych sektorów.
A co do samego wyliczenia wolnego miejsca na końcu dysku .Po odjęciu offsetów zostaje 811 sektorów, to daje 405,5KiB danych na końcu dysku. W sumie jak równanie do 1 MiB, to nie może przecie zostać więcej niż 1 MiB.
Czyli w sumie wszystko się wyjaśniło. xD
Offline
morfik wgl jak ktos wchodzi w wątek i widzi taka litanie odechciewa się czytać. Można było zapisać to wszystko krócej.
Offline
Ja przeczytanie tego wątku odłożyłem sobie na „może później, jeśli nikt nie odpowie”. ;)
Offline
Time (s) | Query |
---|---|
0.00009 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00064 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.17.155.142' WHERE u.id=1 |
0.00079 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.17.155.142', 1732382717) |
0.00033 | SELECT * FROM punbb_online WHERE logged<1732382417 |
0.00023 | SELECT topic_id FROM punbb_posts WHERE id=246328 |
0.00005 | SELECT id FROM punbb_posts WHERE topic_id=24660 ORDER BY posted |
0.00058 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=24660 AND t.moved_to IS NULL |
0.00072 | SELECT search_for, replace_with FROM punbb_censoring |
0.00206 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=24660 ORDER BY p.id LIMIT 0,25 |
0.00068 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=24660 |
Total query time: 0.00621 s |