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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-11-21 18:18:49

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

[SOLVED] Analiza struktury dysku

Jestem w trakcie pisania artykułu, problem w tym, że wyliczenia mi się nie zgadzają.

To jest mój dysk:

Kod:

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

 

#2  2013-11-21 18:38:17

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: [SOLVED] Analiza struktury dysku

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.


[img]http://img34.imageshack.us/img34/5092/zw9m.png[/img] [img]http://img29.imageshack.us/img29/219/pibw.png[/img]

Offline

 

#3  2013-11-21 20:27:17

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: [SOLVED] Analiza struktury dysku

Nie wiem za bardzo co z tym zrobić xD

Ok może inaczej: To jest tablica partycji widziana przez sfdisk:

Kod:

# 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:

Kod:

/dev/sda2 : start=  1953792, size= 97656832, Id=83

W fdisku jest:

Kod:

/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:

Kod:

/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:

Kod:

  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

 

#4  2013-11-22 02:44:08

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: [SOLVED] Analiza struktury dysku

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:

Kod:

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

 

#5  2013-11-22 08:02:22

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: [SOLVED] Analiza struktury dysku

morfik wgl jak ktos wchodzi w wątek i widzi taka litanie odechciewa się czytać. Można było zapisać to wszystko krócej.


[img]http://img34.imageshack.us/img34/5092/zw9m.png[/img] [img]http://img29.imageshack.us/img29/219/pibw.png[/img]

Offline

 

#6  2013-11-22 11:30:25

  ArnVaker - Kapelusznik

ArnVaker
Kapelusznik
Skąd: Midgard
Zarejestrowany: 2009-05-06

Re: [SOLVED] Analiza struktury dysku

Ja przeczytanie tego wątku odłożyłem sobie na „może później, jeśli nikt nie odpowie”. ;)


[img]http://svn.debianart.org/themes/generic/spinner/spinner48px-moreblue.png[/img]

Offline

 

#7  2013-11-22 15:29:33

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: [SOLVED] Analiza struktury dysku

Oj tam, oj tam, bo to wątek dla prawdziwych wyjadaczy.

Ale grunt, że się wszystko wyjaśniło, choć w sumie ja sobie to jeszcze poczytam parę razy dla utrwalenia. xD

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)

[ Generated in 0.009 seconds, 12 queries executed ]

Informacje debugowania

Time (s) Query
0.00014 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00108 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.142.172.190' WHERE u.id=1
0.00054 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.142.172.190', 1732370379)
0.00041 SELECT * FROM punbb_online WHERE logged<1732370079
0.00055 DELETE FROM punbb_online WHERE ident='3.144.47.115'
0.00061 SELECT topic_id FROM punbb_posts WHERE id=246419
0.00121 SELECT id FROM punbb_posts WHERE topic_id=24660 ORDER BY posted
0.00057 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.00005 SELECT search_for, replace_with FROM punbb_censoring
0.00081 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.00074 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=24660
Total query time: 0.00675 s