<?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; dtrace</title>
	<atom:link href="http://theapplegeek.ru/archives/tag/dtrace/feed" rel="self" type="application/rss+xml" />
	<link>http://theapplegeek.ru</link>
	<description>Чему ты научился сегодня?</description>
	<lastBuildDate>Sun, 06 May 2012 15:19:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Анализ системных вызовов процессов в Mac OS X с помощью dtruss</title>
		<link>http://theapplegeek.ru/archives/5074</link>
		<comments>http://theapplegeek.ru/archives/5074#comments</comments>
		<pubDate>Wed, 22 Dec 2010 15:20:45 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[dtrace]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=5074</guid>
		<description><![CDATA[dtruss - очень полезная утилита для анализа системных вызовов в Mac OS X]]></description>
			<content:encoded><![CDATA[<p>Помните, я рассказывал <a href="http://theapplegeek.ru/archives/4712" >о пользе strace</a> под Linux для исследования системы и поиска проблем?</p>
<p>Для Mac OS X есть аналогичная утилита на базе DTrace &#8211; <noindex><a rel="nofollow" href="http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/dtruss.1m.html" >dtruss</a></noindex>.</p>
<p>Сегодня при помощи двух команд &#8220;sudo dtruss -n xftpd -f&#8221; и &#8220;sudo tcpdump -i lo0 port 53&#8243; я разобрался в мистической проблеме длительных задержек при заходе на Mac OS X Server по FTP.</p>
<h3>Примеры использования dtruss</h3>
<p>Показать системные вызовы всех xftpd (-n xftpd) с отслеживанием дочерних процессов (-f):</p>
<pre>
$ sudo dtruss -n xftpd -f
<small>	PID/THRD  SYSCALL(args) 		 = return
24804/0x76294:  getpid(0x0, 0x0, 0x0)		 = 24804 0
24804/0x76294:  open_nocancel("/dev/urandom\0", 0x0, 0x0)		 = 3 0
24804/0x76294:  read_nocancel(0x3, "\2315\336\347\3546\355K\230\326r\2534qn\177\377\250;\0353\367\2769=a\363\350\255\032\361\017z\022\367\257;\315\363\vSg\021\"\252\211KSM\0", 0x74)		 = 116 0
24804/0x76294:  close_nocancel(0x3)		 = 0 0
24804/0x76294:  __sysctl(0xBFFFDC4C, 0x3, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  issetugid(0xBFFFDC4C, 0x3, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  geteuid(0xBFFFDC4C, 0x3, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  __sysctl(0xBFFFDC14, 0x2, 0xBFFFDBDC)		 = 0 0
24804/0x76294:  __sysctl(0xBFFFDBDC, 0x2, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  shared_region_check_np(0xBFFFDE30, 0x2, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/usr/lib/libobjc.A.dylib\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/System/Library/Frameworks/Security.framework/Versions/A/Security\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
24804/0x76294:  stat64("/System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos\0", 0xBFFFCF6C, 0xBFFFDC5C)		 = 0 0
...</small>
</pre>
<p>Проанализировать вызовы при запуске программы &#8220;df -k&#8221;:</p>
<pre>
$ sudo dtruss df -k
</pre>
<p>По процессу с нужным pid:</p>
<pre>
$ sudo dtruss -p 1637
</pre>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/5074/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Применение dtrace для поиска файлов, к которым идут активные обращения</title>
		<link>http://theapplegeek.ru/archives/4974</link>
		<comments>http://theapplegeek.ru/archives/4974#comments</comments>
		<pubDate>Tue, 30 Nov 2010 10:09:44 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[dtrace]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=4974</guid>
		<description><![CDATA[<a href="http://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dtrace.1.html">Dtrace</a> - мощная подсистема ядра, позволяющая исследовать работу операционной системы и приложений.]]></description>
			<content:encoded><![CDATA[<p><img src="http://images.theapplegeek.ru/wp-content/uploads/2010/11/instruments_icon1-thumb1.png" height="160" align="right" width="160" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p><noindex><a rel="nofollow" href="http://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dtrace.1.html" >Dtrace</a></noindex> &#8211; мощная подсистема ядра, позволяющая исследовать работу операционной системы и приложений. Я давно к ней не возвращался в статьях, рекомендую почитать &#8220;<a href="http://theapplegeek.ru/archives/358" >Отладка файловой активности процессов с помощью DTrace, или как написать деинсталлятор</a>&#8221; и &#8220;<a href="http://theapplegeek.ru/archives/747" >Поиск метода установки Mac OS X под VMWare Fusion</a>&#8220;. В первой статье есть ссылки для дальнейшего чтения.</p>
<p>Сегодня приведу полезный скрипт, показывающий, к каким файлам шли частые обращения за 10-ти секундный интервал. Скрипт работает непрерывно до его прерывания. Применение &#8211; можно увидеть, почему вдруг увеличилась нагрузка на систему из-за дисковой активности.</p>
<p><span id="more-4974"></span></p>
<p>Скрипт:</p>
<pre>
$ cat 02_openfiles.d
#!/usr/sbin/dtrace -s 

io:::start
{
        @[args[2]->fi_pathname] = count();
}

tick-10s
{
        trunc(@, 10);
        printa(@);
        trunc(@, 0);
}
</pre>
<p>Выставить права на запуск:</p>
<pre>
$ chmod +x 02_openfiles.d
</pre>
<p>Запуск:</p>
<pre>
$ sudo ./02_openfiles.d
</pre>
<p>Второй вариант запуска &#8211; в одну строку:</p>
<pre>
$ sudo dtrace -n 'io:::start {@[args[2]->fi_pathname] = count();} tick-10s {trunc(@, 10); printa(@); trunc(@, 0);}'
</pre>
<p>Пример работы:</p>
<pre>
<small>0 129269                        :tick-10s
??/Logs/FileSyncAgent.log                                         1
??/Russian.lproj/Dictionary.dat                                   1
??/DiagnosticMessages/StoreData                                   3
??/DiagnosticMessages/2010.11.30.asl                              6
??/com.apple.Safari/Cache.db-journal                              8
??/com.apple.Safari/Cache.db                                     51

0 129269                        :tick-10s
??/bands/114                                                      1
??/bands/ef                                                       2
??/Cookies/Cookies.plist_tmp_67927_0.dat                          3
??/bands/115                                                      3
??/bands/a0                                                       3
??/bands/0                                                        4
??/bands/59                                                       5
??/com.apple.Safari/Cache.db-journal                              6
??/com.apple.Safari/Cache.db                                     12
??/unknown (NULL v_parent)/unknown (NULL v_name)                 16</small>
</pre>
<p>По этим примерам можно сказать, что Safari активно пишет в кеш, и система синхронизирует iDisk.</p>
<p>Почему iDisk? /bands/114 указывает на Sparse Bundle Image, Time Machine вне подозрения (TimeCapsule далеко), а поиск find&#8217;ом показал каталог ctrld_iDisk.sparsebundle:</p>
<pre>
$ sudo find / -name 114
<small>/Users/ctrld/Library/FileSync/0025bcdcddae/ctrld_iDisk.sparsebundle/bands/114</small>
</pre>
<p> Указанный пример очень прост, есть гораздо более впечатляющие примеры. Хотите узнать больше? Смотрите <noindex><a rel="nofollow" href="http://hub.opensolaris.org/bin/view/Community+Group+dtrace/WebHome" >OpenSolaris Community Group dtrace</a></noindex>.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/4974/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Поиск метода установки Mac OS X под VMWare Fusion</title>
		<link>http://theapplegeek.ru/archives/747</link>
		<comments>http://theapplegeek.ru/archives/747#comments</comments>
		<pubDate>Fri, 02 Oct 2009 07:36:06 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[dtrace]]></category>
		<category><![CDATA[vmware]]></category>

		<guid isPermaLink="false">http://ctrld.me/?p=747</guid>
		<description><![CDATA[Если вы пытались установить под VMWare Fusion или Parallels Mac OS X, то сталкивались с отказом &#8211; есть возможность установить только Mac OS X Server. Это связано с лицензионным ограничением Apple, и, конечно же, ни VMWare, ни Parallels не хотят подвергать себя риску быть обвинёнными в нарушении Software License Agreement. Интересно самому взглянуть на соглашение, [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both"><img src="http://images.theapplegeek.ru/wp-content/uploads/2009/10/00_vm-thumb.png" height="150" align="right" width="150" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Если вы пытались установить под VMWare Fusion или Parallels Mac OS X, то сталкивались с отказом &#8211; есть возможность установить только Mac OS X Server. Это связано с лицензионным ограничением Apple, и, конечно же, ни VMWare, ни Parallels не хотят подвергать себя риску быть обвинёнными в нарушении Software License Agreement.</p>
<p>Интересно самому взглянуть на соглашение, а не просто принять это на веру &#8211; все Hardware и Software Product Agreements есть <noindex><a rel="nofollow" href="http://www.apple.com/legal/sla/" >на сайте Apple</a></noindex>. Смотрим раздел 2 &#8220;Permitted License Uses and Restrictions&#8221;, жирным текстом я выделил главное.</p>
<p><b><noindex><a rel="nofollow" href="http://images.apple.com/legal/sla/docs/macosx106.pdf" >Mac OS X (Snow Leopard)</a></noindex></b></p>
<blockquote>
<p>A. Single Use License. Subject to the terms and conditions of this License, unless you have purchased a Family Pack or Upgrade license for the Apple Software, you are granted a limited non-exclusive license to install, use and run <b>one (1) copy of the Apple Software on a single Apple-branded computer at a time</b>.</p>
</blockquote>
<p><b><noindex><a rel="nofollow" href="http://images.apple.com/legal/sla/docs/macosx_snowleopard.pdf" >Mac OS X Server (Snow Leopard)</a></noindex></b></p>
<blockquote>
<p>A. Mac OS X Server Software. Subject to the terms and conditions of this License, you are granted a limited non-exclusive license to install and use one copy of the Mac OS X Server software (the “Mac OS X Server Software”) on a single Apple-branded computer. <b>You may also install and use other copies of Mac OS X Server Software on the same Apple-branded computer</b>, provided that you acquire an individual and valid license from Apple for each of these other copies of Mac OS X Server Software.</p>
</blockquote>
<p>Различие налицо. Можно использовать только одну копию Mac OS X на одном компьютере одновременно, а Mac OS X Server &#8211; несколько копий. Именно это и даёт возможность легальной виртуализации Mac OS X Server.</p>
<p>А теперь уйдём на тёмную сторону силы &#8211; рассмотрим, что и почему нужно делать для запуска Mac OS X в виртуальной машине (давайте сделаем вид, что не поняли пункт SLA &#8220;You agree not to install, use or run the Apple Software on any non-Apple-branded computer, or to enable others to do so&#8221; &#8211; ведь мы же работаем на родном Маке, а не Хакинтоше).</p>
<p>Сразу уточню &#8211; для установки под VMWare нужна Retail-версия Mac OS X. Версия, идущая с ноутбуком или же iMac, не подходит &#8211; Installer Mac OS X проверяет аппаратную часть, и не разрешает установку на другом оборудовании (а Model name &#8220;VMware Virtual Platform&#8221; &#8211; это совсем не &#8220;MacBook Pro&#8221;).</p>
<p><span id="more-747"></span></p>
<p><b>Предупреждение.</b> Я показываю принцип поиска, а готовый рецепт есть в статье &#8220;<noindex><a rel="nofollow" href="http://www.macgeekblog.com/blog/archive/2008/09/03/hack-vmware-fusion-2-virtualize-tigerleopard.html" >Hack VMWare Fusion 2 – Virtualize Tiger/Leopard</a></noindex>&#8220;. Я попытался пофантазировать, как происходило нахождение этого рецепта.</p>
<p>Итак, приступим. В наличии &#8211; VMWare Fusion 2.0 (заметьте &#8211; лицензионная, а не &#8220;лицензионная&#8221;) и DVD с Mac OS X 10.5 Retail вставлен в привод.</p>
<p>Создаём виртуальную машину &#8220;Mac OS X Server 10.5&#8243; (все параметры стандартные). Запускаем в Terminal.app dtrace для проверки, к каким файлам обращается VMWare для проверки, сервер ли это. Нужен именно dtrace, <a href="http://theapplegeek.ru/archives/520" >fseventer</a> не подходит &#8211; он не показывает открываемые файлы.</p>
<pre>
sudo dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }' &gt; vmware-10.5.txt
</pre>
<p>Стартуем виртуальную машину, и получаем назидательное сообщение о том, что DVD не совсем тот:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/10/01_vm.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/10/01_vm-thumb.png" height="119" width="380" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Останавливаем dtrace и смотрим, к каким файлам обратился VMWare на DVD:</p>
<p><small>
<pre>
$ cat vmware-10.5.txt | grep "Install DVD"
  0  18474                       open:entry mds /Volumes/Mac OS X Install DVD/
  0  18474                       open:entry mds Mac OS X Install DVD
  1  19260              open_nocancel:entry diskarbitration /Volumes/Mac OS X Install DVD/.autodiskmounted
  1  18474                       open:entry mds /Volumes/Mac OS X Install DVD
  1  18474                       open:entry Finder /Volumes/Mac OS X Install DVD/System/Library/CoreServices/SystemVersion.plist
  1  18474                       open:entry Finder /Volumes/Mac OS X Install DVD/System/Library/CoreServices/SystemVersion.plist
</pre>
<p></small></p>
<p>Содержимое файла SystemVersion.plist явно не указывает, что для проверки используется информация из него:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/10/02_vm.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/10/02_vm-thumb.png" height="103" width="380" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Думаем, как заставить думать VMWare, что у нас серверная версия. Для запуска системы с DVD у VMWare должен быть загрузчик. Анализируя захваченные данные dtrace (отфильтровываем по vmware), в итоге находим интересные строки:</p>
<p><small>
<pre>
  0  19260              open_nocancel:entry vmware-vmx /Library/Application Support/VMware Fusion/isoimages/tools-key.pub
  0  19260              open_nocancel:entry vmware-vmx /Library/Application Support/VMware Fusion/isoimages/darwin.iso.sig
  0  19260              open_nocancel:entry vmware-vmx /Library/Application Support/VMware Fusion/isoimages/darwin.iso
</pre>
<p></small></p>
<p>Загрузчик &#8211; в iso-образе darwin.iso. Второй вариант &#8211; можно было изучить каталоги VMWare и найти iso.</p>
<pre>
cd "/Library/Application Support/VMware Fusion/isoimages/"
</pre>
<p>Открываем darwin.iso в hex-viewer&#8217;е &#8220;<noindex><a rel="nofollow" href="http://ridiculousfish.com/hexfiend/" >Hex Fiend</a></noindex>&#8220;. Как обычно пишется код? Просто: сделали проверку &#8211; выдали сообщение. Если есть сравнение строк, обращение к файлам, и они не прописаны в отдельном блоке как переменные, то есть вероятность, что в ресурсах программы будет идти проверяемая строка, а затем &#8211; сообщение об ошибке.<br />
Пытаемся найти строку сообщения &#8220;The operating system is not Mac OS X Server&#8221;. И мы его находим, причём рядом видим имя файла ServerVersion.plist:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/10/03_vm.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/10/03_vm-thumb.png" height="225" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Делаем бекап всех файлов:</p>
<pre>
sudo bash
cd "/Library/Application Support/VMware Fusion/isoimages"
mkdir original
mv darwin.iso tools-key.pub *.sig original
</pre>
<p>На установочном диске в каталоге /System/Library/CoreServices файла ServerVersion.plist нет. Может стоит его подменить на SystemVersion.plist? Правим iso в Hex Fiend (бекапы!), благо количество букв совпадает. Другой вариант, без редактирования в hexeditor&#8217;е:</p>
<pre>
perl -n -p -e 's/ServerVersion.plist/SystemVersion.plist/g' &lt; original/darwin.iso &gt; darwin.iso
</pre>
<p>Загружаем, ошибка:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/10/04_vm.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/10/04_vm-thumb.png" height="133" width="380" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Вспоминаем о обращении к tools-key.pub и darwin.iso.sig перед открытием darwin.iso и понимаем, что файл изменился, и нужно перегенерировать цифровую подпись. Выходим из VMWare. В каталоге &#8220;/Library/Application Support/VMware Fusion/isoimages&#8221; видим не только публичный ключ tools-key.pub, но и приватный tools-priv.pem, которым производится подписывание (это не оплошность, так производится подписывание загружаемых образов). Смотрим документацию по OpenSSL и генерируем подпись (напоминаю, эти команды я взял из &#8220;<noindex><a rel="nofollow" href="http://www.macgeekblog.com/blog/archive/2008/09/03/hack-vmware-fusion-2-virtualize-tigerleopard.html" >Hack VMWare Fusion 2 – Virtualize Tiger/Leopard</a></noindex>&#8220;):</p>
<pre>
sudo -s
cd "/Library/Application Support/VMware Fusion/isoimages"
openssl genrsa -out tools-priv.pem 2048
openssl rsa -in tools-priv.pem -pubout -out tools-key.pub
openssl dgst -sha1 -sign tools-priv.pem &lt; darwin.iso &gt; darwin.iso.sig
for A in *.iso ; do openssl dgst -sha1 -sign tools-priv.pem &lt; $A &gt; $A.sig ; done
</pre>
<p>Запускаем виртуальную машину. Вуаля! Установщик загрузился:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/10/05_vm.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/10/05_vm-thumb.png" height="285" width="380" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Наслаждаемся.</p>
<p><br class='final-break' style='clear: both' /></p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/747/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Слежение за изменениями файловой системы</title>
		<link>http://theapplegeek.ru/archives/520</link>
		<comments>http://theapplegeek.ru/archives/520#comments</comments>
		<pubDate>Wed, 23 Sep 2009 08:31:12 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[dtrace]]></category>

		<guid isPermaLink="false">http://ctrld.me/?p=520</guid>
		<description><![CDATA[При исследовании работы разнообразных программ из интереса или же во время исследования проблемных ситуаций необходимо следить за файловой активностью. Ранее я описал использование DTrace, сейчас же кратко опишу две полезные утилиты, которые мне посоветовал Кирилл Воронин. fslogger В книге &#8220;Mac OS X Internals. A System Approach&#8221; была описана командно-строковая утилита fslogger, написанная автором, позволяющая отслеживать [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both"><img src="http://images.theapplegeek.ru/wp-content/uploads/2009/09/00_fs-thumb.png" height="209" align="left" width="160" style=" display: inline; float: left; margin: 0 10px 10px 0;" />При исследовании работы разнообразных программ из интереса или же во время исследования проблемных ситуаций необходимо следить за файловой активностью. Ранее я описал <a href="http://theapplegeek.ru/archives/358" >использование DTrace</a>, сейчас же кратко опишу две полезные утилиты, которые мне посоветовал <noindex><a rel="nofollow" href="http://www.shortcut.ru/" >Кирилл Воронин</a></noindex>.</p>
<p><span id="more-520"></span></p>
<h2>fslogger</h2>
<p>В книге <noindex><a rel="nofollow" href="http://osxbook.com/" >&#8220;Mac OS X Internals. A System Approach&#8221;</a></noindex> была описана командно-строковая <noindex><a rel="nofollow" href="http://osxbook.com/software/fslogger/" >утилита fslogger</a></noindex>, написанная автором, позволяющая отслеживать различные изменения файловой системы, например:</p>
<ul style="clear: both">
<li>создание файлов и каталогов;</li>
<li>удаление файлов и каталогов;</li>
<li>изменения структуры stat (например, изменение разрешений);</li>
<li>переименование файлов и каталогов;</li>
<li>изменение содержимого;</li>
<li>обмен содержимым между двумя файлами (это функция HFS+);</li>
<li>изменение информации Finder;</li>
<li>изменение владельца.</li>
</ul>
<p style="clear: both">Пример работы утилиты:</p>
<pre style="clear: both">ole-mac:~ ctrld$ sudo fslogger
Password:
fsevents device cloned (fd 4)
fslogger ready
=> received 654 bytes
# Event
  type           = FSE_CREATE_FILE
  pid            = 193 (iChatAgent)
  # Details
    # type           len  data
    FSE_ARG_STRING    66  string = /Users/ctrld/Library/Caches/com.apple.iChat/Pictures/.dat00c1.055
    FSE_ARG_DEV        4  dev    = 0xe000002 (major 14, minor 2)
    FSE_ARG_INO        4  ino    = 2766443
    FSE_ARG_MODE       4  mode   = -rw-r--r--  (0x0081a4, vnode type VREG)
    FSE_ARG_UID        4  uid    = 501 (ctrld)
    FSE_ARG_GID        4  gid    = 20 (staff)
    FSE_ARG_INT64      8  tstamp = 8200465994289
    FSE_ARG_DONE (0xb33f)
# Event
  type           = FSE_CONTENT_MODIFIED
  pid            = 193 (iChatAgent)
  # Details
    # type           len  data
    FSE_ARG_STRING    66  string = /Users/ctrld/Library/Caches/com.apple.iChat/Pictures/.dat00c1.055
    FSE_ARG_DEV        4  dev    = 0xe000002 (major 14, minor 2)
    FSE_ARG_INO        4  ino    = 2766443
    FSE_ARG_MODE       4  mode   = -rw-r--r--  (0x0081a4, vnode type VREG)
    FSE_ARG_UID        4  uid    = 501 (ctrld)
    FSE_ARG_GID        4  gid    = 20 (staff)
    FSE_ARG_INT64      8  tstamp = 8200466392596
    FSE_ARG_DONE (0xb33f)
</pre>
<p style="clear: both">
<h2>fseventer</h2>
</p>
<p style="clear: both">
<p style="clear: both">Компания fernLightning на основании идеи fslogger создала программу <noindex><a rel="nofollow" href="http://fernlightning.com/doku.php?id=software:fseventer:start" >fseventer</a></noindex>, которая в графическом виде показывает файловую активность. Программа бесплатная, но предлагает сделать добровольное пожертвование разработчикам. Функциональность видна по двум скриншотам:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/09/01_fs.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/09/01_fs-thumb.png" height="247" align="left" width="380" style=" display: inline; float: left; margin: 0 10px 10px 0;" /></a></noindex></p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/09/02_fs.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/09/02_fs-thumb.png" height="247" align="left" width="380" style=" display: inline; float: left; margin: 0 10px 10px 0;" /></a></noindex></p>
<p><br class="final-break" style="clear: both" /></p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/520/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Отладка файловой активности процессов с помощью DTrace, или как написать деинсталлятор</title>
		<link>http://theapplegeek.ru/archives/358</link>
		<comments>http://theapplegeek.ru/archives/358#comments</comments>
		<pubDate>Wed, 16 Sep 2009 09:12:07 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[dtrace]]></category>

		<guid isPermaLink="false">http://ctrld.me/?p=358</guid>
		<description><![CDATA[Предупреждение: я не претендую на полноту изложения и с точки зрения опытного системного программиста под MacOS X часть статьи может выглядеть бредом :-) Но мой метод работает, и его можно рассматривать как взгляд системного администратора на MacOS X. Недавно мне попалась на глаза новость об обновлении деинсталлятора &#8220;Yank &#8211; Your Mac&#8217;s Uninstaller&#8221;. Он отрабатывает самые [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both"><img src="http://images.theapplegeek.ru/wp-content/uploads/2009/09/01_yank-thumb.jpg" height="128" align="left" width="128" style=" display: inline; float: left; margin: 0 10px 10px 0;" /></p>
<p><i><b>Предупреждение:</b> я не претендую на полноту изложения и с точки зрения опытного системного программиста под MacOS X часть статьи может выглядеть бредом :-) Но мой метод работает, и его можно рассматривать как взгляд системного администратора на MacOS X</i>.</p>
<p>Недавно мне попалась на глаза новость об обновлении деинсталлятора <noindex><a rel="nofollow" href="http://www.matterform.com/mac_software/uninstaller/index.html" >&#8220;Yank &#8211; Your Mac&#8217;s Uninstaller&#8221;</a></noindex>. Он отрабатывает самые сложные случаи &#8211; когда программа устанавливается не только перетаскиванием в Applications, но и с помощью инсталлятора, когда достаточно много файлов записывается в разные каталоги. Краткое описание программы есть на <noindex><a rel="nofollow" href="http://www.deepapple.com/news/34716.html" >DeepApple</a></noindex>. Yank следит за файловой активностью инсталлятора и записывает в отдельный файл перечень устанавливаемых файлов, а далее, используя этот файл, может всё чисто деинсталлировать. Также есть онлайн-сервис, который содержит файлы для удаления более 150 программ, т.е. можно удалять программы, которые были установлены до начала использования Yank.</p>
<p>Yank &#8211; это пример программы, которая выстроена вокруг нескольких команд в shell. Я хочу продемонстрировать принцип, по которому она работает, а заодно продемонстрировать очень мощную технику отладки &#8211; DTrace.</p>
<p><span id="more-358"></span></p>
<p>Вольно процитирую <noindex><a rel="nofollow" href="http://en.wikipedia.org/wiki/DTrace" >Wikipedia</a></noindex> (прошу прощения за перевод, читать по английски намного проще, чем переводить на русский, особенно возникают проблемы с терминами):</p>
<blockquote>
<p>DTrace &#8211; это мощный фреймворк, предназначенный для динамического трейсинга. Он был создан Sun Microsystems для поиска ошибок ядра и приложений на продуктивных системах в реальном времени. Разработанный для Solaris, он был выпущен под лицензией <noindex><a rel="nofollow" href="http://en.wikipedia.org/wiki/Common_Development_and_Distribution_License" >CDDL</a></noindex> и был портирован на несколько других Unix-систем.</p>
<p>DTrace может использоваться для получения разнообразной глобальной информации по работающей системе, такой, как количество памяти, использование процессора, файловой системы и сетевых ресурсов, используемых активными процессами. Он также может предоставить гораздо детальную информацию, например, аргументы, с которыми вызываются конкретные функции, или перечень процессов, доступающихся к конкретному файлу.</p>
</blockquote>
<p>С детальной информацией по DTrace можно ознакомиться на таких ресурсах (или поискать в Интернет):</p>
<ul>
<li>Sun Microsystems, <noindex><a rel="nofollow" href="http://www.sun.com/bigadmin/content/dtrace/index.jsp" >&#8220;BigAdmin System Administration Portal&#8221;</a></noindex>.</li>
<li><noindex><a rel="nofollow" href="http://video.google.com/videoplay?docid=-8002801113289007228#" >Видео с &#8220;Google Tech Talks 2007&#8243;</a></noindex>.</li>
<li><noindex><a rel="nofollow" href="http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html" >Exploring Leopard with DTrace</a></noindex>.</li>
<li>MacOSXHints <noindex><a rel="nofollow" href="http://www.macosxhints.com/article.php?story=20071031121823710&#038;query=gui" >&#8220;10.5: Exploring OS X with dtrace&#8221;</a></noindex>.</li>
<li><noindex><a rel="nofollow" href="http://www.brendangregg.com/dtrace.html" >DTrace tools</a></noindex>.</li>
</ul>
<h2>Прототип программы</h2>
<p>Наша задача &#8211; запустить сбор информации файловой активности всех процессов в системе, записать её в файл, а затем проанализировать, какие файлы создавались интересующим нас процессом.</p>
<p>Будем экспериментировать с <noindex><a rel="nofollow" href="http://www.protemac.com/Meter/" >ProteMac</a></noindex> (системой сбора информации по сетевому трафику) &#8211; она использует инсталлятор, который ставит много чего, включая драйвер.</p>
<p><b>Примечание</b>. Рекомендуется закрыть iTunes, QuickTime Player, DVD Player, так как по заявлению Apple они блокируют работу DTrace для защиты лицензионного контента. Возможно они блокируют отладку себя же, так как информация по интересующим меня процессам фиксируется.</p>
<h3>Запускаем DTrace</h3>
<pre>
$ sudo dtrace -n \
'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }' \
> protemac.log
</pre>
<p>В файле видим строки, вида:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/09/02_dtrace-full.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/09/02_dtrace-thumb.png" height="47" width="377" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<h3>Запускаем инсталлятор</h3>
<p>Запускаем, убеждаемся, что данные по этому процессу фиксируются, и запускаем установку.</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/09/03_dtrace.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/09/03_dtrace-thumb.png" height="47" width="380" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Прерываем dtrace после завершения установки, но не перезагружаемся, как нам рекомендуется &#8211; нас интересует не работа программы, а данные, захваченные DTrace.</p>
<h3>Анализируем</h3>
<p>После предварительного просмотра выясняем, что за распаковку отвечает pkgExtractor, который показывает, что распаковывается, но, к сожалению, не показывает, в какие файлы. Но мы домыслим это</p>
<pre>
$ cat protemac.log | grep pkgExtractor | cut -c 58- | sort
</pre>
<p>Получаем вывод (фрагмент):</p>
<pre>
///Applications/ProteMac Meter.app/Contents/.BC.50Myi7
///Applications/ProteMac Meter.app/Contents/.BC.XLbB01
///Applications/ProteMac Meter.app/Contents/Autolauncher/.BC.Spuh6S
///Applications/ProteMac Meter.app/Contents/Frameworks/CocoaEx.framework/Versions/A/.BC.JQH5kN
///Applications/ProteMac Meter.app/Contents/Frameworks/CocoaEx.framework/Versions/A/Resources/.BC.EcX4rG
///Applications/ProteMac Meter.app/Contents/Frameworks/CocoaEx.framework/Versions/A/Resources/.BC.M3gUoL
///Applications/ProteMac Meter.app/Contents/Frameworks/CocoaEx.framework/Versions/A/Resources/.BC.PGgSvo
///Applications/ProteMac Meter.app/Contents/Frameworks/CocoaProtector.framework/Versions/A/.BC.pbZPB2
</pre>
<p>После недолгих размышлений получаем перечень файлов и каталогов, которые нужно удалить при деинсталляции:</p>
<pre>
/Applications/ProteMac Meter.app/
/Library/LaunchAgents/com.protemac.MeterAutolauncher
/Library/ProteMac/
/System/Library/Extensions/AirGrabFirewallModule.kext/
/System/Library/LaunchDaemons/com.protemac.Daemon
</pre>
<p>Что нам и требовалось.</p>
<h2>Проверка правильности</h2>
<p>Для проверки посмотрим, что делает деинсталлятор, поставляющийся с программой. Делаем &#8220;Second Click&#8221; на деинсталляторе, смотрим скрипт uninstall.sh в каталоге &#8220;Contents/Resources&#8221;:</p>
<p style="clear: both"><noindex><a rel="nofollow" href="http://images.theapplegeek.ru/wp-content/uploads/2009/09/04_dtrace.png"  class="image-link"><img class="linked-to-original" src="http://images.theapplegeek.ru/wp-content/uploads/2009/09/04_dtrace-thumb.png" height="182" width="190" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></noindex></p>
<p>Обратите, кстати, внимание на комментарии разработчиков :-) Наш анализ был верен &#8211; мы вычислили все файлы.</p>
<pre>
#!/bin/sh

rm -Rf "/Applications/ProteMac Meter.app"
rm -Rf "/Library/LaunchAgents/com.protemac.MeterAutolauncher"

# Наследие от старых версий
rm -Rf "/System/Library/LaunchDaemons/com.protemac.MeterDaemon"

# А это уже новые прибабахи :)
rm -Rf "/Library/Receipts/install.pkg"

cd "/Library/ProteMac/ProteMac NetServices.bundle/Contents/tools"

./removeAppFromList.sh "ProteMac Meter"
./isCanBeRemoved.sh

if [ $? -ne 0 ]; then
	exit 0
fi

cd /

rm -Rf "/System/Library/LaunchDaemons/com.protemac.Daemon"
rm -Rf "/System/Library/Extensions/AirGrabFirewallModule.kext"
rm -Rf "/Library/ProteMac/ProteMac NetServices.bundle"
</pre>
<h2>Замечание по усовершенствованию</h2>
<p>Также необходимо удалить системные файлы, генерируемые системой, такие, как кеши и т.п.</p>
<p>А для быстрого просмотра содержимого инсталлятора рекомендую удобную программу <noindex><a rel="nofollow" href="http://www.charlessoft.com/" >Pacifist</a></noindex>.</p>
<p>Более правильно было бы отслеживать не обращение к файлам, а именно запросы на создание файлов и каталогов. Причём записывать не весь лог, а только активность исталлятора и его дочерних процессов. Но цель статьи была демонстрация метода, и этот метод можно развивать до достижения совершенства. Немного исследования, работы, тестирования, и можно выпускать свою программу.</p>
<h2>Disclaimer</h2>
<p>Dear ProteMac! In my article I have analyzed only common questions about your installer program. It is not a reverse engineering of your software. I respect your work. Однако судя по комментариям в деинсталляторе, идущем в комплекте с ProteMac, можно было эту фразу написать по-русски ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/358/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

