<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Apple Geek &#187; filesystems</title>
	<atom:link href="http://theapplegeek.ru/archives/tag/filesystems/feed" rel="self" type="application/rss+xml" />
	<link>http://theapplegeek.ru</link>
	<description>Чему ты научился сегодня?</description>
	<lastBuildDate>Fri, 30 Jul 2010 13:48:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Доступ к каталогу Media на iPhone/iPad/iPod Touch (PhoneView)</title>
		<link>http://theapplegeek.ru/archives/3938</link>
		<comments>http://theapplegeek.ru/archives/3938#comments</comments>
		<pubDate>Sat, 05 Jun 2010 11:18:40 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Quick Tips]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[filesystems]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3938</guid>
		<description><![CDATA[Пару дней назад я показал, как получить доступ к системной информации iPhone/iPad/iPod Touch (а именно к содержимому каталога Media для устройств без jailbreak и ко всей файловой системе для jailbreak) с Linux. Вот, например, данные на моём iPhone: $ ls -al tmp/iphone/ drwxr-xr-x 2 ole ole 68 2010-05-26 15:36 ApplicationArchives -rw-r--r-- 1 ole ole 0 [...]]]></description>
			<content:encoded><![CDATA[<p>Пару дней назад я показал, <a href="http://theapplegeek.ru/archives/3927" >как получить доступ</a> к системной информации iPhone/iPad/iPod Touch (а именно к содержимому каталога Media для устройств без jailbreak и ко всей файловой системе для jailbreak) с Linux.</p>
<p>Вот, например, данные на моём iPhone:</p>
<pre>
<small>$ ls -al tmp/iphone/
drwxr-xr-x  2 ole ole   68 2010-05-26 15:36 ApplicationArchives
-rw-r--r--  1 ole ole    0 2010-03-21 16:06 com.apple.itdbprep.postprocess.lock
-rw-r--r--  1 ole ole    0 2010-03-21 16:06 com.apple.itunes.lock_sync
drwxr-xr-x  4 ole ole  204 2010-03-21 16:09 DCIM
drwxr-xr-x  2 ole ole  102 2010-06-02 02:06 Downloads
drwxr-xr-x  2 ole ole  102 2010-04-05 20:45 iPhoneDrive
drwxr-xr-x  7 ole ole  238 2010-03-21 16:19 iTunes_Control
drwxr-xr-x  3 ole ole  170 2010-06-03 10:53 Photos
drwxr-xr-x  2 ole ole   68 2010-03-21 16:06 Podcasts
drwxr-xr-x  2 ole ole   68 2010-06-02 17:03 PublicStaging
drwxr-xr-x  2 ole ole   68 2010-03-21 16:06 Purchases
drwxr-xr-x  2 ole ole  238 2010-03-28 14:35 Recordings
drwxr-xr-x  2 ole ole  136 2010-06-03 10:53 Safari</small>
</pre>
<p><span id="more-3938"></span></p>
<p>С Mac&#8217;а это можно сделать, например, используя небесплатную программу <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.ecamm.com/mac/phoneview/" >PhoneView</a></noindex> (мне она досталась можно сказать бесплатно пару лет назад в составе <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.macheist.com/" >MacHeist Bundle</a></noindex>, поэтому грех ею не воспользоваться).</p>
<p>Для этого нужно включить в настройках программы &#8220;Show Entire Disk (Advanced Disk Mode)&#8221;:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/06/01_pv-full.png"  class="image-link" rel="lightbox[3938]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/06/01_pv-thumb.png" height="389" width="450" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Вот такие данные доступны для iPad:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/06/02_pv-full.png"  class="image-link" rel="lightbox[3938]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/06/02_pv-thumb.png" height="553" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Почему я не показал результат для iPhone? Недавно я поставил iPhone OS 4.0 beta 4, и PhoneView отказался к нему подключаться:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/06/03_pv-full.png"  class="image-link" rel="lightbox[3938]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/06/03_pv-thumb.png" height="252" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3938/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Снятие блокировки файла в терминале</title>
		<link>http://theapplegeek.ru/archives/3632</link>
		<comments>http://theapplegeek.ru/archives/3632#comments</comments>
		<pubDate>Thu, 25 Mar 2010 11:50:16 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[filesystems]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3632</guid>
		<description><![CDATA[Сегодня получил письмо от Algor&#8216;а с интересным вопросом: Разбирая архив на CD и DVD с фотографиями, я скопировал их все на жесткий диск. Воспользовавшись программой Tidy Up!, обнаружил массу дубликатов. Ну думаю, сейчас я их. Удалю. Да вот ничего подобного. На попытку переместить все выбранные файлы в корзину программа отвечает отказом удалить некоторые файлы в [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня получил письмо от <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://photonik.ru/" >Algor</a></noindex>&#8216;а с интересным вопросом:</p>
<blockquote>
<p>Разбирая архив на CD и DVD с фотографиями, я скопировал их все на жесткий диск. Воспользовавшись программой Tidy Up!, обнаружил массу дубликатов. Ну думаю, сейчас я их. Удалю. Да вот ничего подобного. На попытку переместить все выбранные файлы в корзину программа отвечает отказом удалить некоторые файлы в связи с тем, что они (файлы) залочены. Копировались с CD и DVD со всеми их свойствами. И это в самых разных директориях и поддиректориях. Интерфейс Tidy Up! не предусматривает пакетную разлочку таких файлов, средствами Mac OS X тоже сделать ничего не удалось. Может напишешь команду в терминале как разлочить все файлы в данном директории включая все поддиректории?</p>
</blockquote>
<p>Речь шла о блокировке, которую в том числе можно сделать в Finder Get Info:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/03/01_uchg-full.png"  class="image-link" rel="lightbox[3632]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/03/01_uchg-thumb.png" height="570" width="359" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p><span id="more-3632"></span></p>
<p>В процессе поиска решения нашёл документ Apple KB с главой &#8220;<noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://support.apple.com/kb/HT1526" >Advanced tip about deleting locked files</a></noindex>&#8220;.</p>
<p>Блокировка файла в Finder обозначает установку флага uchg, также известного как &#8220;immutable flag&#8221;. Если файл заблокирован, то его нельзя удалить или изменить:</p>
<pre>
$ rm testfile.txt
override rw-r--r--  ctrld/staff uchg for testfile.txt? y
rm: testfile.txt: Operation not permitted

$ date > testfile.txt
-bash: testfile.txt: Operation not permitted
</pre>
<p>Снять флаг можно в консоли командой <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/chflags.1.html#//apple_ref/doc/man/1/chflags" >chflags</a></noindex>:</p>
<pre>
$ chflags nouchg testfile.txt
</pre>
<p>Если вам нужно проделать эту операцию для большого каталога и его содержимого, то нужно использовать ключ &#8220;-R&#8221;:</p>
<pre>
$ chflags -R nouchg bigdirectory
</pre>
<p>Ключи ls для просмотра флагов:</p>
<pre>
$ ls -lO testfile.txt
-rw-r--r--  1 ctrld  staff  <b>uchg</b> 0 Mar 25 10:27 testfile.txt
</pre>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3632/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Использование SparseBundle Image для хранения базы данных Yojimbo, или как уменьшить объём бекапа</title>
		<link>http://theapplegeek.ru/archives/3602</link>
		<comments>http://theapplegeek.ru/archives/3602#comments</comments>
		<pubDate>Tue, 23 Mar 2010 09:20:56 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[disk]]></category>
		<category><![CDATA[filesystems]]></category>
		<category><![CDATA[time machine]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3602</guid>
		<description><![CDATA[Системы хранения заметок &#8211; достаточно интересная категория программ. Я до сих пор не нашёл идеальной программы, но постепенно движусь в этом направлении. Evernote не нравится сохранением web-страниц, Together &#8211; странной дисковой активностью, Yojimbo &#8211; отсутствием программы под iPhone. Недавно в комментариях к статье &#8220;Синхронизация данных Yojimbo через Dropbox&#8221; мы с 8bituser обсуждали достоинства и недостатки [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://theapplegeek.ru/wp-content/uploads/2010/03/01_yojimbosparse-thumb1.png" height="160" align="right" width="160" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Системы хранения заметок &#8211; достаточно интересная категория программ. Я до сих пор не нашёл идеальной программы, но постепенно движусь в этом направлении. Evernote не нравится сохранением web-страниц, Together &#8211; странной дисковой активностью, Yojimbo &#8211; отсутствием программы под iPhone.</p>
<p>Недавно в комментариях к статье &#8220;<a href="http://theapplegeek.ru/archives/3499" >Синхронизация данных Yojimbo через Dropbox</a>&#8221; мы с <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://twitter.com/8bituser" >8bituser</a></noindex> обсуждали достоинства и недостатки двух систем хранения заметок (<noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.reinventedsoftware.com/together/" >Together</a></noindex> и <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.barebones.com/products/Yojimbo/" >Yojimbo</a></noindex>). Я приведу его аргументы в пользу Together, они очень полезны:</p>
<p><span id="more-3602"></span></p>
<blockquote>
<p>А я с Yojimbo кое-как переполз на Together. У меня файл базы был 140мб, каждый бэкап тайммашины&#8230;</p>
<p>И потом хотелось как-то на айфоне иметь доступ ко всему этому. В Together всё хранится не в базе, а открыто. Сделал его базу прямо в стандартной папке Documents (по дефолту в папке Together, которая в Documents, так не очень удобно и не красиво показалось), скрыл то, что мне не надо (там порядка 8 папок и файл Together.lock, теперь имею там каталоги Notes, Documents, Web Pages, Images и их симлинкаю на дропбокс, и таким образом всё есть на айфоне, причем быстро, не 140мб каждый раз пересылать туда-сюда, а только новые или измененные файлы.</p>
<p>Ну и достаточно удобно к этим папкам доступ из Stacks в режиме List могу открыть любой файл даже без открытого самого Together.</p>
<p>Плюс когда в Together кидаешь кусочек чего-то со страницы, он запоминает линк страницы и можно даже этот кусочек подредактировать удалив что-то или добавив.</p>
<p>Смартфолдеры тоже есть, с тэгами тоже не особо складывается, разве что для тех же смартфолдеров они нужны помимо раскрашивания.</p>
<p>Из минусов только то, что кусочки с веб-страниц кидать нужно в Shelf, а не прямо на иконку в доке, но уже привык, а всё остальное очень похоже, чуть больше удобности и гибкости. Причем у этого Shelf очень удобно быстро заметку написать или скопипастить в него.</p>
<p>Одни плюсы вобщем, переходи, чем дальше с Yojimbo тем болезненней переход :))</p>
</blockquote>
<p>Да, Yojimbo невозможно использовать на iPhone, и это его большой минус. Я до сих пор ещё не определился, оставаться ли на Yojimbo или переходить на Together. Мне больше нравится первый. Но пока я стараюсь вести заметки в обеих системах. Сравнительный анализ &#8211; это тема отдельной статьи.</p>
<p>Сейчас же я хочу показать, как можно обойти главную проблему Yojimbo, а именно то, что данные хранятся в базе данных SQLite3 в едином файле и малейшее изменение приводит к необходимости записи в Time Machine всего файла. Для небольших баз это несущественно, но если ваши данные занимают сотни мегабайт, то это становится уже ощутимой проблемой.</p>
<p>Идея проста &#8211; нужно разместить данные в SparseBundle Image. Этот образ представляет собой набор 8-ми мегабайтных файлов (band&#8217;ов), и при изменении его содержимого меняются далеко не все band&#8217;ы, что даёт возможность уменьшить объём данных, записываемых в бекап Time Machine.</p>
<h2>Подготовка SparseBundle Image</h2>
<p>Создать образ можно или через программу Disk Utility, или в консоли через <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://developer.apple.com/Mac/library/documentation/Darwin/Reference/ManPages/man1/hdiutil.1.html" >hdiutil</a></noindex>. Через графический интерфейс для меня сложнее, поэтому именно этот метод я и рассмотрю :-)</p>
<p>Запускаем Disk Utility (/Applications/Utilities/Disk Utility), создаём образ:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/03/02_yojimbosparse-full.png"  class="image-link" rel="lightbox[3602]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/03/02_yojimbosparse-thumb.png" height="237" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Я решил разместить образ в каталоге Documents, но вы его можете расположить там, где вам удобно. Параметры такие:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/03/03_yojimbosparse-full.png"  class="image-link" rel="lightbox[3602]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/03/03_yojimbosparse-thumb.png" height="459" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Мне достаточно пока 100 MB, формат файловой системы стандартный &#8220;Mac OS X Extended (Journaled)&#8221;, схему разделов я привычно поменял с &#8220;<a href="http://theapplegeek.ru/archives/1370" >Apple Partition Map</a>&#8221; на &#8220;<a href="http://theapplegeek.ru/archives/1428" >GUID Partition Map</a>&#8220;. Самое главное &#8211; поставить формат образа &#8220;sparse bundle disk image&#8221;.</p>
<p>Если вы хотите секретности, то можно создать образ с шифрацией AES (128 бит вполне достаточно, но у вас могут быть другие соображения):</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/03/04_yojimbosparse2-full.png"  class="image-link" rel="lightbox[3602]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/03/04_yojimbosparse2-thumb.png" height="178" width="428" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Ту же самую операция можно выполнить и через консоль:</p>
<pre>
$ hdiutil create -size 100m -type SPARSEBUNDLE -imagekey \
  sparse-band-size=4096 -fs JHFS+X -volname Yojimbo -layout GPTSPUD \
  ~/Documents/Yojimbo
</pre>
<p>Так даже лучше поступить, так как можно изменить размер band&#8217;а со стандартных 8 MB до 2 MB (4096 512-байтовых блока) или даже до минимального значения 1 MB (2048 512-байтовых блока).</p>
<h3>Увеличение размера образа</h3>
<p>Размер образа я поставил 100 MB. При необходимости можно его увеличить. Через Disk Utility мне это сделать не удалось (система рапортовала, что размер изменён, затем о том, что образ не изменён):</p>
<pre>
<small>2010-03-12 17:33:14 +0200: Growing partition 0 of “Yojimbo.sparsebundle” from 100 MB to 500 MB.
2010-03-12 17:33:14 +0200: Resizing “Yojimbo.sparsebundle” was successful.
2010-03-12 17:33:26 +0200: Image “Yojimbo.sparsebundle” will not be changed.</small>
</pre>
<p>Поэтому я вернулся в любимую консоль и там это сделал быстро и логично.</p>
<p>Если образ уже примонтирован, то нужно его отмонтировать:</p>
<pre>
$ hdiutil eject /Volumes/Yojimbo
</pre>
<p>Увеличение максимального размера образа до 500 MB (обратите внимание, что размер образа увеличивается по необходимости, а не выделеятся весь заявленный размер):</p>
<pre>
$ hdiutil resize -size 500m ~/Documents/Yojimbo.sparsebundle
</pre>
<p>Если в образе было много изменений, то можно его сжать (но для данного случая это почти бессмысленно, предварительно нужно сделать <a href="http://theapplegeek.ru/archives/3520" >vacuum</a> на базу данных SQLite, и только потом сжимать образ):</p>
<pre>
$ hdiutil compact ~/Documents/Yojimbo.sparsebundle
</pre>
<p>Монтирование образа:</p>
<pre>
$ hdiutil mount ~/Documents/Yojimbo.sparsebundle
</pre>
<p>Образ также можно примонтировать, открыв его в Finder.</p>
<p>Я заодно меняю иконку для этого образа, перетаскивая png-файл, найденный в Google на иконку в Get Info:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/03/05_yojimbosparse-full.png"  class="image-link" rel="lightbox[3602]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/03/05_yojimbosparse-thumb.png" height="436" width="386" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Затем меняю иконку и для смонтированного образа:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/03/06_yojimbosparse-full.png"  class="image-link" rel="lightbox[3602]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/03/06_yojimbosparse-thumb.png" height="416" width="386" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Теперь всё красиво.</p>
<h2>Автоподключение образа при старте системы</h2>
<p>Воспользуемся небольшим трюком &#8211; для автоподключения образа нужно его поместить в Login Items пользователя. Заходим в &#8220;System Preferences/Accounts/Login Items&#8221;. Рядом открываем окно Finder с папкой Documents. Перетаскиваем образ Yojimbo.sparsebundle в список Login Items:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/03/07_yojimbosparse-full.png"  class="image-link" rel="lightbox[3602]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/03/07_yojimbosparse-thumb.png" height="260" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Теперь после старта системы образ будет смонтирован в точку /Volumes/Yojimbo. Если вы выбрали шифрацию, то лучше поставить автозапоминание пароля в KeyChain, иначе придётся каждый раз этот пароль вводить (но это опять-таки &#8220;up to you&#8221; &#8211; достаточно сомнительное решение вводить шифрацию, и по сути обходить эту шифрацию, ставя автоввод пароля).</p>
<h2>Перенос данных Yojimbo в SparseBundle</h2>
<p>Перед этой операцией данные уже должны быть, для чего нужно хотя бы раз запустить Yojimbo. Дальнейшие операции лучше проводить в терминале, &#8220;Alias&#8221; в Finder &#8211; это далеко не unix symbolic link. Да, из Yojimbo нужно выйти.</p>
<pre>
$ cd ~/Library/Application\ Support
</pre>
<p>Делаем резервную копию данных:</p>
<pre>
$ mv Yojimbo Yojimbo.backup
</pre>
<p>Создаём символический линк, говорящий, что все данные будут располагаться в смонтированном образе:</p>
<pre>
$ ln -s /Volumes/Yojimbo .
$ ls -al Yojimbo
<small>lrwxr-xr-x  1 ctrld  staff  16 Mar 12 18:18 Yojimbo -> /Volumes/Yojimbo</small>
</pre>
<p>Копируем все файлы, включая скрытые, начинающиеся с &#8220;.&#8221;. Сейчас перечень такой, но в других версиях он может поменяться, поэтому команду копирования возможно придётся адаптировать</p>
<pre>
$ ls -a Yojimbo.backup/
<small>.ContentIndex.version	ContentIndex.skindex	Database.sqlite		State.plist
SyncState.plist</small>
$ cp Yojimbo.backup/{.[A-Z]*,[A-Z]*} /Volumes/Yojimbo/
$ ls -a Yojimbo/
<small>.ContentIndex.version	.fseventsd		Database.sqlite		SyncState.plist
.Trashes		ContentIndex.skindex	State.plist</small>
</pre>
<p>Символический линк сделан. Запускаем Yojimbo, убеждаемся, что все данные на месте.</p>
<p>Но не беспокойтесь, если что-то пошло не так &#8211; старые данные есть в каталоге ~/Library/Application\ Support/Yojimbo.backup. Откат:</p>
<pre>
$ cd ~/Library/Application\ Support
$ rm Yojimbo
$ cp -r Yojimbo.backup Yojimbo
</pre>
<h2>Эффект от перехода на SparseBundle Image</h2>
<p>Как определить, что band поменялся? Достаточно посмотреть на время его модификации. Я сейчас покажу данные, которые я собрал для старого образа, в котором размер band был 8 MB.</p>
<p>После изменения одного комментария в 11:55 поменялись два файла &#8211; 0 и 1:</p>
<pre>
$ ls -al ~/Documents/Yojimbo.sparsebundle/bands
<b>-rw-r--r--   1 ctrld  staff  8388608 Mar 11 11:55 0</b>
<b>-rw-r--r--   1 ctrld  staff  8388608 Mar 11 11:55 1</b>
-rw-r--r--   1 ctrld  staff  8388608 Mar 11 11:26 2
-rw-r--r--   1 ctrld  staff  5386240 Mar 11 11:43 3
-rw-r--r--   1 ctrld  staff  2437120 Mar 10 20:51 5
-rw-r--r--   1 ctrld  staff   913408 Mar  9 16:21 6
-rw-r--r--   1 ctrld  staff  8388608 Mar  9 16:21 b
-rw-r--r--   1 ctrld  staff  1757184 Mar  9 16:21 c
</pre>
<p>Это значит, что в Time Machine будет помещены два файла суммарным размером 16 MB, но не весь файл базы данных 25.7 MB, как было бы без SparseBundle:</p>
<pre>
$ ls -al /Volumes/Yojimbo/Database.sqlite
-rw-r--r--@  1 ctrld  staff  26961920 Mar 11 11:50 Database.sqlite
</pre>
<p>Если уменьшить размер band до 2 MB, то количество файлов может уменьшиться. Конечно же, чем больше база данных, тем больше эффект.</p>
<h2>Копируются ли данные в Time Machine из открытого образа SparseBundle Image?</h2>
<p>Проделаю эксперимент. Запускаю Yojimbo и меняю один комментарий.</p>
<pre>
$ ls -al /Volumes/Yojimbo/Database.sqlite
-rw-r--r--@  1 ctrld  staff  26961920 Mar 11 12:00 Database.sqlite

$ ls -al ~/Documents/Yojimbo.sparsebundle/bands
<b>-rw-r--r--   1 ctrld  staff  8388608 Mar 11 12:01 0</b>
<b>-rw-r--r--   1 ctrld  staff  8388608 Mar 11 12:01 1</b>
-rw-r--r--   1 ctrld  staff  8388608 Mar 11 11:26 2
<b>-rw-r--r--   1 ctrld  staff  5386240 Mar 11 12:00 3</b>
-rw-r--r--   1 ctrld  staff  2437120 Mar 10 20:51 5
-rw-r--r--   1 ctrld  staff   913408 Mar  9 16:21 6
-rw-r--r--   1 ctrld  staff  8388608 Mar  9 16:21 b
-rw-r--r--   1 ctrld  staff  1757184 Mar  9 16:21 c
</pre>
<p>Поменялись три файла &#8211; 0, 1 и 3.</p>
<p>С помощью dtrace смотрю за файлами, которые обрабатывает демон backupd Time Machine:</p>
<pre>
open:entry backupd /Users/ctrld/Documents/Yojimbo.sparsebundle/bands/3
open:entry backupd /Users/ctrld/Documents/Yojimbo.sparsebundle/bands/0
open:entry backupd /Users/ctrld/Documents/Yojimbo.sparsebundle/bands/1
</pre>
<p>Да, при открытом образе данные помещаются в бекап (в отличие от домашнего каталога в FileVault без выхода из системы).</p>
<h2>Восстановление данных из бекапа</h2>
<p>А вот здесь моего терпения не хватило, продолжу в другой раз :-) Могу сказать, что первая попытка восстановления из бекапа прошла безупречно, но когда я начал повторять процесс, у меня возникли сложности с dtrace, и я отложил исследование.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3602/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Влияние FileVault на производительность файловых операций. Эпилог</title>
		<link>http://theapplegeek.ru/archives/3460</link>
		<comments>http://theapplegeek.ru/archives/3460#comments</comments>
		<pubDate>Fri, 19 Feb 2010 13:12:53 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[filesystems]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3460</guid>
		<description><![CDATA[После двухнедельного использования FileVault я перевёл свой домашний каталог на обычную схему без шифрования. Причина в том, что субъективно типичные файловые операции стали выполняться медленнее. Например, при открытии iTunes на списке приложений под iPhone процесс отрисовки иконок достаточно заметен. Были и другие случаи, которые мне доставляли дискомфорт. Мои данные не содержат каких-то критичных сведений, все [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://theapplegeek.ru/wp-content/uploads/2010/02/00_fv-thumb1.png" height="154" align="right" width="160" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>После двухнедельного использования FileVault я перевёл свой домашний каталог на обычную схему без шифрования. Причина в том, что субъективно типичные файловые операции стали выполняться медленнее. Например, при открытии iTunes на списке приложений под iPhone процесс отрисовки иконок достаточно заметен. Были и другие случаи, которые мне доставляли дискомфорт. Мои данные не содержат каких-то критичных сведений, все пароли зашифрованы, поэтому я и откатился обратно. Сразу же почувствовал, что ноутбук стал летать.</p>
<p>Но до отката я провёл несколько тестов файловой системы программой <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.speedtools2.com/QuickBench.html" >QuickBench</a></noindex>, чтобы показать различие в производительности при использовании FileVault и без него. Диск &#8211; штатный для MacBook Pro 2.8 GHz 500 GB 5400 rpm Hitachi.</p>
<p><span id="more-3460"></span></p>
<p>Тест чтения/записи без FileVault:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/01_fv-full.png"  class="image-link" rel="lightbox[3460]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/01_fv-thumb.png" height="386" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Тест чтения/записи с FileVault:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/02_fv-full.png"  class="image-link" rel="lightbox[3460]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/02_fv-thumb.png" height="386" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>При включенном FileVault при работе с данными чанки, из которых состоит SparseBundle Image, считываются в память и за счёт этого производится кеширование. Поэтому скорость последовательного чтения и записи, а также случайной записи высока до блоков 64 KB включительно, после чего резко падает и становится хуже, чем без использования FileVault. Особенно это проявляется для случайного чтения, которое как раз и применяется при операциях, похожих на загрузку иконок приложений в iTunes.</p>
<p>Тест чтения/записи файлов 2-10 MB без FileVault:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/03_fv-full.png"  class="image-link" rel="lightbox[3460]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/03_fv-thumb.png" height="386" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Тест чтения/записи файлов 2-10 MB c FileVault:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/04_fv-full.png"  class="image-link" rel="lightbox[3460]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/04_fv-thumb.png" height="386" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Скорость записи с включённым FileVault падает чуть ли не в 4 раза для файлов от 7 MB. Только для файлов 2 MB она высока за счёт размера чанка и кеширования. Скорость чтения не так сильно деградирует, но всё-таки процентов 15 есть.</p>
<p>Тест чтения/записи файлов 20-100 MB без FileVault:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/05_fv-full.png"  class="image-link" rel="lightbox[3460]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/05_fv-thumb.png" height="386" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Тест чтения/записи файлов 20-100 MB с FileVault:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/06_fv-full.png"  class="image-link" rel="lightbox[3460]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/06_fv-thumb.png" height="386" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Скорость записи с FileVault уменьшается процентов на 50%. Скорость чтения также страдает.</p>
<p>Делаем вывод, что некоторые операции с FileVault быстрее за счёт кеширования, но интегральная производительность хуже. Поэтому включать FileVault нужно только для тех случаев, когда это действительно необходимо. Если же вы хотите зашифровать свои данные, то лучше сделать отдельный шифрованный Sparse Bundle Image, в котором хранить только критичные данные (и не запоминать в KeyChain пароль к нему). Краткое описание, как его создать в Terminal.app, можно посмотреть в моей статье &#8220;<a href="http://theapplegeek.ru/archives/759" >Работа с образами дисков в Terminal.app (hdiutil)</a>&#8221; (это же можно сделать и через Disk Utility).</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3460/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Поиск больших файлов и каталогов на диске (DaisyDisk)</title>
		<link>http://theapplegeek.ru/archives/3437</link>
		<comments>http://theapplegeek.ru/archives/3437#comments</comments>
		<pubDate>Thu, 18 Feb 2010 16:20:15 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Обзоры программ]]></category>
		<category><![CDATA[filesystems]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3437</guid>
		<description><![CDATA[Недавно я перешёл на криптование домашнего каталога через FileVault, до этого проанализировав вопрос в статьях &#8220;Влияние FileVault на производительность файловых операций&#8221; и &#8220;Производительность FileVault при параллельной файловой активности&#8220;. Результаты были хороши. Реальное же использование криптования слегка подкорректировало моё мнение &#8211; да, с включённым FileVault система работает при определённых операциях медленнее. В итоге я понял, что [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://theapplegeek.ru/wp-content/uploads/2010/02/01_daisydisk-thumb1.png" height="147" align="right" width="148" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Недавно я перешёл на криптование домашнего каталога через FileVault, до этого проанализировав вопрос в статьях &#8220;<a href="http://theapplegeek.ru/archives/1905" >Влияние FileVault на производительность файловых операций</a>&#8221; и &#8220;<a href="http://theapplegeek.ru/archives/1915" >Производительность FileVault при параллельной файловой активности</a>&#8220;. Результаты были хороши. Реальное же использование криптования слегка подкорректировало моё мнение &#8211; да, с включённым FileVault система работает при определённых операциях медленнее.</p>
<p>В итоге я понял, что большинство моих данных не настолько секретно, а действительно приватные данные можно скрыть в закриптованном образе Sparse Bundle, и жертвовать производительностью ради секретности для меня смысла нет.</p>
<p><span id="more-3437"></span></p>
<p>Для того, чтобы упростить обратную конвертацию, я решил вынести самые большие каталоги временно из домашнего каталога. Привычный алгоритм выглядел просто &#8211; перенести Music, Photos, Videos, а дальше запустить консоль и, итеративно запуская &#8220;du -ks * | sort -rn&#8221;, найти оставшихся пожирателей дискового пространства.</p>
<pre>
$ cd ~
$ du -ks * | sort -rn
<small>9155148	Library
4267588	Documents
546600	Dropbox
340496	Music
7712	Woopra
100	bin
...</small>
$ cd Library
$ du -ks * | sort -rn
<small>...</small>
</pre>
<p>Этот метод хорош. Но он не из разряда &#8220;Mac Way&#8221;. И тут я вспомнил о программе <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.daisydiskapp.com/" >DaisyDisk</a></noindex>, которая является по сути красивой заменой приведённому выше процессу. Программа платная, стоит $19.95, но для разового поиска можно использовать программу в триальном режиме. Программа хорошая, и я её купил, зная, что она не раз мне ещё пригодится.</p>
<p>Немного пройдусь по функциям DaisyDisk в приложении к моей задаче. Стартовая точка &#8211; выбор диска или каталога, который нужно проанализировать:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/02_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/02_daisydisk-thumb.png" height="178" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Вы видите, почему я занялся переносом &#8211; на диске осталось мало места, и провести конвертацию домашнего каталога мне вряд ли удалось. Результат работы:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/03_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/03_daisydisk-thumb.png" height="424" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Можно спускаться в любой каталог и смотреть, что же занимает столько места, причём, в отличие от &#8220;du -ks *&#8221;, не нужно хранить результаты сканирования предыдущих каталогов. При наведении на каталог его графическое представление начинает мерцать.</p>
<p>Представляется весь диск. Внутреннее кольцо &#8211; каталоги относительно корневого, дальше идут дочерние. Например, можно пройтись по кругам, выявляя, что же занимает больше всего места.</p>
<p>Круг первый:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/04_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/04_daisydisk-thumb.png" height="313" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Круг второй:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/05_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/05_daisydisk-thumb.png" height="309" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Круг третий:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/06_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/06_daisydisk-thumb.png" height="306" width="499" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>На уровне файлов можно запустить Preview, нажав пробел:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/07_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/07_daisydisk-thumb.png" height="326" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Да, я опечатался, написав &#8220;Треккинг в Непала&#8221;, хочется добавить в стиле юмористов &#8220;начАльника&#8221;. Но перерендерить фильм руки не доходят, тем более, что он только для себя и друзей.</p>
<p>Чтобы перейти на файл или каталог в Finder, достаточно нажать &#8221; ⌘ + Click&#8221;, и по месту решить, что делать с объектом &#8211; удалять или нет:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/08_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/08_daisydisk-thumb.png" height="269" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Если какие-то каталоги недоступны для пользователя, то их просканировать можно, включив режим &#8220;Суперпользователя&#8221;:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/09_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/09_daisydisk-thumb.png" height="145" width="389" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/10_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/10_daisydisk-thumb.png" height="424" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>DaisyDisk сканирует быстро весь диск. Как она это делает? Нет, она не делает это очевидным образом через проход по дереву. Она использует псевдокаталог /.vol, в котором анализирует inode:</p>
<pre>
<small>open:entry DaisyDisk /.vol/234881026/9058507
open:entry DaisyDisk /.vol/234881026/9058511
open:entry DaisyDisk /.vol/234881026/8746896
open:entry DaisyDisk /.vol/234881026/9031043</small>
</pre>
<p>В /.vol первое число обозначает Volume ID (идентификатор файловой системы), а второе &#8211; inode файла. А вот траверс файловой системы на базе inode &#8211; это отдельный вопрос.</p>
<pre>
$ ls -al /.vol/234881026/9058507
<small>total 0
drwx------   3 ctrld  wheel  102 Feb 18 08:58 .
drwxrwxrwt  27 root   wheel  918 Feb 18 17:54 ..
srwx------   1 ctrld  wheel    0 Feb 18 08:58 Render</small>
</pre>
<p><b>Следствие этого механизма сканирования</b>: выполнить нахождение больших файлов внутри каталога FileVault текущего пользователя программа не может, она отображает его как обычный SparseBundle.</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/11_daisydisk2-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/11_daisydisk2-thumb.png" height="304" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Однако решение есть &#8211; нужно просканировать не диск, а конкретный каталог, в итоге его содержимое будет проанализировано:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/02/12_daisydisk-full.png"  class="image-link" rel="lightbox[3437]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/02/12_daisydisk-thumb.png" height="289" width="499" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Программа проста, но тем не менее полезна. На мой взгляд она стоит каждого доллара из $19.95. Рекомендую.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3437/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Схемы разделов в Mac OS X. GUID partition table. Часть 2 (Partition Table Header)</title>
		<link>http://theapplegeek.ru/archives/1973</link>
		<comments>http://theapplegeek.ru/archives/1973#comments</comments>
		<pubDate>Mon, 23 Nov 2009 06:25:34 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[disk]]></category>
		<category><![CDATA[filesystems]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=1973</guid>
		<description><![CDATA[В предыдущей статье &#8220;Схемы разделов в Mac OS X. GUID partition table. Часть 1 (MBR)&#8221; мы рассмотрели &#8220;Protective MBR&#8221;. Сегодня займёмся следующей структурой &#8211; Partition Table Header. Напомню, что я использую такие спецификации: Extensible Firmware Interface Specification 1.10, раздел 11.2.2, страница 367. UEFI Specification Version 2.3, раздел 5 &#8220;GUID Partition Table (GPT) Format&#8221;, страница 91. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://theapplegeek.ru/wp-content/uploads/2009/11/01_guid_pth-thumb1.png" height="131" align="right" width="150" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>В предыдущей статье &#8220;<a href="http://theapplegeek.ru/archives/1428" >Схемы разделов в Mac OS X. GUID partition table. Часть 1 (MBR)</a>&#8221; мы рассмотрели &#8220;Protective MBR&#8221;. Сегодня займёмся следующей структурой &#8211; Partition Table Header.</p>
<p>Напомню, что я использую такие спецификации:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.intel.com/technology/efi/main_specification.htm" >Extensible Firmware Interface Specification 1.10</a></noindex>, раздел 11.2.2, страница 367.</li>
<li><noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.uefi.org/specs/" >UEFI Specification Version 2.3</a></noindex>, раздел 5 &#8220;GUID Partition Table (GPT) Format&#8221;, страница 91.</li>
</ul>
<p>В нулевом блоке на диске находится Protective MBR. В следующем же &#8211; GUID Partition Table Header. Это структура, описывающая различные данные по диску, включая GUID для уникальной идентификации диска, адрес стартового блока массива записей о разделах, размер записи в этом массиве и т.д.</p>
<p><span id="more-1973"></span></p>
<p>Формат описан в таблице:</p>
<table cellspacing="1" cellpadding="4" border="0" id="kbtable">
<tbody>
<tr id="kbheader">
<td>Mnemonic</td>
<td>Byte</td>
<td>Length</td>
<td>Description</td>
</tr>
<tr id="odd">
<td>Signature</td>
<td>0</td>
<td>8</td>
<td>Identifies EFI-compatible partition table header. This value must contain the string “EFI PART,” 0&#215;5452415020494645.</td>
</tr>
<tr id="even">
<td>Revision</td>
<td>8</td>
<td>4</td>
<td>The revision number for this header. This revision value is not related to the UEFI Specification version. This header is version 1.0, so the correct value is 0&#215;00010000.</td>
</tr>
<tr id="odd">
<td>HeaderSize</td>
<td>12</td>
<td>4</td>
<td>Size in bytes of the GUID Partition Table Header. The HeaderSize must be greater than 92 and must be less than or equal to the logical block size.</td>
</tr>
<tr id="even">
<td>HeaderCRC32</td>
<td>16</td>
<td>4</td>
<td>CRC32 checksum for the GUID Partition Table Header structure. This value is computed by setting this field to 0, and computing the 32-bit CRC for HeaderSize bytes.</td>
</tr>
<tr id="odd">
<td>Reserved</td>
<td>20</td>
<td>4</td>
<td>Must be zero.</td>
</tr>
<tr id="even">
<td>MyLBA</td>
<td>24</td>
<td>8</td>
<td>The LBA that contains this data structure.</td>
</tr>
<tr id="odd">
<td>AlternateLBA</td>
<td>32</td>
<td>8</td>
<td>LBA address of the alternate GUID Partition Table Header.</td>
</tr>
<tr id="even">
<td>FirstUsableLBA</td>
<td>40</td>
<td>8</td>
<td>The first usable logical block that may be used by a partition described by a GUID Partition Entry.</td>
</tr>
<tr id="odd">
<td>LastUsableLBA</td>
<td>48</td>
<td>8</td>
<td>The last usable logical block that may be used by a partition described by a GUID Partition Entry.</td>
</tr>
<tr id="even">
<td>DiskGUID</td>
<td>56</td>
<td>16</td>
<td>GUID that can be used to uniquely identify the disk.</td>
</tr>
<tr id="odd">
<td>PartitionEntryLBA</td>
<td>72</td>
<td>8</td>
<td>The starting LBA of the GUID Partition Entry array.</td>
</tr>
<tr id="even">
<td>NumberOfPartitionEntries</td>
<td>80</td>
<td>4</td>
<td>The number of Partition Entries in the GUID Partition Entry array.</td>
</tr>
<tr id="odd">
<td>SizeOfPartitionEntry</td>
<td>84</td>
<td>4</td>
<td>The size, in bytes, of each the GUID Partition Entry structures in the GUID Partition Entry array. Must be a multiple of 8.</td>
</tr>
<tr id="even">
<td>PartitionEntryArrayCRC32</td>
<td>88</td>
<td>4</td>
<td>The CRC32 of the GUID Partition Entry array. Starts at PartitionEntryLBA and is computed over a byte length of NumberOfPartitionEntries * SizeOfPartitionEntry.</td>
</tr>
<tr id="odd">
<td>Reserved</td>
<td>92</td>
<td>BlockSize – 92</td>
<td>The rest of the block is reserved by UEFI and must be zero.</td>
</tr>
</tbody>
</table>
<p>За время, прошедшее <a href="http://theapplegeek.ru/archives/1428" >с прошлой статьи о GPT</a>, диск, на котором я ставил эксперименты, успел уйти под другие задачи, поэтому продолжим на флеш-драйве 8GB с GUID, разбитом на два раздела:</p>
<pre>
$ diskutil list /dev/disk3
/dev/disk3
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *8.0 GB     disk3
   1:                        EFI                         209.7 MB   disk3s1
   2:                  Apple_HFS Flash1                  4.0 GB     disk3s2
   3:                  Apple_HFS Flash2                  3.6 GB     disk3s3
</pre>
<p>Считываем Partition Table Header:</p>
<pre>
sudo dd if=/dev/disk3 of=/dev/stdout bs=512 count=1 skip=1 2>/dev/null | hexdump -C
00000000  45 46 49 20 50 41 52 54  00 00 01 00 5c 00 00 00  |EFI PART....\...|
00000010  9b 3c cb 8f 00 00 00 00  01 00 00 00 00 00 00 00  |.<..............|
00000020  ff 5f ef 00 00 00 00 00  22 00 00 00 00 00 00 00  |._......".......|
00000030  de 5f ef 00 00 00 00 00  0d 70 a7 c1 50 34 a3 40  |._.......p..P4.@|
00000040  99 45 46 0a 87 cf 8c 9a  02 00 00 00 00 00 00 00  |.EF.............|
00000050  80 00 00 00 80 00 00 00  25 4d a5 b6 00 00 00 00  |........%M......|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200
</pre>
<p>Напомню, что BlockSize не обязательно 512, его можно узнать для каждого конкретного случая через вызов ioctl с селектором DKIOCGETBLOCKSIZE - программу я привёл в статье "<a href="http://theapplegeek.ru/archives/1390" >Получение информации по диску через ioctl</a>". На нашем диске BlockSize=512.</p>
<ul>
<li>00-07 (0x00-0x07) 8 байт. Signature. 45 46 49 20 50 41 52 54 = "EFI PART".</li>
<li>08-11 (0x08-0x0B) 4 байт. Revision. 00 00 01 00 = 0x00010000 = Номер ревизии 1.0.</li>
<li>12-15 (0x0C-0x0F) 4 байт. HeaderSize. 5c 00 00 00 = 0x0000005c = 92 байтов.</li>
<li>16-19 (0x10-0x13) 4 байт. HeaderCRC32. 9b 3c cb 8f. Для того, чтобы вычислить CRC32, в это поле записываются нули, после чего CRC32 считается для блока размером HeaderSize, т.е. для 92 байт.</li>
</ul>
<p>Для вычисления CRC32 я воспользовался <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://c.snippets.org/snip_lister.php?fname=crc_32.c" >кодом на C</a></noindex>. Пожалуй, отдельно напишу программу для разбора GPT, сейчас же воспользуюсь скомпилированным кодом и <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://ridiculousfish.com/hexfiend/" >Hex Fiend</a></noindex> для "обнуления".</p>
<p>Считываем нужный нам блок в файл 1.dump:</p>
<pre>
$ sudo dd if=/dev/disk3 of=1.dump bs=512 count=1 skip=1
</pre>
<p>Считываем из него 92 байта и записываем в 2.dump (здесь поле HeaderCRC32 ещё не обнулено):</p>
<pre>
$ sudo dd if=1.dump of=2.dump ibs=1 obs=1 count=92
</pre>
<p>Запускаем Hex Fiend, обнуляем байты 0x10-0x13 и записываем в файл 3.dump:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/11/02_guid_pth-full.png"  class="image-link" rel="lightbox[1973]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/11/02_guid_pth-thumb.png" height="175" width="361" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>В HeaderCRC32 было значение 9B 3C CB 8F = 0x8FCB2C9B. Запускаем вычисление CRC32:</p>
<pre>
$ ./crc_32 3.dump
FFFFFFFF8FCB3C9B      92 3.dump
</pre>
<p>Что и требовалось доказать, CRC32 верен.</p>
<ul>
<li>20-23 (0x14-0x17) 4 байт. Reserved. 00 00 00 00. Все нули.</li>
<li>24-31 (0x18-0x1F) 8 байт. MyLBA. 01 00 00 00 00 00 00 00. Да, Partition Table Header начинается с 1-го блока (а MBR protective - с 0-го).</li>
<li>32-39 (0x20-0x27) 8 байт. AlternateLBA. ff 5f ef 00 00 00 00 00 = 0xEF5FFF = 15687679. Адрес альтернативной Partition Table Header. Детальнее смотрите описание к LastUsableLBA.</li>
</ul>
<p>Проверим, действительно ли по адресу AlternateLBA находится Partition Table Header:</p>
<pre>
$ dd if=/dev/disk3 of=/dev/stdout bs=512 count=1 skip=15687679 2>/dev/null | hexdump -C
00000000  45 46 49 20 50 41 52 54  00 00 01 00 5c 00 00 00  |EFI PART....\...|
00000010  fc 0d 5b f0 00 00 00 00  ff 5f ef 00 00 00 00 00  |..[......_......|
00000020  01 00 00 00 00 00 00 00  22 00 00 00 00 00 00 00  |........".......|
00000030  de 5f ef 00 00 00 00 00  0d 70 a7 c1 50 34 a3 40  |._.......p..P4.@|
00000040  99 45 46 0a 87 cf 8c 9a  df 5f ef 00 00 00 00 00  |.EF......_......|
00000050  80 00 00 00 80 00 00 00  25 4d a5 b6 00 00 00 00  |........%M......|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200
</pre>
<p>Да, так и есть, это копия PTH.</p>
<ul>
<li>40-47 (0x28-0x2F) 8 байт. FirstUsableLBA. 22 00 00 00 00 00 00 00 = 0x22. Посмотрите, как вычисляется размер массива Partition Entry в описании поля SizeOfPartitionEntry. Первый блок на диске занят под Protective MBR, второй - под Partition Entry Header, затем в 0x20 блоках находится Partition Entry Array, т.е. занято 0x22 блока. Адресация блоков начинается с нуля, значит разделы можно располагать на диске, начиная с блока 0x22.</li>
<li>48-55 (0x30-0x37) 8 байт. LastUsableLBA. de 5f ef 00 00 00 00 00 = 0xEF5FDE = 15687646. Последний блок, который можно использовать под разделы.</li>
</ul>
<p>Давайте посмотрим причину. Размер диска посмотрим в diskutil:</p>
<pre>
$ diskutil info /dev/disk3 | grep "Total Size:"
   Total Size:               8.0 GB (8032092160 Bytes) (exactly 15687680 512-Byte-Blocks)

TotalDiskSize = 15687680 = 0xEF6000
LastUsableLBA = 15687646 = 0xEF5FDE
AlternateLBA  = 15687679 = 0xEF5FFF
</pre>
<p>Схема GPT Partition Table показана на рисунке:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/11/03_guid_pth-full.png"  class="image-link" rel="lightbox[1973]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/11/03_guid_pth-thumb.png" height="267" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Alternate Partition Table Header находится в последнем блоке на диске, нумерация с нуля, т.е. она находится в блоке (TotalDiskSize - 1) = 0xEF6000 - 1 = 0xEF5FFF. Так и есть, этот адрес мы видели в поле AlternateLBA.</p>
<p>Перед Alternate Partition Table Header располагается копия Partition Entry Array размером 0x20 (смотрите комментарий к SizeOfPartitionEntry). 0xEF5FFF - 0x20 = 0xEF5FDF. Т.е. Partition Entry Array начинается с блока 0xEF5FDF, а последний блок, доступный для разделов, является 0xEF5FDE, и это значение мы видели в поле LastUsableLBA.</p>
<ul>
<li>56-71 (0x38-0x47) 16 байт. DiskGUID. 0d 70 a7 c1 50 34 a3 40 99 45 46 0a 87 cf 8c 9a. К сожалению, пока я не нашёл, как генерируется это поле.</li>
<li>72-79 (0x48-0x4F) 8 байт. PartitionEntryLBA. 02 00 00 00 00 00 00 00 = 2. Массив GUID Partition Entry начинается со второго блока диска.</li>
<li>80-83 (0x50-0x53) 4 байт. NumberOfPartitionEntries. 80 00 00 00 = 0x80 = 128. Это максимальное количество разделов на диске.</li>
<li>84-87 (0x54-0x57) 4 байт. SizeOfPartitionEntry. 80 00 00 00 = 0x80 = 128 байт. Размер каждой записи Partition Entry равен 128 байт. Имея размер массива разделов и размер записи, получаем размер массива. 0x80 x 0x80 = 0x4000 = 16384 байт = 32 блока = 0x20</li>
<li>88-91 (0x58-0x5B) 4 байт. PartitionEntryArrayCRC32. 25 4d a5 b6 = 0xB6A54D25.</li>
</ul>
<p>PartitionEntryArray начинается со второго блока и его размер 0x20 = 32 блоков:</p>
<pre>
$ sudo dd if=/dev/disk3 of=pea1.dump bs=512 count=32 skip=2
</pre>
<p>Проверяем CRC32:</p>
<pre>
$ ./crc_32 pea1.dump
FFFFFFFFB6A54D25   16384 pea1.dump
</pre>
<p>Вычисленное CRC32 совпадает с записанным в PartitionEntryArrayCRC32, всё верно.</p>
<ul>
<li>92-BlockSize (0x5C-0x1FF) 512-92=420 байт. Reserved. 00 ... 00. Все нули.</li>
</ul>
<p>Partition Table Header мы разобрали, в следующей части (последней) разберём Partition Entry Array. Заодно попробую найти, как генерируется DiskGUID.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/1973/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Производительность FileVault при параллельной файловой активности</title>
		<link>http://theapplegeek.ru/archives/1915</link>
		<comments>http://theapplegeek.ru/archives/1915#comments</comments>
		<pubDate>Wed, 18 Nov 2009 12:21:40 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[filesystems]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=1915</guid>
		<description><![CDATA[Вчера я рассмотрел производительность файловых операций при включенном и выключенном FileVault без дополнительной нагрузки. Для полноты картины я решил хоть слегка приблизиться к схеме типичного использования компьютера &#8211; ведь редко бывают ситуации, когда файловые операции не идут параллельно. Если запущен браузер и, например, torrent-клиент, то и первый, и особенно второй активно обращаются к диску. Поэтому [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://theapplegeek.ru/wp-content/uploads/2009/11/01_filevaultbench2-full.png"  class="image-link" rel="lightbox[1915]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/11/01_filevaultbench2-thumb.png" height="251" align="right" width="251" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></a></p>
<p>Вчера <a href="http://theapplegeek.ru/archives/1905" >я рассмотрел производительность файловых операций</a> при включенном и выключенном FileVault без дополнительной нагрузки. Для полноты картины я решил хоть слегка приблизиться к схеме типичного использования компьютера &#8211; ведь редко бывают ситуации, когда файловые операции не идут параллельно. Если запущен браузер и, например, torrent-клиент, то и первый, и особенно второй активно обращаются к диску.</p>
<p>Поэтому я запустил сканирование файловой системы с чтением из каждого найденного файла 100 блоков (51200 байт) и записью их в один файл. И параллельно запустил бенчмаркинг iozone.</p>
<p><span id="more-1915"></span></p>
<p>Основной скрипт mainread.sh:</p>
<pre>
#!/bin/bash
while true ;
do
	find / -type f -print -exec /Users/test/read.sh {} \;
done
</pre>
<p>Вспомогательный скрипт read.sh:</p>
<pre>
#!/bin/sh
dd if="$1" of=/Users/test/tmp/test.bin count=100 2> /dev/null
</pre>
<p>Результат представлен ниже. Я добавил <a href="http://theapplegeek.ru/archives/1905" >во вчерашнюю таблицу</a> данные по работе с параллельной нагрузкой:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/11/02_filevaultbench2-full.png"  class="image-link" rel="lightbox[1915]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/11/02_filevaultbench2-thumb.png" height="363" width="499" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/11/03_filevaultbench2-full.png"  class="image-link" rel="lightbox[1915]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/11/03_filevaultbench2-thumb.png" height="232" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Результаты интересны &#8211; при включенном FileVault производительность даже лучше (я перепроверил, файлы не перепутаны). Т.е. видно, что активно используется буферизирование данных SparseBundle. Следующий шаг &#8211; включение FileVault для своего домашнего каталога.</p>
<p><br class='final-break' style='clear: both' /></p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/1915/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Влияние FileVault на производительность файловых операций</title>
		<link>http://theapplegeek.ru/archives/1905</link>
		<comments>http://theapplegeek.ru/archives/1905#comments</comments>
		<pubDate>Tue, 17 Nov 2009 15:31:07 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[filesystems]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=1905</guid>
		<description><![CDATA[Уже года полтора, проезжая по ул. Глыбочицкой возле магазина Эльдорадо, на офисе страховой компании &#8220;N&#8221; я вижу огромное объявление о том, что из автомобиля украден ноутбук, но ворам предлагают полную стоимость ноутбука в обмен на его возвращение. Объявление уже растрёпано и части его нет. Я сомневаюсь, что ноутбук вернули. В этом случае железо по сравнению [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://theapplegeek.ru/wp-content/uploads/2009/11/01_filevaultbench-full.png"  class="image-link" rel="lightbox[1905]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/11/01_filevaultbench-thumb.png" height="251" align="right" width="251" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></a></p>
<p>Уже года полтора, проезжая по ул. Глыбочицкой возле магазина Эльдорадо, на офисе страховой компании &#8220;N&#8221; я вижу огромное объявление о том, что из автомобиля украден ноутбук, но ворам предлагают полную стоимость ноутбука в обмен на его возвращение. Объявление уже растрёпано и части его нет. Я сомневаюсь, что ноутбук вернули. В этом случае железо по сравнению с данными стоит копейки. Вариант полной потери данных рассматривать не будет &#8211; конечно же, бекапы нужно иметь обязательно (причём диск с ними не должен храниться в сумке с ноутбуком). Давайте подумаем о том, что к данным может получить доступ злоумышленник &#8211; либо конкурент, либо просто &#8220;интересующийся&#8221;, который может использовать данные в своих целях. Страшно представить, если на ноутбуке хранятся базы данных по персональным данным и кредитным картам клиентов.</p>
<p>Неискушённые люди думают, что пароль на вход в систему (а скорее всего его нет) может спасти данные от чужих глаз. Да, но замок спасает от честных людей &#8211; воры его взломают за секунды. И что дальше? Имея физический доступ, можно не напрягаясь сбросить пароль входа в Mac OS X или получить административный доступ за 5 минут. А уже администратор получит доступ ко всем данным, если они находятся в открытом виде.</p>
<p><span id="more-1905"></span></p>
<p>Здесь на помощь приходит штатная технология <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://docs.info.apple.com/article.html?path=Mac/10.6/ru/8727.html" >FileVault</a></noindex>. Домашний каталог находится в зашифрованном по <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/Advanced_Encryption_Standard" >алгоритму AES-128</a></noindex> образе SparseBundle (в 10.5 для удобства резервного копирования через TimeMachine от монолитных образов Sparse Image перешли к набору файлов по 8 MB). К сожалению, для того, чтобы Time Machine провела резервное копирование каталога FileVault, нужно выйти из системы (сделать logout, а не shutdown).</p>
<p>Меня сдерживали от перехода на FileVault логичные мысли о уменьшении производительности файловых операций. Это был голос здравого смысла, но пришло время узнать, насколько замедляет работу системы включение FileVault.</p>
<p>Для тестирования я создал двух пользователей &#8211; одного с включённым FileVault, второго &#8211; с обычным домашним каталогом. Для каждого из них я по очереди запустил утилиту <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.iozone.org/" >IOZone</a></noindex> (это кроссплатформенная утилита с открытыми исходными кодами, она работает как на Unix, так и на Windows).</p>
<p>Описание тестов есть <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.iozone.org/docs/IOzone_msword_98.pdf" >в документации IOZone (PDF)</a></noindex>. В заголовке указаны размеры блоков от 64 до 16384 KB, на которых производится тестирование. Значения приведены в KB в секунду. &#8220;8192 On&#8221; &#8211; тест при включённом FileVault, &#8220;8192 Off&#8221; &#8211; с выключенным. В процентах сравнивается разница в производительности между включенным и выключенным FileVault &#8211; 116% обозначает потеря 16% производительности на FileVault. Запуск: &#8220;/opt/local/bin/iozone -aRb fv1.xls&#8221;.</p>
<p>Результаты для размера файла 8196 KB (таблицу можно увеличить):</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/11/02_filevaultbench-full.png"  class="image-link" rel="lightbox[1905]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/11/02_filevaultbench-thumb.png" height="360" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>В среднем падение производительности для размера файла 8196 составило от 0 до 12%.</p>
<p>Результаты для размера файла 524288 KB:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/11/03_filevaultbench-full.png"  class="image-link" rel="lightbox[1905]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/11/03_filevaultbench-thumb.png" height="446" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>В среднем падение производительности минимально, есть даже эффект кеширования, когда производительность улучшается (пример &#8211; Record Rewrite Test). Занятость CPU было не слишком значительным, к сожалению, у меня не было возможности произвести интервальные измерения.</p>
<p>Резюме. На тестах IOZone потеря производительности FileVault не настолько значительна, как казалось, средние 12% это отличная плата за безопасность данных.</p>
<p>Теперь мне осталось перейти на FileVault и проверить реальную работу системы при включенном FileVault. Проведённые тесты были в идеальных условиях, интересно будет посмотреть производительность при параллельном доступе различных программ к данным.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/1905/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Схемы разделов в Mac OS X. GUID partition table. Часть 1 (MBR)</title>
		<link>http://theapplegeek.ru/archives/1428</link>
		<comments>http://theapplegeek.ru/archives/1428#comments</comments>
		<pubDate>Wed, 28 Oct 2009 15:57:47 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[boot]]></category>
		<category><![CDATA[filesystems]]></category>
		<category><![CDATA[system]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=1428</guid>
		<description><![CDATA[Как я писал ранее, схема разделов Apple Partition Map не приспособлена к использованию на больших дисках &#8211; из-за 32-битных счётчиков максимальный размер диска при размере блока 512 байт может быть лишь 2 TB. Apple серьёзно прорабатывала возможность адаптации Apple Partition Map для поддержки больших дисков, однако требуемые изменения привели бы к неработоспособности всех инструментов, работающих [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://theapplegeek.ru/wp-content/uploads/2009/10/01_gpt_mbr-full.png"  class="image-link" rel="lightbox[1428]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/10/01_gpt_mbr-thumb.png" height="131" align="right" width="150" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></a></p>
<p><a href="http://theapplegeek.ru/archives/1370" >Как я писал ранее</a>, схема разделов Apple Partition Map не приспособлена к использованию на больших дисках &#8211; из-за 32-битных счётчиков максимальный размер диска при размере блока 512 байт может быть лишь 2 TB.</p>
<p>Apple серьёзно прорабатывала возможность адаптации Apple Partition Map для поддержки больших дисков, однако требуемые изменения привели бы к неработоспособности всех инструментов, работающих с разделами, поэтому было принято разумное решение переключиться на принципиально новую схему. После серьёзных размышлений Apple решила использовать GPT.</p>
<p>Схема разделов <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/GUID_Partition_Table" >GUID partition table</a></noindex> (GPT) была представлена Intel как часть реализации комплексной задачи по переходу на современное firmware для Intel-совместимых компьютеров. Традиционно на них было установлено firmware <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/BIOS" >BIOS</a></noindex>, использующее схему разделов <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/Master_boot_record" >Master Boot Record</a></noindex> (MBR). Схема MBR имела большое количество ограничений, не позволяющих использовать её на современных компьютерах. Для преодоления этих ограничений компания Intel разработала современное firmware <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/Extensible_Firmware_Interface" >Extensible Firmware Interface</a></noindex> (EFI), включающее в себя новую схему разделов GPT.</p>
<p><span id="more-1428"></span></p>
<p>Одним из больших преимуществ схемы GPT было то, что она была закреплена в формальных стандартах (документы доступны для списывания):</p>
<ul>
<li><noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.intel.com/technology/efi/main_specification.htm" >Extensible Firmware Interface Specification 1.10</a></noindex>, раздел 11.2.2, страница 367.</li>
<li><noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.uefi.org/specs/" >UEFI Specification Version 2.3</a></noindex>, раздел 5 &#8220;GUID Partition Table (GPT) Format&#8221;, страница 91.</li>
</ul>
<p>В статье я использую такие источники:</p>
<ul>
<li>&#8220;<noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://developer.apple.com/mac/library/technotes/tn2006/tn2166.html" >Technical Note TN2166. Secrets of the GPT.</a></noindex>&#8220;</li>
<li><noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://osxbook.com/" >Книга &#8220;Mac OS X Internals. A Systems Approach&#8221;.</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.mactech.com/articles/mactech/Vol.23/23.03/APMtoGPT/index.html" >Apple’s Transition from Apple Partition Map to the GUID Partition Tabl</a></noindex></li>
<li>Стандарт &#8220;<noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.intel.com/technology/efi/main_specification.htm" >Extensible Firmware Interface Specification 1.10</a></noindex>&#8220;</li>
<li>Стандарт &#8220;<noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.uefi.org/specs/" >UEFI Specification Version 2.3</a></noindex>&#8220;</li>
</ul>
<p>Вопрос о GPT не помещается в одну статью, поэтому я разобью его на три части:</p>
<ol>
<li><a href="http://theapplegeek.ru/archives/1428" >Protective MBR</a></li>
<li>Partition Table Header</li>
<li>Partition Entry Array</li>
</ol>
<h2>Обзор GPT</h2>
<p>GPT простая, но эффективная схема разделов. Общая схема использования блоков показана в таблице (n &#8211; количество блоков на диске, b &#8211; количество блоков, использующихся для описания массива с записями о разделах, обычно 32):</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/10/02_gpt_mbr-full.png"  class="image-link" rel="lightbox[1428]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/10/02_gpt_mbr-thumb.png" height="228" width="366" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Меня лично восхитил блок 0 &#8220;Protective MBR&#8221; &#8211; это отличная &#8220;защита от дурака&#8221;. В нём в формате MBR вся область, используемая под схему разделов GPT и разделы GPT определены, как один раздел. Таким образом программы работы с разделами, ничего не знающие о GPT, не смогут случайно ничего изменить (конечно же, от намеренного изменения никто защитить не сможет). Такие программы видят диск GPT, как диск MBR с одним разделом неизвестного типа (0xEE).</p>
<p>GPT использует логическую адресацию блоков на диске <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/Logical_block_addressing" >Logical Block Addressing</a></noindex> (LBA) в отличие от старой адресации  <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/Cylinder-head-sector" >Cylinder-Head-Sector</a></noindex> (CHS). Размер блока обычно 512 байт, но он может быть и другим. Штатных утилит для просмотра размера блока я не нашёл, <a href="http://theapplegeek.ru/archives/1390" >поэтому использую программу</a> из книги &#8220;Mac OS X Internals&#8221; &#8211; для моего диска он действительно 512 байт.</p>
<p>В графическом виде GPT <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/GUID_Partition_Table" >выглядит так</a></noindex> (128 разделов &#8211; столько зарезервировано в Windows 2003 Server, насчёт Mac OS X посмотрим дальше):</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/10/03_gpt_mbr-full.png"  class="image-link" rel="lightbox[1428]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/10/03_gpt_mbr-thumb.png" height="520" width="395" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Для экспериментов будем использовать USB-диск со схемой разделов GPT и двумя разделами:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/10/04_gpt_mbr-full.png"  class="image-link" rel="lightbox[1428]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/10/04_gpt_mbr-thumb.png" height="357" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<h2>LBA 0. Protective MBR</h2>
<p>Формат MBR описан в таблице (из Unified Extensible Firmware Interface Specification):</p>
<table cellspacing="1" cellpadding="4" border="0" id="kbtable">
<tbody>
<tr id="kbheader">
<td>Mnemonic</td>
<td>Byte</td>
<td>Length</td>
<td>Description</td>
</tr>
<tr id="odd">
<td>BootCode</td>
<td>0</td>
<td>440</td>
<td>Code used on a legacy system to select a partition record and load the first block (sector) of the partition pointed to by the partition record. This code is not executed on UEFI systems.</td>
</tr>
<tr id="even">
<td>UniqueMBRSignature</td>
<td>440</td>
<td>4</td>
<td>Unique Disk Signature, this is an optional feature and not on all hard drives. This value is always written by the OS and is never written by EFI firmware.</td>
</tr>
<tr id="odd">
<td>Unknown</td>
<td>444</td>
<td>2</td>
<td>Unknown</td>
</tr>
<tr id="even">
<td>PartitionRecord</td>
<td>446</td>
<td>16*4</td>
<td>Array of four legacy MBR partition records (смотри следующую таблицу).</td>
</tr>
<tr id="odd">
<td>Signature</td>
<td>510</td>
<td>2</td>
<td>Must be 0xaa55 (i.e., byte 510 contains 0&#215;55 and byte 511 contains 0xaa).</td>
</tr>
<tr id="even">
<td>Reserved</td>
<td>512</td>
<td>BlockSize &#8211; 512</td>
<td>The rest of the logical block, if any, is reserved.</td>
</tr>
</tbody>
</table>
<p>PartitionRecord описан в следующей таблице. В описании указан общий формат, а после пометки GPT то, что должно быть для Protective MBR.</p>
<table cellspacing="1" cellpadding="4" border="0" id="kbtable">
<tbody>
<tr id="kbheader">
<td>Mnemonic</td>
<td>Byte</td>
<td>Length</td>
<td>Description</td>
</tr>
<tr id="odd">
<td>BootIndicator</td>
<td>0</td>
<td>1</td>
<td>Not used by EFI firmware. 0&#215;80 indicates that this is the bootable legacy partition. (GPT) Must be set to zero to indicate nonbootable partition.</td>
</tr>
<tr id="even">
<td>StartingCHS</td>
<td>1</td>
<td>3</td>
<td>Start of partition in CHS address format, not used by EFI firmware. (GPT) Must be 0&#215;000200, corresponding to the StartingLBA.</td>
</tr>
<tr id="odd">
<td>OSType</td>
<td>4</td>
<td>1</td>
<td>Type of partition. 0xEF defines an EFI system partition. 0xEE is used by a protective MBR (Table 12) to define a fake partition covering the entire disk. Other values are used by legacy operating systems, and are allocated independently of the UEFI specification. (GPT) Must be 0xEE.</td>
</tr>
<tr id="even">
<td>EndingCHS</td>
<td>5</td>
<td>3</td>
<td>End of partition in CHS address format, not used by EFI firmware. (GPT) Set to the CHS address of the last logical block on the disk. Must be set to 0xFFFFFF if it is not possible to represent the value in these fields.</td>
</tr>
<tr id="odd">
<td>StartingLBA</td>
<td>8</td>
<td>4</td>
<td>Starting LBA of the partition on the disk. Used by EFI firmware to define the start of the partition. (GPT) Must be 0&#215;00000001.</td>
</tr>
<tr id="even">
<td>SizeInLBA</td>
<td>12</td>
<td>4</td>
<td>Size of the partition in LBA units of logical blocks. Used by EFI firmware to determine the size of the partition. (GPT) Size of the disk minus one. Set to 0xFFFFFFFF if the size of the disk is too large to be represented in this field.</td>
</tr>
</tbody>
</table>
<p>Первый (нулевой) блок содержит такие данные:</p>
<pre>
$ sudo dd if=/dev/disk4 of=/dev/stdout bs=512 count=1 skip=0 2&gt;/dev/null | hexdump -C
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 fe  |................|
000001c0  ff ff ee fe ff ff 01 00  00 00 af ea 42 25 00 00  |............B%..|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200
</pre>
<ul>MBR:</p>
<li>0000 440 bytes. BootCode. Все нули.</li>
<li>01B8 4 bytes. UniqueMBRSignature. 00 00 00 00.</li>
<li>01BC 2 bytes. Unknown. 00 00.</li>
<li>01BE 64 bytes. PartitionRecord (4 x 16-ти байтовых записей в формате IBM Partition Table). 00 fe ff ff ee fe ff ff 01 00 00 00 af ea 42 25</li>
<li>01FE 2 bytes. MBR signature (0xAA55). 55 AA &#8211; в обратной нотации (<noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/Master_boot_record#cite_note-endianness-0" >так уж повелось</a></noindex>).</li>
<li>Если размер блока больше 512 байт, то остальное &#8211; Reserved. Для нашего случая блок &#8211; 512</li>
</ul>
<ul>Рассмотрим информацию о разделе (00 fe ff ff ee fe ff ff 01 00 00 00 af ea 42 25)</p>
<li>0&#215;00 1 byte. <i>BootIndicator (0&#215;80 = bootable/active, 0&#215;00 = non-bootable, other = invalid).</i> 00 &#8211; non-bootable.</li>
<li>0&#215;01 3 bytes. <i><noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/Cylinder-head-sector" >StartingCHS</a></noindex>.</i> fe ff ff. Это древняя жуть, не будем искать разгадку &#8211; кто знает, куда нас заведёт это знание? Хорошо, что в EFI это не используется.</li>
<li>0&#215;04 1 byte. <i>OSType.</i> <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.win.tue.nl/~aeb/partitions/partition_types-1.html" >Есть хороший ресурс</a></noindex> со всеми типами разделов. 0xEE = Indication that this legacy MBR is followed by an EFI header.</li>
<li>0&#215;05 3 bytes. <i>EndingCHS.</i> fe ff ff. Аналогично.</li>
<li>0&#215;08 4 bytes. <i>StartingLBA.</i> 01 00 00 00 в обратной нотации читается как 00 00 00 01. Вспоминаем таблицу &#8211; &#8220;Must be 0&#215;00000001&#8243;.</li>
<li>0x0C 4 bytes. <i>SizeInLBA in <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://en.wikipedia.org/wiki/Endianness#Little-endian" >little-endian format</a></noindex>.</i> af ea 42 25 = 0x2542eaaf = 625142447 блоков</li>
</ul>
<p>Для проверки количества блоков посмотрим информацию по диску:</p>
<pre>
$ diskutil info disk4 | grep "Total Size"
   Total Size:               320.1 GB (320072933376 Bytes) (exactly 625142448 512-Byte-Blocks)
</pre>
<p>Количество блоков в разделе 625142447, один блок &#8211; MBR, что даёт требуемое количество блоков на диске 625142448. В итоге программы, знающие только об MBR будут действительно видеть диск MBR с одним разделом типа 0xEE.</p>
<p><b>To be continued&#8230;</b></p>
<p>В следующей части разберём &#8220;Partition Table Header&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/1428/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Apple Partition Map. Формат &#8220;Universal CD&#8221;</title>
		<link>http://theapplegeek.ru/archives/1386</link>
		<comments>http://theapplegeek.ru/archives/1386#comments</comments>
		<pubDate>Mon, 26 Oct 2009 15:08:19 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[boot]]></category>
		<category><![CDATA[filesystems]]></category>
		<category><![CDATA[system]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=1386</guid>
		<description><![CDATA[В предыдущей статье я привёл описание раскладки разделов &#8220;Universal HD&#8221; для Apple Partition Map. Спасибо @akaDimiG &#8211; он натолнул меня на мысль посмотреть на таблицу разделов на установочном диске Mac OS X. Здесь используется раскладка APM &#8220;Universal CD&#8221;. Mac OS X 10.5 Install DVD $ pdisk /dev/rdisk3 -dump Partition map (with 2048 byte blocks) on [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://theapplegeek.ru/wp-content/uploads/2009/10/01_apm-thumb11.png" height="131" align="right" width="150" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p><a href="http://theapplegeek.ru/archives/1370" >В предыдущей статье</a> я привёл описание раскладки разделов &#8220;Universal HD&#8221; для Apple Partition Map. Спасибо <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://twitter.com/akaDimiG" >@akaDimiG</a></noindex> &#8211; он натолнул меня на мысль посмотреть на таблицу разделов на установочном диске Mac OS X. Здесь используется раскладка APM &#8220;Universal CD&#8221;.</p>
<h2>Mac OS X 10.5 Install DVD</h2>
<pre>
$ pdisk /dev/rdisk3 -dump

Partition map (with 2048 byte blocks) on '/dev/rdisk3'
 #:                type name       length   base    ( size )
 1: Apple_partition_map Apple          15 @ 1
 2:  Apple_Driver_ATAPI Macintosh  302596 @ 16      (591.0M)
 3:           Apple_HFS Mac_OS_X  3756752 @ 302612  (  7.2G)
 4:          Apple_Free                 4 @ 4059364

Device block size=2048, Number of Blocks=4059368 (7.7G)
DeviceType=0x0, DeviceId=0x0
</pre>
<p><span id="more-1386"></span></p>
<h2>Mac OS X 10.4 Install DVD</h2>
<pre>
$ pdisk /dev/rdisk3 -dump

Partition map (with 512 byte blocks) on '/dev/rdisk3'
 #:                type name        length   base     ( size )
 1: Apple_partition_map Apple           63 @ 1
 2:  Apple_Driver_ATAPI*Macintosh        8 @ 64
 3:           Apple_HFS Mac_OS_X  11059160 @ 72       (  5.3G)
 4:          Apple_Free                 10 @ 11059232

Device block size=512, Number of Blocks=11059242 (5.3G)
DeviceType=0x0, DeviceId=0x0
Drivers-
1:   4 @ 64, type=0x701
</pre>
<p>Обратите внимание на раздел 2 (Apple_Driver_ATAPI) &#8211; здесь располагаются драйвера под Mac OS 9 для ATAPI CD.</p>
<p><br class='final-break' style='clear: both' /></p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/1386/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached (user agent is rejected)
Page Caching using memcached (user agent is rejected)
Database Caching 14/55 queries in 0.034 seconds using memcached
Object Caching 780/830 objects using memcached

Served from: theapplegeek.ru @ 2010-07-31 03:00:18 -->