<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<title>lury.cz</title>
	<subtitle>Blog programátora</subtitle>
	<id>https://lury.cz/</id>
	<updated>2026-08-28T16:31:02+02:00</updated>
	<link rel="alternate" type="text/html" href="https://lury.cz" />
	<link rel="self" type="application/atom+xml" href="https://lury.cz/atom.xml" />
	<author><name>lury.cz</name></author>
	<entry>
		<title>Velikost sektoru zamkl výrobce disku, ne značka na štítku</title>
		<id>https://lury.cz/velikost-sektoru-zamkl-vyrobce-disku-a15</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/velikost-sektoru-zamkl-vyrobce-disku-a15" />
		<updated>2026-08-28T16:31:02+02:00</updated>
		<published>2026-08-28T15:52:50+02:00</published>
		<summary>Osm SAS SSD z&amp;nbsp;vyřazeného pole hlásí v&amp;nbsp;Linuxu nulovou velikost. Rozebral jsem firmware, našel sedm bajtů, které za to můžou, a&amp;nbsp;doportoval patch do jádra. Pak jsem pustil jednu nedestruktivní sondu a&amp;nbsp;zjistil, že u&amp;nbsp;jiného disku stačí jeden příkaz.</summary>
		<content type="html"><![CDATA[<p>Osm SAS SSD z vyřazeného diskového pole, každé 1,6 TB, všechna zdravá.
Nula vadných sektorů, opotřebení pod pět procent. A v Linuxu z nich neteče ani
bajt, protože blokové zařízení má nulovou velikost.</p>

<p>Řešil jsem to od nesprávného konce. Rozebral jsem firmware, našel v něm
sedm bajtů, které za to můžou, doportoval cizí patch do jádra a otestoval ho.
Pak jsem spustil jednu nedestruktivní sondu na jiný disk z téže bedny a zjistil,
že u něj stačí jeden příkaz. Rozhoduje totiž výrobce disku, ne značka na
štítku.</p>

<h2>Proč 528 bajtů</h2>

<p>Disky z polí od IBM, EMC, NetApp a dalších bývají naformátované na sektor
o velikosti 520 nebo 528 bajtů. Je to 512 bajtů dat plus 8 nebo 16 bajtů
metadat, ze kterých si řadič pole počítá vlastní kontrolu integrity. Uvnitř
pole to dává smysl a stojí to jen kus interní rezervy; kapacita na štítku
zůstává celá.</p>

<p>Mimo pole je to problém. Blokové vrstvě Linuxu velikost bloku, která není
mocninou dvou, neprojde: <code>blk_validate_block_size()</code> ji odmítne
a disk zůstane s nulovou velikostí. Neuvidí ho LVM, ext4, XFS ani ZFS.</p>

<p>Není to chyba jádra a nemá cenu na ni čekat. Celá bloková vrstva počítá
s tím, že se offset v bajtech dostane na číslo sektoru posunem. Kdo chce
528bajtový disk používat mimo pole, musí ho buď přeformátovat, nebo přepočítávat
sám.</p>

<h2>Co jsem zkusil a nefunguje</h2>

<p>Tohle je asi nejužitečnější část textu, protože fóra na tuhle otázku
odpovídají buď „nejde to“, nebo „zkus sg_format“. Všechno níž jsem zkoušel na
živém disku a žádný z těch pokusů disk nepoškodil.</p>

<table>
<thead><tr><th>Cesta</th><th>Výsledek</th></tr></thead>
<tbody>
<tr><td><code>sg_format --size&#61;512</code>, i s <code>--six</code></td><td>Invalid field in parameter list, byte 13 bit 7</td></tr>
<tr><td><code>sg_raw</code> MODE SELECT, krátký LBA, tři varianty počtu bloků</td><td>totéž</td></tr>
<tr><td><code>sg_raw</code> MODE SELECT s LONGLBA, 24bajtový parametr</td><td>totéž; 528 projde, 512 ne</td></tr>
<tr><td><code>openSeaChest --setSectorSize 512</code></td><td>„not supported on this device“</td></tr>
<tr><td><code>openSeaChest --formatUnit</code> na 512, 520, 524 i 4096</td><td>„Format Unit Failed!“</td></tr>
<tr><td>crossflash oficiálním firmwarem Seagate</td><td>sense 0x05 po dvaadvaceti segmentech</td></tr>
<tr><td><code>sg_write_buffer</code>, režim 5 i 7</td><td>ASC 0x26 / ASCQ 0x99</td></tr>
<tr><td>TCG PSID revert, ruční stack nad <code>sg_raw</code></td><td>session vrstva nereaguje</td></tr>
<tr><td><code>sedutil-cli</code></td><td>„Invalid or unsupported disk“; umí SATA a NVMe, ne SAS</td></tr>
</tbody>
</table>

<p>Ty tři nejzajímavější řádky stojí za rozvedení.</p>

<p><strong>Blokovaná je změna, ne formátování.</strong> FORMAT UNIT na stávající
velikost sektoru projde bez potíží. Jakmile v parametrech stojí jiné číslo než
528, disk vrátí vendor-specific kód ASC 0x26 s ASCQ 0x99. Týmž kódem mimochodem
odmítá i pokus přepsat maximální rychlost linky ze 6 na 12 Gb/s. Je to jeden
a týž zámek na dvě různé věci.</p>

<p><strong>Crossflash disk poznal a odmítl vědomě.</strong> Nahrání pravého
podepsaného firmwaru od Seagate skončilo po dvaadvaceti segmentech. Zajímavé
je, že standardní varianta obrazu je odmítnutá okamžitě, kdežto SED varianta se
dostane dál. Disk tedy typ souboru uznal a padlo to až na kontrole zákaznického
stavu, o které mluví produktový manuál Seagate v oddílu o ověřovaném stahování
firmwaru: obraz musí odpovídat modelu, revizi <em>a customer status</em>.</p>

<p><strong>TCG vrstva odpovídá, ale nic nedělá.</strong> Level 0 Discovery
funguje, jen je potřeba správné CDB, protože alokační délka se u něj udává
v blocích, ne v bajtech. Disk vrátí Opal SSC 1.00 a hlásí zámky jako podporované
a zapnuté. Skutečná session ale nefunguje: <code>SECURITY PROTOCOL IN</code>
vrací pokaždé prázdný payload. Rozhodl to jeden test. Poslal jsem na ComID 512
bajtů čistého nesmyslu, samé <code>0xdeadbeef</code> dokola, a disk odpověděl
<code>Good</code>. Neplatný paket musí skončit chybou, takže je disk přijímá
a zahazuje.</p>

<p>Na výsledku by to stejně nic nezměnilo. Jiný člověk na fóru Serve The Home
zkoušel PSID revert na disku, kde mu <code>sedutil</code> normálně funguje,
a hlásí, že <code>sg_format</code> po čerstvém resetu skončí na téže chybě.
Reset šifrovacího klíče velikost sektoru neodemyká.</p>

<h2>Zámek je v datech, ne v kódu</h2>

<p>Když softwarová cesta došla, sáhl jsem po obsahu SPI flash. Porovnáním dumpu
ze zamčeného disku s dumpem z pravého disku Seagate se dá najít přesné místo,
které o velikosti sektoru rozhoduje. Vyšlo z toho, že zámek není kus kódu, ale
pojmenovaný konfigurační záznam v datech, a že jeho kontrolní součet umím
dopočítat. Přepsat by se muselo sedm bajtů.</p>

<p>Rozepsal jsem to zvlášť v článku
<a href="/kde-v-disku-sedi-zamek-velikosti-sektoru-a13">Zámek velikosti sektoru sedí v datovém záznamu</a>.
Zápis na hardware jsem neprovedl, chybí mi programátor.</p>

<h2>Obchvat v ovladači</h2>

<p>Druhá cesta zámek neřeší, jen ho obchází. Ovladač <code>sd</code> může číst
a zapisovat celé 528bajtové sektory a hostu ukazovat prvních 512 bajtů
z každého. Patch, který to umí, existuje, ale přišel bez autora a cílil na
strom jádra, který v upstreamu nikdy nebyl. Doportoval jsem ho na 6.8
a otestoval proti fyzickému disku v QEMU, aniž bych restartoval hostitele.
Funguje to včetně křížové validace, cena je 16 bajtů z každého sektoru.</p>

<p>Podrobně v článku
<a href="/kernel-528-sektory-test-v-qemu-a14">Nový kernel jsem vyzkoušel proti fyzickému disku bez restartu serveru</a>.</p>

<h2>Sonda, kterou jsem měl spustit jako první</h2>

<p>Do tohohle bodu jsem počítal s tím, že za vším stojí firmware od IBM. Pak
mi do serveru přibyl další IBM disk, tentokrát 400GB kus, a chtěl jsem vědět,
jestli se chová stejně, dřív než na něj pustím čtyřicetiminutový formát.</p>

<p>Existuje na to zkouška, která nic nezničí. MODE SELECT má v bajtu 1 příznak
SP, který říká, jestli se má nastavení uložit natrvalo. S vypnutým SP disk
parametry jen zkontroluje a zahodí, na medium nesahá:</p>

<pre><code>printf &#039;\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x02\x00&#039; &gt; /tmp/ms512.bin
sg_raw -s 16 -i /tmp/ms512.bin /dev/sdX 55 10 00 00 00 00 00 00 10 00</code></pre>

<p>V CDB je <code>55</code> MODE SELECT(10) a bajt <code>0x10</code> znamená
PF zapnuté, SP vypnuté. Šestnáct bajtů parametrů je osmibajtová hlavička a za ní
block descriptor s délkou bloku 512. Disk buď řekne, že je to v pořádku, nebo
odmítne. Trvá to zlomek vteřiny.</p>

<p>A výsledek byl jiný, než jsem čekal:</p>

<table>
<thead><tr><th>Disk</th><th>Kdo ho vyrobil</th><th>Odpověď na sondu</th></tr></thead>
<tbody>
<tr><td>IBM-SSG, 400 GB</td><td>HGST</td><td><code>SCSI Status: Good</code></td></tr>
<tr><td>IBM-SSG, 1,6 TB</td><td>Seagate</td><td>Illegal Request, Invalid field in parameter list</td></tr>
</tbody>
</table>

<p>Oba disky nesou stejnou značku, stejný prefix v identifikaci a oba pocházejí
ze stejného pole. Jeden se přeformátovat dá a druhý ne. Kritérium tedy není
IBM, ale výrobce, který ten disk pro IBM postavil, a poznáte ho z prvních tří
bajtů adresy SAS.</p>

<p>Fóra na to mají tabulku, podle které jde reformátovat NetApp, EMC, Dell,
Toshiba, HPE a Huawei, kdežto „IBM branded“ nejde. Podle mého měření je ta
tabulka příliš hrubá. Nejde ta část disků IBM, kterou vyrobil Seagate.</p>

<h2>Pak už jen jeden příkaz</h2>

<p>U disku, který sondu projde, je zbytek nuda. <code>sg_format --size&#61;512</code>
a čekání. U mě to trvalo 36 minut a postup byl po celou dobu lineární.</p>

<p>Průběh jde číst jedině přes <code>sg_requests --progress</code>, protože
během formátu vrací <code>sg_turs</code> i <code>sg_readcap</code> jen „device
not ready“ a jádro drží nulovou velikost. Odhad zbývajícího času má smysl
dělat až po nějakých pěti minutách běhu: vzorek z prvních 150 vteřin mi vyšel
na dvě hodiny, skutečnost byla 42 minut. Rozjezd není lineární, ustálený běh
už ano.</p>

<p>Fast format z SBC-4 existuje a starší disk ho přijal, jenže nezachrání den.
Bez něj šel formát tempem 2,35 % za minutu, s <code>--ffmt&#61;1 --dcrt</code>
2,82 %. To je zrychlení kolem patnácti procent, ne řádové. Kvůli tomu nemá
smysl přerušovat už běžící formát.</p>

<p>Přerušit ho jde mimochodem bezpečně, což jsem si ověřil. Po ukončení procesu
a resetu zařízení hlásí disk <code>Medium format corrupted</code>, což vypadá
hrozivě, ale je to očekávaný a vratný stav; stačí formát spustit znovu.</p>

<p>Hlavní obava byla, že s metadaty přijdu o tři procenta kapacity. Nepotvrdila
se. Disk si po změně délky bloku přepočítal počet logických bloků z fyzické
kapacity:</p>

<pre><code>pred:  757 743 288 x 528 B &#61; 400 088 456 064 B
po:    781 422 768 x 512 B &#61; 400 088 457 216 B</code></pre>

<p>Rozdíl 1 152 bajtů, tedy nic. Zápis přes <code>oflag&#61;direct</code> dává
392 MB/s a testy integrity na zarovnaném, nezarovnaném i koncovém offsetu
prošly.</p>

<h2>Tři cesty a kdy kterou</h2>

<table>
<thead><tr><th>Cesta</th><th>Funguje na</th><th>Ztráta kapacity</th><th>Co je potřeba</th></tr></thead>
<tbody>
<tr><td><code>sg_format --size&#61;512</code></td><td>disky bez zámku</td><td>žádná</td><td>nic, kolem 40 minut času</td></tr>
<tr><td>patch do jádra, emulace</td><td>i na zamčené</td><td>16 B ze sektoru, 1,55 TB z 1,60</td><td>nestandardní jádro</td></tr>
<tr><td>přepis SPI flash</td><td>i na zamčené</td><td>žádná</td><td>programátor, rozebrat disk</td></tr>
</tbody>
</table>

<p>Pořadí je dané tou sondou. Když projde, jde se cestou první a nic dalšího
se neřeší. Když neprojde, přichází na řadu volba mezi tichým ukusováním
kapacity a pájkou. A pořád existuje čtvrtá možnost, kterou jsem si dlouho
odmítal připustit: nasadit ty disky tam, kde je 528 bajtů nativní hodnota,
nebo je prodat někomu, kdo takové pole provozuje. Pro něj to není vada.</p>

<h2>Co si z toho beru</h2>

<p>Nejlevnější diagnostika patří na začátek, ne na konec. Ta sonda trvá zlomek
vteřiny, nic nezničí a rozhoduje o tom, jestli má cenu dělat všechno ostatní.
Kdybych ji spustil první den, ušetřil bych si většinu předchozí práce, protože
bych rovnou věděl, které disky jsou ztracený případ a které se srovnají do
oběda.</p>

<p>Vzniklo to z předpokladu, který jsem si nikdy nezkusil ověřit. Značka na
štítku byla IBM, fóra o IBM discích píšou, že nejdou, takže jsem hledal zámek
od IBM. Byl to zámek od Seagate a poznalo se to na jiném disku téže značky.
Rozborem firmwaru se přitom to rozlišovací kritérium najít nedalo, protože
jsem měl dumpy jen z disků od jednoho výrobce.</p>

<p>Co zůstalo nedodělané, přiznávám rovnou. Zamčené disky odemčené nejsou.
Vím, kterých sedm bajtů by se mělo přepsat, ale zápis do flash jsem neprovedl.
Emulace v jádře běží a prošla křížovou validací, ostrá data na ní ale nemám
a mít nebudu, dokud neproběhne dlouhý test s verifikací. A rychlost linky
zůstává na 6 Gb/s, protože ten limit sedí ve firmwaru disku a žádná z těch tří
cest na něj nedosáhne.</p>

<h2>Kód a podklady</h2>
<p>Všechno, na čem tenhle text stojí, je ve veřejném repozitáři <a href="https://github.com/nks-hub/st1600fm0013-528b-sectors" rel="noopener" target="_blank">st1600fm0013-528b-sectors</a> – skripty, zálohy firmwaru i rozbory, které se do článku nevešly.</p>
<ul>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/reformat-528-512_CZ.md" rel="noopener" target="_blank"><code>reformat-528-512_CZ.md</code></a> – co u kterého disku prošlo a co ne</li>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/linkrate-6g-analysis_CZ.md" rel="noopener" target="_blank"><code>linkrate-6g-analysis_CZ.md</code></a> – proč disky jedou 6 Gb/s</li>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/tree/master/tools" rel="noopener" target="_blank"><code>tools/</code></a> – skripty, kterými jsem firmware rozebíral</li>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/README_CZ.md" rel="noopener" target="_blank"><code>README_CZ.md</code></a> – celá práce pohromadě</li>
</ul>

<h2>Zdroje</h2>

<ul>
<li><a href="https://forums.servethehome.com/index.php?threads/how-to-reformat-hdd-ssd-to-512b-sector-size.4968/" target="_blank" rel="noopener">Serve The Home: How to reformat HDD &amp; SSD to 512B Sector Size</a> – devětadvacet stran zkušeností napříč značkami</li>
<li><a href="https://forums.servethehome.com/index.php?threads/changing-block-size-ibm-branded-micron-s650dc-800-ssd.26945/" target="_blank" rel="noopener">Serve The Home: Changing block size, IBM branded Micron S650DC-800</a> – tentýž problém na disku od jiného výrobce</li>
<li><a href="https://www.seagate.com/content/dam/seagate/migrated-assets/www-content/product-content/ssd-fam/1200-ssd/en-us/docs/1200-2-sas-ssd-product-manual-100773817d.pdf" target="_blank" rel="noopener">Seagate 1200.2 SAS SSD Product Manual 100773817 Rev. D</a> – oddíl o ověřovaném stahování firmwaru a tabulka formátů</li>
<li><a href="https://github.com/Mattiwatti/sedutil" target="_blank" rel="noopener">Mattiwatti/sedutil</a> – fork, který se používá na disky z polí</li>
</ul>]]></content>
		<category term="Linux" />
	</entry>
	<entry>
		<title>Zámek velikosti sektoru sedí v datovém záznamu, ne v kódu firmwaru</title>
		<id>https://lury.cz/kde-v-disku-sedi-zamek-velikosti-sektoru-a13</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/kde-v-disku-sedi-zamek-velikosti-sektoru-a13" />
		<updated>2026-08-28T16:31:02+02:00</updated>
		<published>2026-08-28T15:49:43+02:00</published>
		<summary>Osm SAS SSD z&amp;nbsp;vyřazeného pole hlásí v&amp;nbsp;Linuxu nulovou velikost. Než jsem začal obcházet firmware v&amp;nbsp;ovladači, rozebral jsem tři dumpy SPI flash a&amp;nbsp;našel místo, které o&amp;nbsp;velikosti sektoru rozhoduje. Je to datový záznam, ne kus kódu.</summary>
		<content type="html"><![CDATA[<p>Osm SAS SSD z vyřazeného diskového pole, všechny zdravé, a v Linuxu z nich
neteče ani bajt. Mají 528bajtové sektory: 512 bajtů dat a 16 bajtů metadat, ze
kterých si pole počítá vlastní kontrolu integrity. Blokové vrstvě jádra to
nestačí, protože po velikosti bloku chce mocninu dvou, takže disk skončí
v systému s nulovou velikostí. A firmware velikost sektoru změnit nedovolí.</p>

<p>Jak jsem se do téhle situace dostal a co všechno na ty disky nefunguje, je v článku <a href="/velikost-sektoru-zamkl-vyrobce-disku-a15">Velikost sektoru zamkl výrobce disku, ne značka na štítku</a>. Tenhle text je o jednom kroku z něj, o rozboru firmwaru.</p>

<p>Než jsem začal stavět obchvat v ovladači, chtěl jsem vědět, s čím vlastně
bojuju. Jestli je ten zámek kus kódu, nebo jen položka v konfiguraci. Vyšlo to
druhé, a je to podstatný rozdíl: kód bez podpisového klíče nepřepíšu, kdežto
datový záznam s kontrolním součtem, který umím dopočítat, ano.</p>

<h2>Tři dumpy a proč jeden nestačí</h2>

<p>Disk se sám k obsahu své SPI flash nepustí. Jediná cesta k němu vede přes
odpájení paměti a programátor, a to se mi u vlastního kusu zatím nechtělo. Na
fóru Serve The Home ale visí ve <a href="https://forums.servethehome.com/index.php?threads/how-to-reformat-hdd-ssd-to-512b-sector-size.4968/page-28" target="_blank" rel="noopener">vlákně o reformátování disků na 512 B</a>
tři dumpy, které stačí.</p>

<ul>
<li>Uživatel <strong>Arslan109</strong> odpájel v září 2025 čip z disku
ST1600FM0013 s firmwarem 6214, tedy z přesně toho modelu, který mám v serveru.</li>
<li>Uživatel <strong>leromarinvit</strong> koupil o dva měsíce později nejlevnější
disk téže rodiny s pravým Seagate firmwarem, dumpnul ho ve verzi 0007, upgradoval
na 000A a dumpnul znovu. Obojí ověřil dvojím čtením.</li>
</ul>

<p>Sám o sobě by mi jeden dump neřekl nic. Nevím, kde v tom binárním balíku
o čtyřech megabajtech hledat, a hledat naslepo se nedá. Zajímavý je až rozdíl
mezi zamčeným a nezamčeným kusem, a k tomu je potřeba mít oba.</p>

<p>Všechny tři soubory mají shodně 4 194 304 bajtů, tedy plnou kapacitu čipu
W25Q32. Využito je z toho kolem desetiny, zbytek je výplň nulami a jedničkami.
Prvních dvaatřicet bajtů je u všech tří naprosto stejných, takže formát je týž.
Zajímavější je míra podobnosti:</p>

<pre><code>IBM 6214     vs Seagate 000A   -&gt;  89,7 % shodných bajtů
Seagate 0007 vs Seagate 000A   -&gt;  80,0 % shodných bajtů</code></pre>

<p>IBM firmware je tedy Seagate verzi podobnější, než jsou si dvě verze Seagate
firmwaru navzájem. Z toho jsem odhadl, že rozdíly nebudou v jádru kódu, ale
v konfiguraci. Ukázalo se, že ten odhad seděl.</p>

<h2>Nejdřív ověřit, že formátu vůbec rozumím</h2>

<p>Nechtěl jsem stavět na dojmu. Existuje oficiální balíček firmwaru od Seagate
pro tuhle řadu a v něm soubory LOD, které umí rozebrat
<a href="https://github.com/eurecom-s3/hdd_firmware_tools" target="_blank" rel="noopener">parser od skupiny EURECOM S3</a>.
Když se obsah LOD najde v dumpu, znamená to, že mapování mezi balíčkem
a fyzickou pamětí chápu správně.</p>

<pre><code>Artifact 3  type 0x22   0x9f000 B   Flash address &#61; 0xfa0   &lt;- hlavni kod
Artifact 5  type 0x9026 0xd0028 B   Flash address &#61; 0x30
Artifact 9  type 0x1a   0x180 B     &lt;- podpis (384 B)</code></pre>

<p>Obsah Artifactu 3 se v dumpech opravdu našel, a to na téže adrese:</p>

<pre><code>seagate_000A -&gt; posun 0xe0fcc
ibm_6214     -&gt; posun 0xe0fcc      stejny layout
seagate_0007 -&gt; posun 0x10fcc      starsi verze, jiny layout</code></pre>

<p>Novější Seagate dump a IBM dump mají hlavní kód na stejném místě. Ten starší
ne, což je jen připomínka, že layout flash se mezi verzemi firmwaru posouvá.</p>

<h2>Konfigurace není zašifrovaná, je to prostě text</h2>

<p>Kus, kterého jsem si všiml jako prvního, sedí na adrese 0x0e1140. Je to
odpověď na příkaz INQUIRY, uložená tak, jak ji disk pošle na sběrnici:</p>

<pre><code>IBM      9f 00 10 02  &#34;IBM-SSG IBM-SSGSSVJ1P6  6214&#34;  &#34;ZAL...  216214&#34;
Seagate  8b 01 10 02  &#34;SEAGATE ST200FM0133     000A&#34;  &#34;ZAJ...&#34;</code></pre>

<p>Stejná struktura, jiný obsah. To je moment, kdy se hledání změní z luštění
na čtení. Kolem té adresy jsou další záznamy a mají pravidelný tvar:</p>

<pre><code>[id:1][len:2][00 00][id:1][len-4:2][namelen:1][jmeno][data]</code></pre>

<p>Klasické TLV, jen s tím zvláštním rysem, že se identifikátor i délka opakují
podruhé. Toho jsem nakonec využil při psaní parseru jako kontroly: záznam, kde
se druhý výskyt neshoduje s prvním, je špatně zarovnaný a posunu se o bajt dál.</p>

<h2>688 bajtů, které Seagate nemá vůbec</h2>

<p>Pak už je to jednoduché. Vypsal jsem místa, kde má IBM data a Seagate
nepopsanou flash:</p>

<pre><code>0x0e1590 - 0x0e1820   656 B   hlavni blok
0x0e1c70 - 0x0e1c80    16 B
0x0e1f40 - 0x0e1f50    16 B
                      688 B celkem</code></pre>

<p>V tom hlavním bloku jsou čtyři pojmenované záznamy, které v Seagate verzi
nejsou:</p>

<table>
<thead><tr><th>Offset</th><th>ID</th><th>Délka</th><th>Jméno</th></tr></thead>
<tbody>
<tr><td>0x0e15b8</td><td>0xc4</td><td>0x28</td><td>(samé mezery)</td></tr>
<tr><td>0x0e15e4</td><td>0xc7</td><td>0xa0</td><td><code>SCDD</code></td></tr>
<tr><td><strong>0x0e1688</strong></td><td><strong>0xc8</strong></td><td><strong>0xd8</strong></td><td><strong><code>AIX</code></strong></td></tr>
<tr><td>0x0e1760</td><td>0xc9</td><td>0xac</td><td><code>AIX</code></td></tr>
</tbody>
</table>

<p>Jméno <code>AIX</code> mě zarazilo. Je to unixový systém od IBM a v dumpu
disku vypadá jako věc z jiného světa. Vysvětlení je nudné a zároveň pěkné: IBM
si do konfigurace ukládá, jak se disk má chovat ve svých polích, a pojmenovává
si ty záznamy po svých platformách.</p>

<p>Uvnitř záznamu 0xc8 leží block descriptor jako holá data, přesně v tom
tvaru, jaký chodí po sběrnici v odpovědi na MODE SENSE:</p>

<pre><code>0e1690  09 41 49 58 20 20 20 20 20 20 00 00 00 08 b4 a8
0e16a0  0a 58 00 00 02 10 ...
        &#34;AIX      &#34;         b4a80a58      000210
                            3030911576    528</code></pre>

<p>Počet logických bloků a délka bloku. Tohle je to místo. Ne kus kódu, který by
kontroloval, co po disku chci, ale záznam v datech, ze kterého si firmware
při startu bere výchozí geometrii.</p>

<h2>Katalog záznamů to potvrzuje</h2>

<p>Aby to nebyla náhoda, hledal jsem druhé doložení. Konfigurační blok má index,
seznam identifikátorů záznamů, které v něm mají být:</p>

<pre><code>IBM      ... c0 c1 c3 [c4 c7 c8 c9] d1 d2 00     21 polozek
Seagate  ... c0 c1 c3               d1 d2 00     17 polozek</code></pre>

<p>Přesně ta čtyři ID navíc, o která jde. Rozdíl tedy není v tom, že by
Seagate ty záznamy měl a nechal je prázdné. Nezná je vůbec.</p>

<p>Sedí i třetí věc. Hlavička bloku začíná magickým řetězcem <code>yqnI</code>
a hned za ním je délka:</p>

<pre><code>0x0e1130   79 71 6e 49 | f0 06 | 79 9a | ff 00 a4 00 00 00 06 32    IBM
0x0e1130   79 71 6e 49 | 60 04 | ab 93 | ff 00 90 00 00 00 06 12    Seagate
           magic &#34;yqnI&#34;  delka  soucet
                         1776 B
                         1120 B</code></pre>

<p>Rozdíl obou délek je 656 bajtů, tedy přesně velikost hlavního bloku, který má
IBM navíc. Tím jsem si potvrdil, jak se to pole čte, a mimochodem i to, že se
při zápisu bude muset přepočítat.</p>

<h2>Kontrolní součet: součet slov přes celý blok musí dát nulu</h2>

<p>Zbývalo pole <code>79 9a</code>, respektive <code>ab 93</code>. Že je to
kontrolní součet, se dá odhadnout z polohy. Horší je uhodnout algoritmus, a
zkoušet CRC naslepo je ztráta času. Našel jsem to jinde: na
<a href="https://forum.hddguru.com/viewtopic.php?f&#61;13&amp;t&#61;28252" target="_blank" rel="noopener">fóru hddguru</a>
někdo před lety rozebíral formát LOD a otiskl tam funkci <code>GETSUMM</code>
napsanou v REXXu.</p>

<blockquote><p>Sečti šestnáctibitová slova v pořadí little endian přes celý blok
včetně samotného pole kontrolního součtu. Výsledek musí být nula.</p></blockquote>

<p>Sedí to všude, kam jsem se podíval:</p>

<pre><code>IBM konfig blok  &#64;0x0e1130, delka 0x06f0  -&gt;  soucet 0x0000  OK
SGA konfig blok  &#64;0x0e1130, delka 0x0460  -&gt;  soucet 0x0000  OK
vsechny LOD hlavicky                      -&gt;  soucet 0x0000  OK</code></pre>

<p>Když je to takhle jednoduché, dá se součet po úpravě dat dopočítat jedním
odečtením. Žádná tabulka, žádný polynom.</p>

<h2>Patch má sedm bajtů</h2>

<p>Zbytek je mechanika. Skript najde magic <code>yqnI</code>, projde záznamy,
v tom pojmenovaném <code>AIX</code> přepíše block descriptor a dopočítá součet:</p>

<pre><code>python tools/patch_ibm_lock.py vlastni_dump.bin vystup.bin --mode blocksize --blocks 3125627568</code></pre>

<p>Změní se sedm bajtů:</p>

<pre><code>0x0e1136-0x0e1137   kontrolni soucet  0x9a79 -&gt; 0xad33
0x0e169e-0x0e16a1   pocet bloku       b4a80a58 -&gt; ba47d3b0   (3 125 627 568)
0x0e16a5            velikost sektoru  0x10 -&gt; 0x00           (528 -&gt; 512)</code></pre>

<p>Nový počet bloků není odhad, je to hodnota z tabulky formátů v produktovém
manuálu Seagate pro tenhle model. Kapacita zůstává na 1600,32 GB, protože těch
16 bajtů metadat si disk bere z interní rezervy, ne z uživatelského prostoru.</p>

<h2>Dump musí být z vlastního disku</h2>

<p>Jedna věc, na kterou při čtení fór narazíte pozdě, a mohla by stát disk.
Konfigurační blok obsahuje sériové číslo a kalibrační data konkrétního kusu.
Nahrát cizí dump na svůj disk znamená přepsat mu identitu identitou někoho
jiného, a co udělá kalibrace z jiné NAND, netuším.</p>

<p>Postup je proto takový, že se ten cizí dump použije jedině jako předloha
k pochopení formátu:</p>

<ol>
<li>odpájet paměť z vlastního disku (WSON-8, 8 krát 6 mm, u konektoru SAS),</li>
<li>vyčíst ji programátorem, a to dvakrát, se srovnáním otisků,</li>
<li>pustit patcher na vlastním dumpu,</li>
<li>zapsat zpět a ověřit čtením.</li>
</ol>

<h2>Co jsem neudělal</h2>

<p>Nezapsal jsem to. Nemám programátor ani horkovzduch a rozebírat kvůli tomu
zdravý disk mi zatím za to nestojí. Všechno výše je tedy rozbor a nástroj, ne
provedená oprava. Ukázkové výstupy, které mám, vznikly z cizího dumpu a slouží
k ověření patcheru, ne k nahrání do disku.</p>

<p>Zůstává i jedna věcná neznámá, kterou se nedá zjistit jinak než zápisem:
jestli si firmware konfigurační blok ověřuje ještě něčím kromě toho kontrolního
součtu. Podpis by byl konec cesty. Že by tam byl, nic nenaznačuje, ale
nenaznačuje ani opak, a to je rozdíl, který se v textu o vlastní práci má
napsat rovnou.</p>

<p>Co z toho beru jako přenositelné: u zamčené konfigurace se vyplatí napřed
hledat rozdíl proti nezamčenému kusu, ne se hrabat v kódu. Konfigurace bývá
uložená čitelně, protože ji firmware musí umět rychle přečíst. A kontrolní
součet, který nad ní stojí, se skoro nikdy nedělá složitě.</p>

<h2>Kód a podklady</h2>
<p>Všechno, na čem tenhle text stojí, je ve veřejném repozitáři <a href="https://github.com/nks-hub/st1600fm0013-528b-sectors" rel="noopener" target="_blank">st1600fm0013-528b-sectors</a> – skripty, zálohy firmwaru i rozbory, které se do článku nevešly.</p>
<ul>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/tools/dump_config_block.py" rel="noopener" target="_blank"><code>tools/dump_config_block.py</code></a> – vytáhne konfigurační blok z dumpu</li>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/tools/diff_config_records.py" rel="noopener" target="_blank"><code>tools/diff_config_records.py</code></a> – porovná TLV záznamy dvou disků</li>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/tools/patch_ibm_lock.py" rel="noopener" target="_blank"><code>tools/patch_ibm_lock.py</code></a> – přepíše těch sedm bajtů a dopočítá kontrolní součet</li>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/README_CZ.md" rel="noopener" target="_blank"><code>README_CZ.md</code></a> – celý postup od dumpu po patch</li>
</ul>

<h2>Zdroje</h2>

<ul>
<li><a href="https://forums.servethehome.com/index.php?threads/how-to-reformat-hdd-ssd-to-512b-sector-size.4968/page-28" target="_blank" rel="noopener">Serve The Home, vlákno 4968, strana 28</a> – dumpy SPI flash a jejich popis od lidí, kteří je pořídili</li>
<li><a href="https://forum.hddguru.com/viewtopic.php?f&#61;13&amp;t&#61;28252" target="_blank" rel="noopener">hddguru, rozbor formátu LOD</a> – funkce <code>GETSUMM</code></li>
<li><a href="https://github.com/eurecom-s3/hdd_firmware_tools" target="_blank" rel="noopener">eurecom-s3/hdd_firmware_tools</a> – parser LOD souborů</li>
<li><a href="https://www.seagate.com/content/dam/seagate/migrated-assets/www-content/product-content/ssd-fam/1200-ssd/en-us/docs/1200-2-sas-ssd-product-manual-100773817d.pdf" target="_blank" rel="noopener">Seagate 1200.2 SAS SSD Product Manual 100773817 Rev. D</a> – tabulka podporovaných formátů</li>
</ul>]]></content>
		<category term="Linux" />
	</entry>
	<entry>
		<title>Nový kernel jsem vyzkoušel proti fyzickému disku bez restartu serveru</title>
		<id>https://lury.cz/kernel-528-sektory-test-v-qemu-a14</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/kernel-528-sektory-test-v-qemu-a14" />
		<updated>2026-08-28T16:31:02+02:00</updated>
		<published>2026-08-28T15:49:43+02:00</published>
		<summary>Cizí patch do ovladače sd bez hlavičky a&amp;nbsp;bez stopy na internetu cílil na jádro, které nikdy neexistovalo. Popisuju, jak jsem ho posoudil, doportoval na 6.8 a&amp;nbsp;vyzkoušel proti fyzickému disku v&amp;nbsp;QEMU, aniž bych restartoval server.</summary>
		<content type="html"><![CDATA[<p>Disk s 528bajtovými sektory nejde v Linuxu použít. Blokové vrstvě nesedí
velikost bloku, která není mocninou dvou, takže zařízení skončí s nulovou
velikostí a nic přes něj neproteče. Když se firmware odemknout nedaří, zbývá
obejít ho v ovladači: číst a zapisovat celé 528bajtové sektory a hostu ukazovat
prvních 512 bajtů z každého.</p>

<p>Někdo takový patch napsal a mně se dostal do ruky. Nedalo se ale poznat, kdo
ho psal ani jestli ho někdy někdo přeložil. Tenhle text je o dvou věcech, které
z toho vzešly a hodí se i jinde: jak posoudit cizí kernelový patch neznámého
původu a jak nový kernel vyzkoušet proti fyzickému disku, aniž bych restartoval
stroj, ve kterém ten disk sedí.</p>

<p>Proč jsem tu byl a co dalšího jsem na těch discích zkoušel, popisuju v článku <a href="/velikost-sektoru-zamkl-vyrobce-disku-a15">Velikost sektoru zamkl výrobce disku, ne značka na štítku</a>.</p>

<h2>Co jsem dostal a co o tom šlo zjistit</h2>

<p>Dva soubory. Unified diff proti <code>drivers/scsi/sd.c</code>
a <code>drivers/scsi/sd.h</code>, 605 přidaných řádků a 6 odebraných, plus
pythoní skript, který ten patch přenáší na jiné verze jádra. Cílová cesta
v tom skriptu je <code>patches/kernel/9999-wvg-sd-528-translation.patch</code>,
což je konvence Proxmoxu. To byla jediná stopa k prostředí, ze kterého to
pochází.</p>

<p>Jinak nic. Patch nemá hlavičku, chybí <code>Signed-off-by</code>, autor,
copyright i řádek SPDX. Jeho identifikátory jsem hledal na internetu a nenašel
ani jeden, ani v gitu jádra, ani na LKML, ani na GitHubu. Časová razítka v diffu
ukazují na únor a duben 2026.</p>

<p>Kód přitom působí kompetentně. Převody dělá přes <code>DIV_ROUND_UP</code>,
ne bitovým posunem, což je u 528 nutnost, protože to mocnina dvojky není.
Odkládací buffery bere z předalokovaného mempoolu, takže se v cestě I/O nic
nealokuje. Má ošetřené chyby a stropy na velikost požadavku i hloubku fronty.
A správně nuluje <code>protection_type</code>, protože těch 16 bajtů navíc není
ochrana T10 PI, ale metadata diskového pole.</p>

<p>Dobře napsaný kód ale není důkaz, že se ten kód někdy překládal.</p>

<h2>Kontext, který v jádře neexistuje</h2>

<p>Aplikace na čistou 6.8 skončila takhle:</p>

<pre><code>sd.c   10 ze 13 hunku sedi, 3 selhaly (#1, #9, #10)
sd.h    3 ze 3 hunku sedi</code></pre>

<p>Deset hunků prošlo hlavně proto, že <code>patch</code> toleruje posun.
Zajímavé byly ty tři, které neprošly. Hunk 9 očekává v kontextových řádcích
tohle:</p>

<pre><code>	if (!scsi_device_online(sdp))
		goto out;

	lim &#61; kmalloc(sizeof(*lim), GFP_KERNEL);
	if (!lim)
		goto out;</code></pre>

<p>A hunk 10 pak sahá na <code>lim-&gt;max_dev_sectors</code>, tedy přes ukazatel.
Stáhl jsem si originály <code>sd.c</code> pro tagy v6.8 až v6.14 a spočítal
výskyty:</p>

<table>
<thead><tr><th>Jádro</th><th><code>lim &#61; kmalloc</code></th><th><code>lim-&gt;max_dev_sectors</code></th><th><code>lim.max_dev_sectors</code></th><th><code>struct queue_limits lim;</code></th></tr></thead>
<tbody>
<tr><td>6.8 až 6.10</td><td>0</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td>6.11 až 6.14</td><td>0</td><td>0</td><td>1</td><td>4</td></tr>
</tbody>
</table>

<p>Do 6.10 včetně tam žádné <code>queue_limits</code> nejsou vůbec. Od 6.11 už
ano, ale jako lokální proměnná na zásobníku, ke které se přistupuje tečkou, ne
šipkou, a nikde se nealokuje. Patch tedy cílí na strom, který v upstreamu nikdy
nebyl.</p>

<p>Přiložený rebase skript to nezachránil, protože spadl hned na první
kontrole:</p>

<pre><code>ERROR: sd_revalidate_disk: expected one function definition, found 0</code></pre>

<p>Dohromady to znamená kód, který nikdy neprošel překladem. Kdyby ho autor
zkompiloval, na tenhle rozpor by narazil při prvním pokusu. Není to důkaz, že je
patch špatný. Je to důkaz, že je neověřený, a to jsou dvě různé věci.</p>

<h2>Doportování na 6.8</h2>

<p>Tři místa a tři různé opravy:</p>

<table>
<thead><tr><th>Místo</th><th>Co bylo potřeba</th></tr></thead>
<tbody>
<tr><td><code>sd_disable_advanced_block_ops()</code></td><td>brala <code>lim</code> a sahala na <code>lim-&gt;max_discard_sectors</code>; přepsáno na <code>blk_queue_max_discard_sectors(q, 0)</code> a <code>blk_queue_max_write_zeroes_sectors(q, 0)</code>, upraveno i volající místo</td></tr>
<tr><td>hunk 9</td><td>volání <code>sd_528_limit_queue_depth()</code> přesunuto před <code>buffer &#61; kmalloc(SD_BUF_SIZE, ...)</code></td></tr>
<tr><td>hunk 10</td><td><code>lim-&gt;max_dev_sectors</code> na <code>q-&gt;limits.max_dev_sectors</code>, totéž u <code>max_segments</code></td></tr>
</tbody>
</table>

<h2>Past, na kterou jsem naletěl dvakrát</h2>

<p>Skript, který ty tři hunky dopisuje, si musí umět ověřit, že už doběhl.
Napsal jsem to takhle:</p>

<pre><code>if &#34;sd_528_effective_max_sectors&#34; in text:
    return &#34;uz aplikovano&#34;</code></pre>

<p>Vypadá to nevinně a je to špatně. Ten symbol totiž do souboru přichází už
s hunkem 1, který prošel obyčejným <code>patch</code>em o krok dřív. Kontrola
tedy hlásila hotovo i ve chvíli, kdy hunk 10 hotový nebyl, a já pak dlouho
hledal, proč se překlad chová, jako by mé úpravy vůbec nebyly v souboru.
Napodruhé jsem na to naletěl znovu, protože jsem tu podmínku opravil jinde
a tady zapomněl.</p>

<p>Správně se kontroluje symbol, který přijde <strong>jedině</strong> s tím
hunkem, který zrovna aplikuju. U hunku 10 je to <code>emu_cap</code>. Obecné
pravidlo z toho je krátké: u skriptovaného patchování musí být příznak
„už aplikováno“ vázaný na tu jednu změnu, ne na cokoli, co s ní přišlo do
souboru.</p>

<h2>Testovat nový kernel na stroji, který se nesmí restartovat</h2>

<p>Ovladač <code>sd</code> je v tom systému zabudovaný napevno, ne jako modul,
takže ho nejde vyměnit za běhu. A hostitel se restartovat nesměl. To vypadá
jako slepá ulička, ale není: fyzický disk se dá do virtuálky pustit celý.</p>

<pre><code>qemu-system-x86_64 -enable-kvm -m 2048 -smp 2 -nographic -no-reboot \
  -kernel /usr/src/k/linux-6.8/arch/x86/boot/bzImage \
  -initrd /tmp/qinitrd.gz \
  -append &#34;console&#61;ttyS0 sd_mod.emulate_512_from_fat_sectors&#61;1&#34; \
  -device virtio-scsi-pci,id&#61;scsi0 \
  -drive file&#61;/dev/sg2,if&#61;none,id&#61;d0,format&#61;raw \
  -device scsi-generic,drive&#61;d0,bus&#61;scsi0.0</code></pre>

<p>Podstatné je <code>scsi-generic</code>. Příkazy SCSI z virtuálky jdou rovnou
na fyzické zařízení, takže testovaný ovladač mluví se skutečným diskem, ne
s emulací. Hostitelské jádro do toho nemluví a běží dál. Initramfs stačí
postavit z busyboxu, není v něm potřeba nic než shell a pár nástrojů.</p>

<p>Tenhle postup se hodí i mimo tenhle případ. Kdykoli potřebujete zkusit
ovladač proti konkrétnímu kusu hardwaru na stroji, který nemůžete odstavit,
je to nejlevnější cesta.</p>

<h2>Výsledky</h2>

<p>Nejdřív kontrolní běh s vypnutou emulací, aby bylo vidět, že měřím to, co si
myslím:</p>

<pre><code>emulate_512_from_fat_sectors&#61;0
    sda: velikost&#61;0        physical_bs&#61;4224     dd -&gt; 0 records

emulate_512_from_fat_sectors&#61;1
    sd 0:0:0:0: [sda] Attached SCSI disk
    sda: 3030911576 bloku  logical_bs&#61;512  physical_bs&#61;512  -&gt;  1445 GB
    dd -&gt; 1&#43;0 records in/out</code></pre>

<p>Pak zápis a zpětné čtení na třech místech, která se od sebe liší tím, jak
padnou do vnitřního dělení:</p>

<table>
<thead><tr><th>Test</th><th>Výsledek</th></tr></thead>
<tbody>
<tr><td>zarovnaný zápis 32 kB na LBA 1000</td><td>otisk sedí</td></tr>
<tr><td>nezarovnaný zápis 17 sektorů na LBA 2049</td><td>sedí</td></tr>
<tr><td>1 MB přes hranici 64kB chunku na LBA 10240</td><td>otisk sedí</td></tr>
</tbody>
</table>

<p>Otisky sedící samy se sebou ale nedokazují tolik, kolik to vypadá. Kdyby
emulace ukládala data soustavně o kus vedle, čtení touž cestou by se s ní
zmýlilo stejně. Proto ten poslední krok, který mě na celé práci potěšil
nejvíc: data zapsaná ve virtuálce přes emulované 512bajtové zařízení jsem
přečetl z hostitele nativně jako 528bajtový sektor.</p>

<pre><code>sg_raw -r 528 -o out.bin /dev/sg2 28 00 00 00 03 e8 00 00 01 00

emulace v QEMU:    3b 0f a4 56 af f2 0e 24 c8 c9 87 4b a2 e2 6f 29
nativne na disku:  3b 0f a4 56 af f2 0e 24 c8 c9 87 4b a2 e2 6f 29
                   25 24 02 a8 c3 21 4d d3 96 c4 7f 4b b9 50 4a 53
metadata[512:528]: same nuly</code></pre>

<p>Bajty jsou fyzicky na správném místě ve správných sektorech a 16 bajtů
metadat je vynulovaných. Disk po všech testech hlásí zdraví v pořádku, nula
vadných sektorů a velikost bloku beze změny 528 bajtů.</p>

<h2>Slepá ulička: shim v userspace</h2>

<p>Než jsem se pustil do jádra, zkusil jsem to jednodušeji. Plugin pro nbdkit,
který totéž přepočítávání dělá nad síťovým blokovým zařízením, se napíše za
odpoledne a nepotřebuje překládat kernel.</p>

<p>První verze běžela 4,7 MB/s. Přepočítávala bajt po bajtu v Pythonu, což byla
hloupost, kterou jsem si měl uvědomit dřív, než jsem to spustil. Po přepsání na
práci s řezy vyskočila na 118 MB/s. To už je použitelné číslo, jenže nativní
přístup k témuž disku dává kolem 390 MB/s, takže by se za pohodlí platilo dvěma
třetinami výkonu. Plus vrstva navíc v cestě dat, kterou by bylo potřeba
provozovat a hlídat. Zamítl jsem to.</p>

<h2>Co to stojí a co jsem neudělal</h2>

<p>Cena emulace je 16 bajtů z každého sektoru: <strong>1,55 TB místo 1,60 TB</strong>
na disk, tedy kolem 388 GB ze všech osmi dohromady. </p>

<p>Co se tím naopak nezmění, je rychlost linku – a stojí za to říct proč,
protože se to nabízí jako první nápad. Řadič nabízí 12 Gb/s
(<code>maximum_linkrate</code> hlásí 12.0 Gbit), ale disk se domluví na 6 a tam
zůstane. Ptal jsem se přímo jeho: stránka 19h/01h „Phy control and discover“
vrací u obou phy v bajtu 33 hodnotu <code>0xaa</code>, tedy hardwarové maximum
<strong>6 Gb/s</strong>. Strop nesedí v kabeláži ani v řadiči, ale ve firmwaru
disku, a jádro s ním nezmůže nic.</p>

<p>Druhý port by nepomohl taky ne, i když disky jsou dual-port. V SAS se rychlost
vyjednává na každé phy zvlášť, takže druhá linka přidá redundanci a součet
propustnosti – ne vyšší rychlost jednoho spoje. Rozepsal jsem to zvlášť
v <a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/linkrate-6g-analysis_CZ.md" rel="noopener" target="_blank">rozboru rychlosti linku</a>.</p>

<p>A hlavně: <strong>ostrá data na tom zatím nemám a mít nebudu, dokud
neproběhne pořádné testování.</strong> Testy výše byly krátké a záměrně mířené
na hranice dělení, ne na výdrž. Než na tom něco poběží, chce to <code>fio</code>
s verifikací přes několik hodin, <code>badblocks -w</code> na celý disk, test
se souborovým systémem včetně kontroly po odpojení a odpověď na otázku, co
udělá výpadek napájení uprostřed zápisu. Šest set řádků v cestě DMA se
neprojeví hláškou, ale tichým poškozením dat.</p>

<p>Emulace navíc zahazuje metadata, ze kterých si diskové pole počítá vlastní
kontrolu integrity. Disk pak už pole konzistentní nepřipadá. Pro mě to nevadí,
používám ho jako obyčejné blokové zařízení, ale zpátky do pole by ten disk už
neměl co dělat.</p>

<h2>Kód a podklady</h2>
<p>Všechno, na čem tenhle text stojí, je ve veřejném repozitáři <a href="https://github.com/nks-hub/st1600fm0013-528b-sectors" rel="noopener" target="_blank">st1600fm0013-528b-sectors</a> – skripty, zálohy firmwaru i rozbory, které se do článku nevešly.</p>
<ul>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/kernel-patch/ORIGIN_CZ.md" rel="noopener" target="_blank"><code>kernel-patch/ORIGIN_CZ.md</code></a> – odkud patch je a jak jsem si ho ověřil</li>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/kernel-patch/port_to_68.py" rel="noopener" target="_blank"><code>kernel-patch/port_to_68.py</code></a> – doportování na API 6.8</li>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/kernel-patch/RESULTS_CZ.md" rel="noopener" target="_blank"><code>kernel-patch/RESULTS_CZ.md</code></a> – výsledky měření</li>
<li><a href="https://github.com/nks-hub/st1600fm0013-528b-sectors/blob/master/tools/sector528_shim.py" rel="noopener" target="_blank"><code>tools/sector528_shim.py</code></a> – zamítnutý shim v userspace</li>
</ul>

<h2>Zdroje</h2>

<ul>
<li><a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/scsi/sd.c?h&#61;v6.8" target="_blank" rel="noopener"><code>drivers/scsi/sd.c</code> ve v6.8</a> – strom, proti kterému se patch ověřoval</li>
<li><a href="https://www.qemu.org/docs/master/system/qemu-block-drivers.html" target="_blank" rel="noopener">QEMU: block drivers</a> – dokumentace k obrazům a průchozím zařízením</li>
<li><a href="https://libguestfs.org/nbdkit.1.html" target="_blank" rel="noopener">nbdkit(1)</a> – rámec, ve kterém vznikl zamítnutý shim</li>
</ul>]]></content>
		<category term="Linux" />
	</entry>
	<entry>
		<title>Windows 10 – Krok zpět?</title>
		<id>https://lury.cz/windows-10-krok-zpet-a9</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/windows-10-krok-zpet-a9" />
		<updated>2026-08-28T16:50:16+02:00</updated>
		<published>2014-10-18T09:00:00+02:00</published>
		<summary>Neodolal jsem a vyzkoušel jsem preview verzi Windows 10 Preview. Po instalaci jsem si nemohl nevšimnout toho, že to vypadá na první pohled úplně stejně jako Windows 8.1 dokonce po propojení s Windows Live účtem se mi nastavily stejné barvy. Tak jsem začal proklikávat a srovnávat…</summary>
		<content type="html"><![CDATA[<p>Neodolal jsem a vyzkoušel jsem preview verzi Windows 10 Preview.<br />
Po instalaci jsem si nemohl nevšimnout toho, že to vypadá na první pohled úplně stejně jako Windows 8.1 dokonce po propojení s Windows Live účtem se mi nastavily stejné barvy. Tak jsem začal proklikávat a srovnávat a musím říct, že jsem vcelku zklamaný..<br />
Pochopím hejty ze strany srovnávání s Windows 7, mé první dojmy z Windows 8 byly podobné, prostě to vše kolem chybějícího startu a nového metra atp.. Ale když nad tím člověk tak přemýšlí (konkrétně v mém případě), jediná položka kterou jsem v sedmičkovém startu využil byl „Tento počítač“ a zbytek jsem řešil podobným způsobem jako funguje Spotlight v OSX a to tak, že prostě napíšu co chci otevřít a dám enter..<br />
Už v době XP jsem toto využíval formou okna „Spustit“ (WinKey R), takže v otázce metro vs. start pro mě tak veliký a zásadní problém nebyl, spíš ta averze byla v předsudcích a hlavně v tom že první setkání bylo Windows 8.0, které stálo opravdu za prd 🙂<br />
To ale teď nebudeme řešit..</p>
<p>Pojďme na hlavní body, které mě vcelku šokovaly a upřímně doufám, že to ještě Microsoft pořádně dochytá a vylepší..</p>

<h3>1) Ikonky</h3>
<p>Je hezké, že se vše ubírá směrem flat designu ale myslím si, že by se to dohromady míchat nemělo, působí to trochu kýčovitě.</p>
<figure id="attachment_157" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Screenshot-5.png"><img class="wp-image-157 size-thumbnail" src="/lury/articles/e7/screenshot-5-150x150.png" alt="Kombinace Flat a 3D ikon" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">Kombinace Flat a 3D ikon</figcaption>
			</figure>
<h3>2) WinKey &#43; E a Tento počítač</h3>
<p>Vcelku mi vadí absence položky Tento počítač v start menu, když už se vrátila nabídka start. A když jsem se naučil využívat kombinaci WinKey &#43; E tak Win10 zavede home složku která podle mě postrádá smysl nebo spíše opět mění zažité standardy a ztěžuje jednoduché postupy.<br />
Ano do home složky si dám např. místní disk ale co například budoucí Flash nebo USB disk? Proč z toho dělat balast a na co dvě home složky? (c:\users\uzivatel vs. Home). Na screenshotu níže, jsem si přidal tento počítač a místní disk právě do Home složky.</p>
<p>Musím opravdu udělat jeden klik navíc?</p>
<figure id="attachment_157" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Screenshot-5.png"><img class="wp-image-157 size-thumbnail" src="/lury/articles/e7/screenshot-5-150x150.png" alt="WinKey &#43; E - Windows 10" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">WinKey &#43; E – Windows 10</figcaption>
			</figure>
<figure id="attachment_168" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Snímek-obrazovky-3.png"><img class="wp-image-168 size-thumbnail" src="/lury/articles/63/sn-mek-obrazovky-3-150x150.png" alt="WinKey &#43; E - Windows 8" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">WinKey &#43; E – Windows 8</figcaption>
			</figure>
<h3>3) Fullscreen metro aplikace</h3>
<p>První šok přišel ve chvíli spuštění metro aplikace, která se spustila v docela nevzhledné podobě v okně. Dle mého názoru to úplně rozbíjí celistvost Metro UI tak jak ji známe z Windows 8.<br />
Po chvilce hledání jsem našel volbu kde přepnout nabídku start na Metro UI z Windows 8 nicméně metro aplikace se tak nezačaly chovat a pořád se spouští v oknech.<br />
Windows 10 sice nabízí možnost přepnutí aplikace do fullscreenu ale přepne pouze jednu aplikaci nikoliv všechny ostatní jako default nastavení, což bych očekával právě v případě přepnutí nastavení nabídky start na Metro UI.</p>
<figure id="attachment_156" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Screenshot-4.png"><img class="wp-image-156 size-thumbnail" src="/lury/articles/de/screenshot-4-150x150.png" alt="To jako really???" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">To jako really???</figcaption>
			</figure>
<figure id="attachment_166" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Screenshot-14.png"><img class="size-thumbnail wp-image-166" src="/lury/articles/a4/screenshot-14-150x150.png" alt="FullScreen mod Metro UI aplikace" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">FullScreen mod Metro UI aplikace</figcaption>
			</figure>
<h3>4) Grafické faily</h3>
<p>Grafikovi z Microsoftu zřejmě ujela ruka o jeden pixel na X tlačítku na zavření okna. Je to malinko jako pěst na oko 🙂 A ty stíny jako hezké ale decentnější by asi vypadaly daleko lépe.</p>
<figure id="attachment_172" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/W4vHA6P1.png"><img class="wp-image-172 size-thumbnail" src="/lury/articles/53/w4vha6p1-150x150.png" alt="Pixel v rámečku tlačítka na zavření" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">Pixel v rámečku tlačítka na zavření</figcaption>
			</figure>
<figure id="attachment_158" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Screenshot-6.png"><img class="wp-image-158 size-thumbnail" src="/lury/articles/b8/screenshot-6-150x150.png" alt="Stín pod oknem" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">Stín pod oknem</figcaption>
			</figure>
<h3>5) Virtuální plochy</h3>
<p>Virtuální plochy jsou v preview verzi opravdu preview,jejich využití je zbytečně složité a nenotorné oproti linuxovému prostředí</p>
<p>GNOME nebo i KDE, kde jsou jasné viditelné náhledy všech ploch přímo na liště a je jasné na které momentálně jste. Zobrazení virtuálních ploch se aktivuje tlačítkem na start liště nebo kombinací kláves WinKey &#43; TAB<br />
Virtuální plochy se mi tedy v tomto případě moc nepodařilo dostat pod kůži jako v případě Linuxu.</p>
<figure id="attachment_160" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Screenshot-8.png"><img class="wp-image-160 size-thumbnail" src="/lury/articles/0a/screenshot-8-150x150.png" alt="Zobrazení nabídek na virtuální ploše" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">Zobrazení nabídek na virtuální ploše</figcaption>
			</figure>
<figure id="attachment_159" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Screenshot-7.png"><img class="wp-image-159 size-thumbnail" src="/lury/articles/4c/screenshot-7-150x150.png" alt="Prázdná virtuální plocha" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">Prázdná virtuální plocha</figcaption>
			</figure>
<h3>6) Metro UI vs. Nabídka start</h3>
<p>K tomuhle bodu konkrétně nemám výtku, protože je tu možnost to přepnout. Jen uvádím pár screenů, v případě Metro UI není na první pohled žádná znatelná změna.</p>

<figure id="attachment_154" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Screenshot-2.png"><img class="size-thumbnail wp-image-154" src="/lury/articles/c1/screenshot-2-150x150.png" alt="První view nabídky start" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">První view nabídky start</figcaption>
			</figure>
<figure id="attachment_163" class="wp-caption thumbnail alignleft">
				<a class href="http://lury.cz/wp-content/uploads/2014/10/Screenshot-11.png"><img class="size-thumbnail wp-image-163" src="/lury/articles/43/screenshot-11-150x150.png" alt="Vyhledávání v nabídce start alá Windows 7" width="150" height="150" /></a>
				<figcaption class="wp-caption-text">Vyhledávání v nabídce start alá Windows 7</figcaption>
			</figure>
<h3>Závěr</h3>
<p>Jsem mírně rozpačitý a nespokojený s tímto krokem „vpřed“. Nicméně pořád je to preview verze takže tuto recenzi je třeba brát s nadhledem a doufat že tyto nedostatky nezůstanou zapomenuty. Cením si toho, že se počítá s jedním systémem na všechny typy zařízení, nicméně myslím že je ještě dlouhá cesta do finále tak se nechme překvapit 🙂</p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>]]></content>
		<category term="Windows" />
	</entry>
	<entry>
		<title>Chatujme.cz má vlastní online rádio</title>
		<id>https://lury.cz/chatujme-cz-ma-vlastni-online-radio-a10</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/chatujme-cz-ma-vlastni-online-radio-a10" />
		<updated>2026-08-28T16:50:16+02:00</updated>
		<published>2014-10-09T09:00:00+02:00</published>
		<summary>6. října 2014 jsme spustili vlastní rádio. Naše rádio nyní najdete na adrese radiochatujme.cz RadioChatujme.cz vysílá nonstop hudbu do celého světa, ale zejména pro uživatele portálu www.chatujme.cz. Vysílá i online vstupy mluveného slova zejména ve večerních hodinách, kdy mají…</summary>
		<content type="html"><![CDATA[<p>6. října 2014 jsme spustili vlastní rádio. Naše rádio nyní najdete na adrese <a href="http://radiochatujme.cz" target="_blank">radiochatujme.cz</a></p>
<p>RadioChatujme.cz vysílá nonstop hudbu do celého světa, ale zejména pro uživatele portálu www.chatujme.cz.</p>
<p>Vysílá i online vstupy mluveného slova zejména ve večerních hodinách, kdy mají možnost posluchači a uživatelé portálu volat své dotazy, vzkazy, náměty, připomínky a rozhovory přímo do vysílání na skype rádia. Skype kontakt rádia si můžete uložit do kontaktů ve svém skype. Kontakt na Skype rádia je radiochatujme.cz</p>
<p>Posluchači a uživatelé mají možnost se podílet na koncepci a programové skladbě rádia tím, že sdělí svoje názory či návrhy. Na základě toho je pak možné uzpůsobit vysílání zájmům většiny.</p>
<p> </p>
<p>Podělit se o Vaše názory můžete několika způsoby:</p>

<p> </p>
<ol>
<li>Napsat pomocí vzkazníku na portálu www.chatujme.cz</li>
<li>Pomocí zprávy na webu rádia www.radiochatujme.cz</li>
<li>Zavolat na skype našeho rádia radiochatujme.cz</li>
<li>Na facebooku rádia www.facebook.com/radiochatujme.cz</li>
</ol>
<p>Informace, novinky a co se děje na našem internetovém rádiu najdete na:</p>
<ol>
<li>Webových stránkách rádia www.radiochatujme.cz</li>
<li>Na Facebooku rádia www.facebook.com/radiochatujme.cz</li>
</ol>
<p>Poslouchat RadioChatujme.cz lze několika způsoby:</p>
<ol>
<li>Napsat pomocí <a href="http://vzkazy.chatujme.cz/" target="_blank">vzkazníku</a> na portálu <a href="http://chatujme.cz/" target="_blank">chatujme.cz</a></li>
<li>Pomocí zprávy na webu rádia <a href="http://www.radiochatujme.cz/" target="_blank">RadioChatujme.cz</a></li>
<li>Zavolat na skype našeho rádia <strong>RadioChatujme.cz</strong></li>
<li>Na facebooku rádia <a href="http://www.facebook.com/radiochatujme.cz" target="_blank" rel="nofollow">Facebook.com/RadioChatujme.cz</a></li>
</ol>
<p>Informace, novinky a co se děje na našem internetovém rádiu najdete na:</p>

<ol>
<li>Webových stránkách rádia <a href="http://www.radiochatujme.cz/" target="_blank">RadioChatujme.cz</a></li>
<li>Na Facebooku rádia <a href="https://www.facebook.com/radiochatujme.cz" target="_blank" rel="nofollow">Facebook.com/RadioChatujme.cz</a></li>
</ol>
<p>Poslouchat RadioChatujme.cz lze několika způsoby:</p>
<ol>
<li><a href="http://www.radionomy.com/en/radio/radiochatujmecz/index" target="_blank" rel="nofollow">Rádiová stanice</a></li>
<li> Z webu <a href="http://www.radiochatujme.cz/" target="_blank">RadioChatujme.cz</a></li>
<li>Multimediální přehrávače jako např. Mediaplayer, iTunes, VLC, Winamp atd. pomocí <a href="http://listen.radionomy.com/radiochatujmecz.m3u" target="_blank" rel="nofollow">streamu</a> našeho rádia</li>
<li> Naladíte si nás také v internetových rádiích i na mobilních přístrojích.</li>
</ol>
<p>Pro mobilní telefony a tablety lze stáhnout aplikaci podle platformy Vašeho přístroje např. <a href="https://play.google.com/store/apps/developer?id&#61;Radionomy&amp;hl&#61;cs" target="_blank" rel="nofollow">Android</a>, <a href="https://itunes.apple.com/fr/app/radionomy/id465042448" target="_blank" rel="nofollow">Apple</a>, WindowsMobile</p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>	]]></content>
		<category term="Chatujme.cz" />
	</entry>
	<entry>
		<title>Chatujme.cz vs Chatujeme.cz</title>
		<id>https://lury.cz/chatujme-cz-vs-chatujeme-cz-a4</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/chatujme-cz-vs-chatujeme-cz-a4" />
		<updated>2026-08-28T16:50:15+02:00</updated>
		<published>2014-04-02T09:00:00+02:00</published>
		<summary>Podle statistik vyhledávání za posledních pár dní jsem přišel na to, že nás hledáte hodně pod klíčovým slovem Chatuj e me.cz a bohužel Seznam vyhledávač nás takto nenajde. Proto bych rád uvedl na pravou míru, že nejsme Chatujeme.cz ale pouze…</summary>
		<content type="html"><![CDATA[<p>Podle statistik vyhledávání za posledních pár dní jsem přišel na to, že nás hledáte hodně pod klíčovým slovem Chatuj<strong>e</strong>me.cz a bohužel Seznam vyhledávač nás takto nenajde. Proto bych rád uvedl na pravou míru, že nejsme <a href="http://chatujme.cz"><strong>Chatujeme.cz</strong></a> ale pouze <a href="http://chatujme.cz">Chatujme.cz</a> 🙂 </p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>	]]></content>
		<category term="Chatujme.cz" />
	</entry>
	<entry>
		<title>Linux load average – Chápeme hodnoty příkazu uptime</title>
		<id>https://lury.cz/linux-load-average-chapeme-hodnoty-prikazu-uptime-a6</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/linux-load-average-chapeme-hodnoty-prikazu-uptime-a6" />
		<updated>2026-08-28T16:50:15+02:00</updated>
		<published>2014-03-28T09:00:00+01:00</published>
		<summary>Řešili jste někdy co vlastně znamenají 3 čísla na konci příkazu uptime ? load average: 0,10, 0,09, 0,11 Tato čísla obecně vyjadřují průměrné zatížení linuxového systému za období 1, 5 a 15 minut a nezahrnují žádné procesy, čekající doby i/o wait na discích nebo síti.…</summary>
		<content type="html"><![CDATA[<p> </p>
<p>Řešili jste někdy co vlastně znamenají 3 čísla na konci příkazu <a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?uptime">uptime</a>?<br />
<code>load average: 0,10, 0,09, 0,11</code></p>

<p>Tato čísla obecně vyjadřují <strong>průměrné</strong> zatížení linuxového systému za období 1, 5 a 15 minut a nezahrnují žádné procesy, čekající doby i/o wait na discích nebo síti.<br />
Zjednodušeně se dá říct, že tato čísla zobrazují zatížení, vlivem <strong>zatížení CPU procesy</strong>, nikoliv tedy jen zatížení přímo CPU. To znamená, že zvyšující se zatížení poukazuje pouze na to, že nějaký <strong>proces čeká na dokončení předchozího procesu</strong> aby mu mohl být přidělen procesorový čas daného procesoru a přitom procesory nemusí vykazovat vůbec vytížení (například u příkazu <a href="http://linux.die.net/man/1/htop">htop</a>).<br />
Tento jev je nejčastěji způsoben právě dlouhou čekající dobou na přístup k disku, přístupu k síťovému rozhraní a nebo jsou prostě jen zatíženy procesory.</p>

<p>Load <strong>3.00</strong> u <strong>jedno-jádrového</strong> procesoru znamená <strong>300%</strong> zatížení systému, u <strong>dvou-jádrového</strong> procesoru lze předpokládat, že toto zatížení v ideálním případě by bylo poloviční tedy <strong>1.50</strong>.<br />
Pokud tedy máme číslo zatížení rovno počtu CPU, můžeme předpokládat, že hardware je v tomto okamžiku na hraně své optimální schopnosti odbavovat procesy v obvyklých časech a nenastává tak rapidní zpomalení systému (můžeme pozorovat při velkém swapování na pomalý disk kdy se zvedne i/o wait time). Lze tedy říci, že v tuto chvíli systém využil svých procesorů „naplno“ a efektivně, ale pokud takové zatížení je trvalé chtělo by to zvážit posílení hardwaru případně přerozdělení zátěže mezi více serverů.</p>
<p>S těmito informacemi lze napsat skript, který průměrný load přepočítá na procenta – (LOAD / POČET CPU) * 100. Pro ukázku přikládám funkční php skript pro linux (Ve windows jsem nenašel alternativu průměrného zatížení za časový usek, pouze okamžité zatížení CPU pomocí <a href="http://www.php.net/manual/en/com.installation.php">php rozšíření COM</a>)</p>

<pre><code>$numcores &#61; 8; //Počet jader CPU
$sys_load &#61; sys_getloadavg(); //Nativni PHP funkce pro linux
$percent &#61; ($sys_load[0] / $numcores) * 100; //Prepocet na procenta, vybereme hodnotu za posledni minutu
 
print sprintf(&#34;%0.1f&#34;,$percent) . &#34;%&#34;.PHP_EOL; //Vypis se zaokrouhlenim na 1 desetinne misto</code></pre>



<div class="fcbk_share"><div class="fcbk_like"></div></div>]]></content>
		<category term="Linux" />
	</entry>
	<entry>
		<title>Test rychlosti internetu (speedtest) z linuxového bashe</title>
		<id>https://lury.cz/test-rychlosti-internetu-speedtest-z-linuxoveho-bashe-a8</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/test-rychlosti-internetu-speedtest-z-linuxoveho-bashe-a8" />
		<updated>2026-08-28T16:50:16+02:00</updated>
		<published>2014-03-25T09:00:00+01:00</published>
		<summary>Řešili jste někdy otázku, jak změřit rychlost na linuxovém serveru bez GUI ? Dříve jsem to řešil stahováním 1GB souboru , ale to se pro větší rychlosti nehodí hlavně kvůli nedostatečné šířce pásma cílového serveru, tudíž přesné změření rychlosti nepřipadá v úvahu. Proto jsem…</summary>
		<content type="html"><![CDATA[<p>Řešili jste někdy otázku, jak změřit rychlost na linuxovém serveru bez GUI ? Dříve jsem to řešil stahováním <a href="http://ipv4.download.thinkbroadband.com/1GB.zip">1GB souboru</a>, ale to se pro větší rychlosti nehodí hlavně kvůli nedostatečné šířce pásma cílového serveru, tudíž přesné změření rychlosti nepřipadá v úvahu.<br />
Proto jsem hledal dál rychlostní test z autorizovaného serveru, který je pro tyto účely určen. Po chvilce hledání jsem narazil na pythoní skript <a href="https://github.com/sivel/speedtest-cli/">speedtest pro command line</a>, který změří to samé co klasický <a href="http://speedtest.net">speedtest.net</a> (odezvu – ping, download – rychlost stahování, upload – rychlost odesílání).</p>
<h4>Základní použití:</h4>

<pre><code>wget https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py
python speedtest-cli.py</code></pre>

<h4>Výstup:</h4>

<pre><code>Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from JON.CZ s.r.o. (188.75.174.173)...
Selecting best server based on ping...
Hosted by Vodafone CZ (Prague) [41.06 km]: 55.631 ms
Testing download speed........................................
Download: 25.77 Mbit/s
Testing upload speed..................................................
Upload: 34.49 Mbit/s
root&#64;mail:~# python speedtest_cli.py
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from JON.CZ s.r.o. (188.75.174.173)...
Selecting best server based on ping...
Hosted by Vodafone CZ (Prague) [41.06 km]: 52.611 ms
Testing download speed........................................
Download: 25.91 Mbit/s
Testing upload speed..................................................
Upload: 34.49 Mbit/s</code></pre>

<h4>Nápověda – použití:</h4>

<pre><code>$ speedtest-cli -h
usage: speedtest-cli [-h] [--share] [--simple] [--list] [--server SERVER]
                     [--mini MINI] [--source SOURCE] [--version]
 
Command line interface for testing internet bandwidth using speedtest.net.
--------------------------------------------------------------------------
https://github.com/sivel/speedtest-cli
 
optional arguments:
  -h, --help       show this help message and exit
  --share          Generate and provide a URL to the speedtest.net share
                   results image
  --simple         Suppress verbose output, only show basic information
  --list           Display a list of speedtest.net servers sorted by distance
  --server SERVER  Specify a server ID to test against
  --mini MINI      URL of the Speedtest Mini server
  --source SOURCE  Source IP address to bind to
  --version        Show the version number and exit</code></pre>

<h4>Ukázka:</h4>
<p><a class="thumbnail" href="http://lury.cz/wp-content/uploads/2014/03/lGyGlbI1.png"><img class="aligncenter size-large wp-image-117" alt="lGyGlbI[1]" src="/lury/articles/dd/lgyglbi1-1024x230.png" width="770" height="172" /></a></p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>]]></content>
		<category term="Linux" />
	</entry>
	<entry>
		<title>PHP Ping</title>
		<id>https://lury.cz/php-ping-a12</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/php-ping-a12" />
		<updated>2026-08-28T16:50:16+02:00</updated>
		<published>2014-03-22T09:00:00+01:00</published>
		<summary>Před časem jsem řešil jak na ping nezávisle na platformě. Ano, vím, že Linux, Mac i Windows mají nativní ping, ale liší se parametry a ne vždy jde využít na každém hostingu. Proto jsem hledal alternativu, která využívá socket. function ping ( $host , $timeout = 1 ) { /*…</summary>
		<content type="html"><![CDATA[<p>Před časem jsem řešil jak na ping nezávisle na platformě. Ano, vím, že Linux, Mac i Windows mají nativní ping, ale liší se parametry a ne vždy jde využít na každém hostingu.<br />
Proto jsem hledal alternativu, která využívá socket.</p>

<pre><code>function ping($host, $timeout &#61; 1) {
  /* ICMP ping packet with a pre-calculated checksum */
  $package &#61; &#34;\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost&#34;;
  $socket  &#61; socket_create(AF_INET, SOCK_RAW, 1);
  socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(&#039;sec&#039; &#61;&gt; $timeout, &#039;usec&#039; &#61;&gt; 0));
  socket_connect($socket, $host, null);
  $ts &#61; microtime(true);
  socket_send($socket, $package, strLen($package), 0);
  if (socket_read($socket, 255)) {
    $result &#61; microtime(true) - $ts;
  } else {
    $result &#61; false;
  }
  socket_close($socket);
  if ($result)
    return round(($result * 1000), 0).&#34; ms&#34;.PHP_EOL;;
  else
    return &#34;down&#34;.PHP_EOL;
}
 
for ($a &#61; 0;$a &lt; 10000 ;$a&#43;&#43; ) {
  print ping( &#34;seznam.cz&#34; );
}</code></pre>



<div class="fcbk_share"><div class="fcbk_like"></div></div>]]></content>
		<category term="PHP" />
	</entry>
	<entry>
		<title>EVOQ QPAD710A (Allwinter A13) – root, CWM a reflash ROM</title>
		<id>https://lury.cz/evoq-qpad710a-allwinter-a13-root-cwm-a-reflash-rom-a1</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/evoq-qpad710a-allwinter-a13-root-cwm-a-reflash-rom-a1" />
		<updated>2026-08-28T16:50:15+02:00</updated>
		<published>2014-01-27T09:00:00+01:00</published>
		<summary>Nedávno se mi dostal do ruky tablet od EVOQ typ QPAD710A . Tablet sám o sobě je dost pomalý i přesto, že je poháněn (dle specifikace) jednojádrovým 1,5Ghz cpu bohužel má málo RAM a to jen pouhých 512MB. Začal jsem tedy pátrat po tom co s tím. Nejdříve mě napadl root skrz který…</summary>
		<content type="html"><![CDATA[<p>Nedávno se mi dostal do ruky tablet od <a href="http://www.imei.info/phonedatabase/11306-evoq-qpad-710a/">EVOQ typ QPAD710A</a>.<br />
Tablet sám o sobě je dost pomalý i přesto, že je poháněn (dle specifikace) jednojádrovým 1,5Ghz cpu bohužel má málo RAM a to jen pouhých 512MB.</p>
<p>Začal jsem tedy pátrat po tom co s tím. Nejdříve mě napadl root skrz který odmazat nepotřebné appky a nainstalovat nějaký čistič RAM. Nicméně tablet v základu má asi 1 nebo 2 nestandardní nativní aplikace takže jsem šel dál a začal koumat CWM (ClockworkMod) pro případný reflash jiné ROM. CWM potřebuje ke své instalaci root takže jsem nakonec musel hledat variantu pro instalaci root na Allwinter A13 tablet. Našel jsem „oneclick“ exploit s názvem <a href="http://uloz.to/xGEL2hQT/doomlord-v1-xperia-2011-ics-root-emu-busybox-su-zip">DooMLoRD_v1_Xperia-2011-ICS-ROOT-emu-busybox-su.zip</a> který vlastně udělal vše za mě. Instalace CWM probíhala stejným způsobem nyní pomocí <a href="http://uloz.to/xXQxZGU8/cwm6028-a13-10part-v2-zip">cwm6028-a13-10part-v2.zip</a> (verze s 10partitions) – návod na výběr počtu partitions – <a href="http://forum.xda-developers.com/showthread.php?t&#61;2189640">http://forum.xda-developers.com/showthread.php?t&#61;2189640</a>.</p>

<p>Říkal jsem si super jdu nahrát CyanogenMod (download) z původní adresy – <a href="http://forum.xda-developers.com/showthread.php?t&#61;2343531">http://forum.xda-developers.com/showthread.php?t&#61;2343531</a> bohužel tento tablet nemá standardní přístup do recovery menu a musí se pouze přes nastartovaný system s povoleným usb debuggingem pomocí tohoto příkazu<br />
<span><code>echo -e &#039;boot-recovery\0&#039; &gt; /dev/block/nandf; sync</code></span>.</p>
<p>Pokračuji tedy nahráním CM10 s GoogleApps a příslušnými ovladači na dotyk v mém případě „zet6221-ts (zet6221 alternative)“. Bohužel po nastartování CM jsem zjistil, že dotyk nefunguje a byl jsem pěkně nahranej, protože debugging v základu byl vypnutý a já neměl tedy žádnou možnost jak nastartovat zpátky do CWM.</p>

<p>Začal jsem tedy hledat dál až jsem narazil na jakési zmínky o programu LiveSuite 1.11 (<a href="http://uloz.to/x2vurXcE/livesuitpack-1-11-zip">download</a>), který slouží k přímému nahrávání ROM prostřednictvím servisního režimu tabletu. Pohledal jsem k programu podrobnosti a začal experimentovat. Našel jsem dokonce i moji <a href="http://uloz.to/xcV18EPv/a13-mid-nuclear-pfdq88c-eng-imm76d-factory-image-by-hanzest-img">stock ROM</a> tak jsem zajásal, protože odpadly případné problémy s jinou verzí ROM.<br />
Aplikace se z počátku tvářila „nekamarádsky“, protože na mě vybafla s hláškou ohledně driverů které již byly nainstalovány, později jsem zjistil, že tablet musím do servisního módu uvést ještě před spuštěním aplikace LiveSuit. Našel jsem si tedy pár ROMek na zkoušení a začal jsem experimentovat. Zaměřil bych se na ROM s názvem <a href="http://uloz.to/xRKq2yNX/faaastjb-v2-5-full-rar">FaaastJB v2.5</a> kterou jsem nakonec i nechal v tabletu. Pro reflash bylo třeba si nastudovat ještě zkušenosti jiných, protože aplikace LiveSuit po vybrání příslušné ROM se zdála mrtvá. Řešením je vytáhnout USB kabel počkat pár vteřin poté stisknout Volume &#43; zastrčit USB kabel a při stisknutém Volume &#43; několikrát 5-10x cvaknout tlačítko Power a aplikace vyhodí hlášku s dotazem zda provést úplný reflash s Formátem nebo provést jen update.<br />
Další boj nastal se správnými ovladači, protože jak tomu bylo v případě instalace CM10 tak i u této ROM. Vzhledem k tomu, že ROM FaaastJB je dodávaná obecně pro tablety s procesorem Allwinter A10 nebo A13 tak se (pochopitelně od jiných výrobců tabletů) drivery a použité čipy liší.<br />
Nakonec jsem přišel na to že k ovladači na <a href="http://uloz.to/xWBWbt2b/zet6221-ts-zip">zet6221</a> potřebuji ještě driver gslx680. Nevím teď jestli stačil jen gslx680 každopádně při pokusu o ruční import ovladače zet6221 do jádra přes příkaz insmod jsem do kernel logu dostal hlášku o chybějícím ovladači gslx680 (<a href="http://uloz.to/xb3z1eXu/gorp-zet6221-mxc622x-7z">download</a>).</p>
<p>Odkaz na všechny potřebné soubory – <a href="http://uloz.to/soubory/luky.rys/android/allwinter-a10-a13/">http://uloz.to/soubory/luky.rys/android/allwinter-a10-a13/ </a></p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>]]></content>
		<category term="Android" />
	</entry>
	<entry>
		<title>Nevysvětlitelný problém s oprávněním souboru aneb SELinux</title>
		<id>https://lury.cz/nevysvetlitelny-problem-s-opravnenim-souboru-aneb-selinux-a7</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/nevysvetlitelny-problem-s-opravnenim-souboru-aneb-selinux-a7" />
		<updated>2026-08-28T16:50:15+02:00</updated>
		<published>2014-01-13T09:00:00+01:00</published>
		<summary>Potřeboval jsem nainstalovat aplikaci „barman“ (Aplikace pro zálohování a případné obnovení PostgreSQL). Aplikace pro svoje fungování využívá rsync spojený pomocí ssh. Vhodné nastavení je tedy přes RSA klíče kdy mají zálohované servery stejný veřejný i privátní klíč,…</summary>
		<content type="html"><![CDATA[<p>Potřeboval jsem nainstalovat aplikaci „barman“ (Aplikace pro zálohování a případné obnovení PostgreSQL).<br />
Aplikace pro svoje fungování využívá rsync spojený pomocí ssh. Vhodné nastavení je tedy přes RSA klíče kdy mají zálohované servery stejný veřejný i privátní klíč, aby odpadl problém s přihlašováním.<br />
Při aplikaci veřejného klíče pro použití ssh serveru nastal problém a to ten, že sshd klíč neviděl (respektive tvrdil, že k němu nemá práva, která dle všech složkových výpisů měl).</p>

<blockquote><p>Error: <em>Could not open</em> keyfile ‚/var/lib/barman/.ssh/<em>authorized_keys</em>‚: <em>Permission denied<br />
</em></p></blockquote>
<p>Řešení bylo nakonec velice jednoduché (nehledě na to že přes všechny snahy mi řešení trvalo skoro pět hodin) a to vypnout SELinux<br />
Vypnout se dá v souboru <code>/etc/sysconfig/selinux</code> přepnutím hodnoty <strong>SELINUX&#61;disabled</strong> z původní SELINUX&#61;permissive nebo SELINUX&#61;enforcing.<br />
Můj původní předpoklad byl, že jsou špatná práva na složku nebo přímo soubory, bohužel toto se nepotvrdilo. Poté co jsem zavětřil informaci (při googlování) že by se mohlo jednat o problém s SELinux-em tak jsem našel i toto řešení <code>restorecon -R -v ~/.ssh</code> nicméně při mém štěstí příkaz nevypsal žádný výstup a také nic neudělal respektive nic pozitivního.</p>

<p>Prozatím jsem se s tím že SELinux je už od instalace v systému, setkal pouze u CentOS respektive Fedora-based systémech.<br />
Tímto netvrdím, že by to bylo až takové zlo ale prozatím je to „novinka“ a spoustu lidí odradí první a většinou špatná zkušenost..</p>
<p>Doporučuji přečíst o co se vlastně jedná – <a href="http://www.abclinuxu.cz/clanky/bezpecnost/nebojte-se-selinuxu-1-uvod-prvni-spusteni">SELinux na abclinuxu.cz</a></p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>	]]></content>
		<category term="Linux" />
	</entry>
	<entry>
		<title>Google search fail!</title>
		<id>https://lury.cz/google-search-fail-a5</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/google-search-fail-a5" />
		<updated>2026-08-28T16:50:15+02:00</updated>
		<published>2014-01-06T09:00:00+01:00</published>
		<summary>Při vyhledávání nevinného slovního spojení mě Google vcelku šokoval. Místo očekávaného výsledku mi nabídl na třetí pozici odkaz na wiki, který bych skoro označil za „Google bomb“. Výsledek snad nebudu ani vypisovat – můžete videt na přiloženém screenu níže…</summary>
		<content type="html"><![CDATA[<p>Při vyhledávání nevinného slovního spojení mě Google vcelku šokoval. Místo očekávaného výsledku mi nabídl na třetí pozici odkaz na wiki, který bych skoro označil za „Google bomb“.</p>

<p>Výsledek snad nebudu ani vypisovat – můžete videt na přiloženém screenu níže 😀  .</p>

<p><a target="_blank" href="http://lury.cz/wp-content/uploads/2014/01/nE9XaPI1.png"><img class="thumbnail size-medium wp-image-68" alt="nE9XaPI[1]" src="/lury/articles/58/ne9xapi1-300x168.png" width="300" height="168" /></a></p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>	]]></content>
		<category term="Google" />
	</entry>
	<entry>
		<title>Chatujme.cz má přihlášení přes Facebook!</title>
		<id>https://lury.cz/chatujme-cz-ma-prihlaseni-pres-facebook-a3</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/chatujme-cz-ma-prihlaseni-pres-facebook-a3" />
		<updated>2026-08-28T16:50:15+02:00</updated>
		<published>2014-01-05T09:00:00+01:00</published>
		<summary>Dnešním dnem se povedl jeden malý úspěch, a to ten, že se povedlo naimplementovat bez problému přihlášení přes Facebook. Při prvním přihlášení se vytvoří účet, který se předvyplní poskytnutými údaji z facebooku a provede Vás nutným zbytkem registrace (doplnění přezdívky dle…</summary>
		<content type="html"><![CDATA[<p>Dnešním dnem se povedl jeden malý úspěch, a to ten, že se povedlo naimplementovat bez problému přihlášení přes Facebook.</p>

<p>Při prvním přihlášení se vytvoří účet, který se předvyplní poskytnutými údaji z facebooku a provede Vás nutným zbytkem registrace (doplnění přezdívky dle našich kritérií).<br />
Po vyplnění nové přezdívky a hesla se Vám otevře plný účet <a href="http://chatujme.cz">Chatujme.cz</a> a nyní máte dvě možnosti při dalším přihlášení.<br />
Přihlásit se přes údaje, které jste vyplnili po prvním přihlášení přes Facebook a to Vaše přezdívka a heslo nebo opět kliknout na tlačítko pro přihlášení pomocí Facebooku a účet se ihned přihlásí.<br />
V případě, že již na chatujme.cz účet máte tak po kliknutí na tlačítko „Přihlásit se pomocí Facebooku“ zvolte možnost „Již mám účet“ a účet se jen propojí. Přičtení smajlíků funguje i v této možnosti spojení s Facebookem.</p>
<p>Jako nevinnou věc jsme si dovolili při registraci přes FB (tedy prvním přihlášení) poslat jednu zprávičku na Vaši zeď ohledně Vaší registrace na Chatujme.<br />
Zprávičku můžete zakázat při povolování přístupu, <strong>ale při jejím povolení získáte od nás bonus v podobě dalších deseti volných pozic pro smajlíky</strong> (takže z původních třiceti máte k dispozici 40 volných pozic pro Vaše oblíbené smajlíky) a zároveň <strong>pomůžete Chatujme v rozletu tím, že se o nás dozvědí i Vaši přátelé.</strong><br />
<strong>Po propojení můžete používat obojí způsob přihlašování. A to standardní pomocí vašeho nicku a hesla nebo prostě jednoduše kliknutím na tlačítko „Přihlásit se pomocí Facebooku“</strong></p>

<p>Věříme, že vás tato vymoženost potěší a usnadní přístup na náš portál.</p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>]]></content>
		<category term="Chatujme.cz" />
	</entry>
	<entry>
		<title>SoundWire aneb bezdrátový reproduktor pomocí telefonu</title>
		<id>https://lury.cz/soundwire-aneb-bezdratovy-reproduktor-pomoci-telefonu-a2</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/soundwire-aneb-bezdratovy-reproduktor-pomoci-telefonu-a2" />
		<updated>2026-08-28T16:50:15+02:00</updated>
		<published>2013-12-27T09:00:00+01:00</published>
		<summary>Co nespojovat jen android s počítačem, ale počítač s androidem? Řešil jsem to, že se mi nechce tahat přes půl místnosti kabel k hi-fi věži. Teď mám mobil u věže, kde je puštěný SoundWire, a mám „WiFi Speaker“. SoundWire chodi dle ocekavani, maji i dobre vypadajici…</summary>
		<content type="html"><![CDATA[<p>Co nespojovat jen android s počítačem, ale počítač s androidem?</p>

<p>Řešil jsem to, že se mi nechce tahat přes půl místnosti kabel k hi-fi věži.<br />
Teď mám mobil u věže, kde je puštěný SoundWire, a mám „WiFi Speaker“.<br />
SoundWire chodí dle očekávání, mají i dobře vypadající neotravnou aplikaci (Server aplikaci) pro různé platformy – <a href="http://georgielabs.net/">http://georgielabs.net/</a>.<br />
Pochopitelně se ve free verzi sem tam občas objeví hlasová hláška „soundwire free version“ a některá speciálnější nastavení jsou pouze v placené verzi.<br />
Free verze splňuje vše, co jsem od toho očekával.</p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>	]]></content>
		<category term="Android" />
	</entry>
	<entry>
		<title>Perl Kontrola internetu</title>
		<id>https://lury.cz/perl-kontrola-internetu-a11</id>
		<link rel="alternate" type="text/html" href="https://lury.cz/perl-kontrola-internetu-a11" />
		<updated>2026-08-28T16:50:16+02:00</updated>
		<published>2013-03-03T09:00:00+01:00</published>
		<summary>Tak jako každý uživatel, se občas setká s tím že mu prostě začne internet „blbnout“. Tak jsem se rozhodl napsat aplikaci v Perlu, která mi dle daných kritérií „vypinguje“ adresu kterou budu chtít a kolikrát budu chtít. Pro případ, když nezadám žádná…</summary>
		<content type="html"><![CDATA[<p>Tak jako každý uživatel, se občas setká s tím že mu prostě začne internet „blbnout“.<br />
Tak jsem se rozhodl napsat aplikaci v Perlu, která mi dle daných kritérií „vypinguje“ adresu kterou budu chtít a kolikrát budu chtít.<br />
Pro případ, když nezadám žádná kritéria, tak mi „vypinguje“ můj web s 5 pingama a vypíše.<br />
[<a href="http://sphotos-f.ak.fbcdn.net/hphotos-ak-prn1/155949_216343015174560_1868315237_n.jpg" target="_blank"><abbr title="bez kritériích">screen1</abbr></a>] [<a href="http://sphotos-a.ak.fbcdn.net/hphotos-ak-ash4/225399_216343155174546_1166617733_n.jpg" target="_blank"><abbr title="s kritérimi">screen2</abbr></a>]</p>

<p>
Aplikace „Kontrola Internetu“ (kontrolanet.pl) je napsaná v jazyce Perl na operačním systému Linux Ubuntu 12.04 LTS.<br />
Kdo by měl zájem o tento program, nechte komentář zde pod příspěvkem!</p>


<div class="fcbk_share"><div class="fcbk_like"></div></div>	]]></content>
		<category term="Perl" />
	</entry>
</feed>