null

Маленькие хитрости OpenSolaris

У меня уже более полутора лет в качестве домашнего 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

К списку статей

 

Интересуюсь по большей части системным анализом программного обеспечения: поиском багов и анализом неисправностей, а также системным программированием (и не оставляю надежд запилить свою операционку, хотя нехватка времени сказывается :) ). Программированием увлекаюсь с 12 лет, но так уж получилось, что стал я инженером.

Основная сфера моей деятельности связана с поддержкой Solaris и оборудования Sun/Oracle, хотя в последнее время к ним прибавились технологии виртуализации (линейка Citrix Xen) и всякое разное от IBM - от xSeries до Power. Учусь на кафедре Вычислительной Техники НИУ ИТМО.

See you...out there!

http://www.facebook.com/profile.php?id=100001947776045
https://twitter.com/AnnoyingBugs

Ничего не найдено. n is 0