В неглобальных зонах могут выполняться скрипты DTrace, требующие только полномочий dtrace_proc (поддерживаются провайдеры fasttrap и pid) и dtrace_user (провайдеры profile и syscall). При этом использование провайдеров и функций DTrace будет ограничено рамками этой зоны.
Например, такой скрипт, определяющий, сколько раз и какие функции вызываются из динамической библиотеки
pid$target:$1::entry
{
@func[probefunc] = count();
}
можно запустить в пределах неглобальной зоны при наличии полномочия dtrace_proc.
Свойство zonecfg limitpriv позволяет добавить полномочия dtrace_proc и dtrace_user:
# zonecfg -z unknown
zonecfg:unknown> create
zonecfg:unknown> set zonepath=/unknown
Можно установить одно или оба полномочия:
zonecfg:unknown> set limitpriv="default,dtrace_proc,dtrace_user"
zonecfg:unknown> verify
zonecfg:unknown> exit
# zoneadm -z unknown install
# zoneadm -z unknown boot
# zlogin unknown
Теперь можно запустить dtrace.
Неполный вывод dtrace –l в зоне unknown:
65613 syscall getpid entry
65614 syscall getpid return
66015 syscall getpeername entry
66016 syscall getpeername return
66026 syscall ntp_gettime return
66027 syscall ntp_adjtime entry
66028 syscall ntp_adjtime return
66041 profile profile-97
66042 profile profile-199
66043 profile profile-499
66044 profile profile-997
66045 profile profile-1999
66046 profile profile-4001
66047 profile profile-4999
Пример трассировки в глобальной и неглобальной зонах, выполняемый из глобальной:
# dtrace -n 'syscall::write:entry
> {
> @count[zonename]=count();
> }'
global 9917
unknown 6412
В выводе скрипта содержится количество системных вызовов write в данной зоне за время его работы (можно изменить агрегацию так, чтобы индексировать данные по двум и более параметрам, но в данном случае этого не требуется).