У меня уже более полутора лет в качестве домашнего NAS работает машинка, на которой работает OpenSolaris, поэтому спешу поделиться некоторыми маленькими секретами.
Смотрим S.M.A.R.T. дисков
Как известно, smartmontools не поддерживает OpenSolaris, и вызывая smartctl для SATA диска с большой долей вероятности будем видеть следующее сообщение:
#######################################################################
ATA command routine ata_command_interface() NOT IMPLEMENTED under Solaris.
Please contact smartmontools-support@lists.sourceforge.net if
you want to help in porting smartmontools to Solaris.
#######################################################################
Однако это не единственный способ получить S.M.A.R.T. Для одного из прототипов OpenStorage - сервера Sun Fire X4500 Sun разработала утилиту hd - чтобы получить ее, достаточно скачать X4500 Tools & Drivers.
Итак, распаковываем архивчик и устанавливаем hdtool:
# gtar xjvf X4500_Tools_And_Drivers_solaris_47001.tar.bz2
# cd solaris/tools/hdtool/
# pfexec pkgadd -d SUNWhd-1.07.pkg SUNWhd
Работает она не со всеми контроллерами, но ICH9 поддерживает:
# /opt/SUNWhd/hd/bin/hd
Device Serial Vendor Model Rev Temperature
------ ------ ------ ----- ---- -----------
c0t0d0p0 3UJ1KPC09832 ATA SAMSUNG HD753LJ 1106 255 C (491 F)
c0t1d0p0 WCAU4C422467 ATA WDC WD10EADS-00L 1A01 255 C (491 F)
c8t0d0p0 AEJ1RLB01356 ATA SAMSUNG HD120IJ 0-47 32 C (89 F)
c8t1d0p0 WCAU4C430067 ATA WDC WD10EADS-00L 1A01 27 C (80 F)
c8t2d0p0 WCAU4C422809 ATA WDC WD10EADS-00L 1A01 27 C (80 F)
c8t3d0p0 3UJ1KQB02235 ATA SAMSUNG HD753LJ 1113 24 C (75 F)
c8t4d0p0 WCAU4C422067 ATA WDC WD10EADS-00L 1A01 27 C (80 F)
# /opt/SUNWhd/hd/bin/hd -e c8t1
Revision: 16
Offline status 132
Selftest status 0
Seconds to collect 24000
Time in minutes to run short selftest 2
Time in minutes to run extended selftest 255
Offline capability 123
SMART capability 3
Error logging capability 1
Checksum 0xe5
Identification Status Current Worst Raw data
1 Raw read error rate 0x2f 200 200 0
3 Spin up time 0x27 213 162 4325
4 Start/Stop count 0x32 100 100 81
5 Reallocated sector count 0x33 200 200 0
7 Seek error rate 0x2e 100 253 0
9 Power on hours count 0x32 83 83 12622
10 Spin retry count 0x32 100 253 0
11 Recalibration Retries count 0x32 100 253 0
12 Device power cycle count 0x32 100 100 80
192 Power off retract count 0x32 200 200 27
193 Load cycle count 0x32 200 200 81
194 Temperature 0x22 123 110 27/ 0/ 0 (degrees C cur/min/max)
196 Reallocation event count 0x32 200 200 0
197 Current pending sector count 0x32 200 200 0
198 Scan uncorrected sector count 0x30 200 200 0
199 Ultra DMA CRC error count 0x32 200 200 0
200 Write/Multi-Zone Error Rate 0x8 200 200 0
Приоритезация траффика
Так как NAS выступает еще и в качестве роутера, неплохо бы, чтобы скачка торрентов не мешала просмотру YouTube. Никаких сложностей: CrossBow (новая сетевая подсистема OpenSolaris) поддерживает подобие QoS - т.н. flows, т.е. потоки данных. В snv_126 появилась также опция remote_port:
# flowadm add-flow -l e1000g2 -a transport=tcp,remote_port=80 httpflow
# flowadm set-flowprop -p priority=high httpflow
Здесь e1000g2 - внешний интерфейс.
А еще flowadm позволяет получать статистику:
# pfexec flowadm show-usage -f /var/log/net.log
FLOW DURATION IPACKETS RBYTES OPACKETS OBYTES BANDWIDTH
httpflow 896895 1843743 198300667 1602189 265336916 0.020 Mbps
Оборачиваем сервисы в SMF
Как известно, Solaris предоставляет прекрасное средство для управления сервисами - SMF (Service Management Facility), однако далеко не все демоны его поддерживают. Но это не беда - smf-скрипты мало чем отличаются от обычных rc-скриптов, а манифесты несмотря на использование xml достаточно очевидны и понятны. Рассмотрим например transmission-daemon, демон битторрент клиента TransmissionBT.
Shell-скрипт приведен ниже (его нужно поместить в /lib/svc/method/transmission-daemon и сделать исполнимым)
#!/bin/sh
# Подключаем библиотеку SMF-скриптов
. /lib/svc/share/smf_include.sh
# Устанавливаем аргументы transmission-daemon
TRANSMISSION_HOME=$2
TRANSMISSION_ARGS=" -g $2 -i $3"
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/transmission/bin
NAME=transmission-daemon
DAEMON=`which ${NAME}`
# Выйти если transmission-daemon не установлен
[ -x "${DAEMON}" ] || exit $SMF_EXIT_ERR_FATAL
#
# Запуск transmission-daemon
#
do_start()
{
# Экспортируем переменные
if [ -n "$TRANSMISSION_HOME" ]; then
export TRANSMISSION_HOME
fi
if [ -n "$TRANSMISSION_WEB_HOME" ]; then
export TRANSMISSION_WEB_HOME
fi
echo "Starting ${DAEMON} ${TRANSMISSION_ARGS}"
# Собственно запуск демона
${DAEMON} ${TRANSMISSION_ARGS}
}
Ниже приведен манифест:
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='transmission-daemon'>
<service
name='application/transmission-daemon'
type='service'
version='1'>
<!-- Wait for network interfaces to be initialized. -->
<dependency
name='network'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/milestone/network:default' />
</dependency>
<!-- Wait for all local filesystems to be mounted. -->
<dependency
name='filesystem-local'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/local:default' />
</dependency>
<!-- start-stop методы -->
<exec_method
type='method'
name='start'
exec='/lib/svc/method/transmission-daemon
start %{configuration} %{listen_address}'
timeout_seconds='60' />
<exec_method
type='method'
name='stop'
exec=':kill -9'
timeout_seconds='60' />
<!--
Добавляет в RBAC соответствующие привелегии
-->
<property_group name='general' type='framework'>
<propval name='value_authorization' type='astring'
value='solaris.smf.value.transmission' />
<propval name='action_authorization' type='astring'
value='solaris.smf.manage.transmission' />
</property_group>
<property_group name='startd' type='framework'>
<!-- Если процесс выпал в core 0 не перезагружать -->
<propval name='ignore_error' type='astring'
value='core,signal' />
</property_group>
<!-- Параметры сервиса (отображаемые в svcprop) -->
<property_group name='application' type='application'>
<propval name='configuration'
type='astring' value='/etc/transmission'/>
<propval name='listen_address'
type='astring' value='0.0.0.0'/>
</property_group>
<!-- От какого пользователя/группы запускается сервис -->
<instance name='default' enabled='false'>
<method_context>
<method_credential user='share' group='share' />
</method_context>
</instance>
<!-- Информация о сервисе (выводится по svcs -x) -->
<stability value='Evolving' />
<template>
<common_name>
<loctext xml:lang='C'>
Transmission BitTorrent Client (Daemon)
</loctext>
</common_name>
<documentation>
<manpage title='transmission-daemon' section='1' />
<doc_link name='www.transmissionbt.org'
uri='http://www.transmissionbt.org' />
</documentation>
</template>
</service>
</service_bundle>
После этого импортируем манифест и наслаждаемся:
# svccfg import transmission-daemon.xml
# svcs -x transmission-daemon
svc:/application/transmission-daemon:default (Transmission BitTorrent Client (Daemon))
State: online since 3 февраля 2011 г. 21:21:02 MSK
See: transmission-daemon(1)
See: http://www.transmissionbt.org
See: /var/svc/log/application-transmission-daemon:default.log
Impact: None.
Как видим, SMF избавляет нас от таких сложностей, как pid-файлы и сильно упрощает start-stop скрипты.
UPD: Прикладываю пакет SUNWhd: SUNWhd-1.07.pkg.gz