Европейский Университет в Санкт-Петербурге
Опубликован: 10.10.2005 | Доступ: свободный | Студентов: 1716 / 298 | Оценка: 4.30 / 3.85 | Длительность: 16:22:00
ISBN: 978-5-94774-820-8
Лекция 9:

Запуск и останов системы

< Лекция 8 || Лекция 9: 12345 || Лекция 10 >

Файлы и каталоги, используемые при загрузке

Для загрузки в специфическом режиме следует указывать команде boot соответствующие аргументы:

  • для x86 платформ в ответ на приглашение > вводится команда

    b kernel/unix -as - загрузка ядра, используемого по умолчанию, в однопользовательском режиме.

Замечание о загрузке систем UltraSPARC

Некоторые старые компьютеры SPARC технически способны работать с 64-битной версией Solaris, но им может требоваться обновление firmware для того, чтобы эта работа стала в действительности возможной. Если вы обладаете как раз такой системой и установили 64-битный Solaris, то при загрузке этот факт будет обнаружен и вы получите сообщение о том, что firmware следует обновить. вслед за этим загрузчик выберет 32-разрядное ядро, и загрузка продолжится.

Процессоры UltraSPARC-1 с частотой 200 MГц и меньше имеют ошибку в микрокоде, из-за которой при запуске на компьютерах с такими процессорами 64-битной программы может произойти останов процессора из-за выполнения определеной комбинации команд. Чтобы избежать этой неприятности, при работе на таких компьютерах Solaris при загрузке выбирает 32-битное ядро, так как 64-битное приложение не сможет запуститься при работе с 32-разрядным ядром.

Компания Sun утверждает, что комбинация команд, вызывающая нештатную остановку процессора, не может быть сгенерирована компилятором языка высокого уровня, и более того, даже практически не может встретиться в написанных на ассемблере программах, если только эта программа не написана специально для того, чтобы вызвать эту ошибку.

В тех системах, где вероятность запуска такой "зловредной" программы мала, а пользователи работают только с обычными приложениями, полученными из надежных источников или собранных из исходных текстов языка высокого уровня типа С, администратор может явным образом потребовать у загрузчика выполнять загрузку 64-разрядного ядра при старте системы. Для этого надо изменить файл политики загрузки /platform/platform-name/boot.conf:

ALLOW_64BIT_KERNEL_ON_UltraSPARC_1_CPU=true

Инициализация ядра

После того как ядро загружено в память и ему передано управление, оно начинает загрузку модулей. В этот момент ядро еще не умеет читать файлы из файловой системы UFS, так как драйвер файловой системы еще не загружен. Поэтому для чтения модулей ядро использует ufsboot. После того как загружено достаточно модулей для монтирования корневой файловой системы и самостоятельного продолжения загрузки, ядро выгружает ufsboot и продолжает загрузку самостоятельно. Ядро монтирует указанные в /etc/vfstab файловые системы и запускает процесс /sbin/init для перехода к режиму работы системы, который в /etc/inittab обозначен как initdefault. Процесс /sbin/init, в свою очередь, запускает те программы и скрипты, которые перечислены в /etc/inittab.

В Solaris 9 ядро настраивается динамически, т.е. изменить параметры ядра можно как при перезагрузке системы (изменив заранее файл конфигурации /etc/system ), так и во время работы, на лету. Поэтому ядро называется динамическим. Оно состоит из небольшой статической части и множества модулей, которые загружаются динамически, по мере необходимости. Многие модули загружаются автоматически при старте системы, в то время как другие, например драйверы устройств, загружаются тогда, когда они понадобятся ядру, т.е. в момент первого обращения к ним. Когда модуль уже не нужен, он может быть выгружен из памяти. Фактически, ядро выгружает модуль тогда, когда он не нужен, а память, которую он занимает, наоборот, нужна.

Чтобы узнать, какие модули загружены в настоящий момент, следует выполнить команду

modinfo

Модули ядра хранятся в каталогах /kernel и /usr/kernel, специфичные для аппаратной платформы модули лежат в каталогах /platform/`uname -m`/kernel и /platform/` uname -i`/kernel (если такие есть).

Специфические указания того, какие модули загружать при старте системы, следует разместить в файле /etc/system , который считывается ядром при загрузке. В этом файле можно также указать дополнительные параметры, которые надо передать модулям при загрузке.

В частности, /etc/system используют, чтобы указать:

  • путь к каталогу, где следует искать модули, загружаемые при старте системы;
  • модули, которые надо загрузить сразу, а не ждать, пока они потребуются;
  • тип и имя устройства, с которого производится загрузка (корневое устройство);
  • параметры ядра, которые следует установить в значения, отличные от принятых по умолчанию.

Стандартный файл /etc/system выглядит примерно так:

*Set the search path for modules. This has a format 
*similar to the csh path variable. If the module isn't 
*found in the first directory it tries the second and 
*so on. The default is /kernel /usr/kernel
*
*Example:
*moddir: /kernel /usr/kernel /other/modules
* root device and root filesystem configuration:
*
*The following may be used to override the defaults 
*provided by the boot program:
*
*rootfs:   Set the filesystem type of the root.
*
*rootdev:   Set the root device. This should be a fully
*     expanded physical pathname. The default is the
*     physical pathname of the device where the boot
*     program resides. The physical pathname is
*     highly platform and configuration dependent.
*
*Example:
*   rootfs:ufs
*   rootdev:/sbus@1,f8000000/esp@0,800000/sd@3,0:a
*
*(Swap device configuration should be specified in 
*/etc/vfstab.)
* exclude:
*
*Modules appearing in the moddir path which are NOT to be 
*loaded, even if referenced. Note that ?exclude' accepts 
*either a module name, or a filename which includes the 
*directory.
*
*Examples:
*   exclude: win
*   exclude: sys/shmsys
* forceload:
*
*Cause these modules to be loaded at boot time, (just 
*before mounting the root filesystem) rather than at 
*first reference. Note that forceload expects a filename 
*which includes the directory. Also note that loading a 
*module does not necessarily imply that it will be 
*installed.
*
*Example:
*   forceload: drv/foo
* set:
*
*Set an integer variable in the kernel or a module to 
*a new value.
*This facility should be used with caution. 
*See system(4).
*
*Examples:
*
*To set variables in 'unix':
*
*   set nautopush=32
* set maxusers=40
*
*To set a variable named 'debug' in the module named 
*'test_module'
*
*   set test_module:debug = 0x13
Листинг 9.1. Стандартный файл /etc/system
  1. Всегда делайте резервную копию любого файла конфигурации перед внесением изменений! Дать команду cp /etc/system /etc/system.bak - дело двух секунд, зато это действие сохранит вам нервы и время - проверено поколениями сисадминов!
  2. Никогда не вносите в файлы конфигурации изменений, если не уверены, что это надо делать, или сомневаетесь в том, что должно получиться в результате.

Если правилом (2) вы пренебрегли вопреки голосу разума, то неверный файл /etc/system может вызвать ошибку при загрузке и система не загрузится. Если это случилось, то:

  • используйте команду загрузчика boot -a для интерактивной загрузки;
  • когда загрузчик спросит имя файла system , укажите имя резервной копии (например, /etc/system.bak );
  • если правило (1) вы тоже проигнорировали (похоже, в этом случае сегодня не ваш день!) и никакой резервной копии не имеете, то в качестве имени файла system указывайте /dev/null - тогда все значения будут приняты по умолчанию.

Как видно из приведенного примера, большинство строк в /etc/system выглядят так:

set параметр=значение

Например, параметр ядра MAXUSERS устанавливается в значение 50 следующей командой:

set maxusers = 50

Обратите внимание на то, что параметры статической части ядра (фактически, файла unix) устанавливаются без ссылки на модуль, а параметры, применимые к модулям, - с указанием имени модуля:

set модуль:параметр=значение

Длина команды в файле /etc/system не должна превышать 80 символов, строки, начинающиеся со знака звездочки "*" или решетки "#" интерпретируются как комментарии.

Чтобы проверить, какие значения имеют настраиваемые параметры ядра, следует использовать команду sysdef, которая показывает список обнаруженных устройств, системных устройств, загруженных модулей и значения настраиваемых параметров ядра:

*
*								Hostid
*
								0284521a
*
*								i86pc Configuration
*
*
*								Devices
*
*
+boot (driver not attached)
			memory (driver not attached) aliases (driver not attached)
chosen (driver not attached) i86pc-memory (driver not attached) i86pc-mmu (driver not attached) openprom 
(driver not attached) options, instance #0
packages (driver not attached) delayed-writes (driver not attached) itu-props (driver not attached)
isa, instance #0
motherboard (driver not attached) PNP0501 (driver not attached)
		lp (driver not attached)
		fdc, instance #0
			fd, instance #0
			fd, instance #1 (driver not attached) i8042, 
		instance #0
			keyboard, instance #0
			mouse, instance #0 bios (driver not attached) 
		bios (driver not attached)
pci, instance #0
		pci8086,7190 (driver not attached) pci8086,7191, 
		instance #0
			display, instance #0
			pci20c,d041 (driver not attached) pci8086,7110 
		(driver not attached) pci-ide, instance #0
					ide, instance #0
						cmdk, instance #0
					ide, instance #1
						sd, instance #0 pci8086,7112, instance #0
		pci8086,7113 (driver not attached) pci1014,138, 
		instance #0 pci1014,138, instance #1 pci1436,440 
		(driver not attached) pci1014,136 (driver not 
		attached) pci10c,d041 (driver not attached)
used-resources (driver not attached) objmgr, instance #0
cpus (driver not attached)
		cpu, instance #0 (driver not attached) pseudo, 
			instance #0
		clone, instance #0
		ip, instance #0 ip6, instance #0 tcp, instance #0 
		tcp6, instance #0 udp, instance #0 udp6, instance #0 
		icmp, instance #0 icmp6, instance #0 sad, instance #0
		conskbd, instance #0 wc, instance #0 iwscn, 
		instance #0 rts, instance #0
					tl, instance #0
		keysock, instance #0 spdsock, instance #0 sysmsg, 
		instance #0 cn, instance #0
		mm, instance #0 kstat, instance #0 log, 
		instance #0 sy, instance #0 vol, instance #0 random, 
		instance #0 ptm, instance #0 pts, instance #0 ksyms, 
		instance #0 
devinfo, instance #0
*
* Loadable Objects
*
* Loadable Object Path = /platform/i86pc/kernel *
drv/cpc
				hard link: sys/cpc
strmod/vuid2ps2
strmod/vuid3ps2
strmod/vuidm3p
strmod/vuidm4p
strmod/vuidm5p
drv/cadp160
drv/smartii
drv/elx
drv/fd
drv/fdc
drv/logi
drv/lp
drv/msm
drv/ata
drv/dpt
drv/mscsi
drv/pci-ide
drv/sbpro
drv/mlx
drv/eisa
drv/isa
drv/kb8042
drv/pci
drv/rootnex
mach/uppc
misc/bootdev
misc/emul_80387
misc/pci_autoconfig
mmu/mmu32
mmu/mmu36
unix
*
* Loadable Object Path = /kernel
*
drv/arp
				hard link: strmod/arp
mach/pcplusmp
mach/corollary
mach/compaq
drv/bofi
drv/nca
drv/clone
drv/cn
drv/conskbd
drv/consms
drv/devinfo
drv/i2o_bs
drv/i2o_scsi
drv/icmp
				hard link: strmod/icmp drv/icmp6
				hard link: strmod/icmp6 drv/ip
hard link: strmod/ip
drv/ip6
				hard link: strmod/ip6 drv/ippctl
drv/ipsecah
				hard link: strmod/ipsecah drv/ipsecesp
				hard link: strmod/ipsecesp drv/iwscn
drv/keysock
				hard link: strmod/keysock drv/llc1
drv/lofi
drv/log
drv/mm
drv/openeepr
drv/options
drv/pci_to_i2o
drv/poll
drv/pseudo
drv/ptc
drv/ptsl
drv/random
drv/rts
				hard link: strmod/rts drv/sad
				hard link: strmod/sad drv/sgen
drv/spdsock
drv/st
drv/sy
drv/sysmsg
drv/tcp
				hard link: strmod/tcp drv/tcp6
				hard link: strmod/tcp6 drv/tl
drv/udp
				hard link: strmod/udp drv/udp6
				hard link: strmod/udp6 drv/wc
genunix
misc/busra
misc/consconfig
misc/des
misc/fssnap_if
misc/gld
misc/hpcsvc
misc/i2o_msg
misc/ipc
misc/kbtrans
misc/krtld
misc/md5
misc/pcicfg
misc/pcihp
misc/rpcsec
misc/scsi
misc/seg_drv misc/seg_mapdev misc/sha1
misc/strplumb misc/swapgeneric misc/terminal-emulator misc/tlimod misc/ufs_log
drv/chs
drv/dnet
drv/elxl
drv/ieef
drv/iprb
drv/ncrs
drv/pcn
drv/pcscsi
drv/sd
drv/spwr
drv/pcmem
drv/mega
drv/pcic
drv/pcs
drv/pem
drv/pcelx
drv/xsvc
drv/cpqncr
drv/pcram
drv/md misc/md_hotspares misc/md_mirror misc/md_notify misc/md_raid
misc/md_sp misc/md_stripe misc/md_trans misc/kgss/gl_kmech_krb5 drv/pcser
drv/hpfc
drv/pe
drv/asy
drv/cmdk
drv/objmgr
misc/dadk
misc/gda
misc/snlb
misc/strategy misc/sysinit drv/sk98sol
drv/pcata
drv/skfp
misc/klmmod
misc/klmops misc/nfs_dlboot misc/kgssapi misc/rpcsec_gss
drv/adp
drv/audioens misc/amsrc1 misc/audiosup misc/diaudio
misc/mixer
drv/cadp
drv/cpqhpc
drv/hid
drv/hubd
drv/scsa2usb
drv/uhci
drv/usb_ac
drv/usb_as
drv/usb_mid
drv/usbprn
misc/hidparser
misc/usba
exec/elfexec
exec/intpexec
fs/cachefs
fs/fifofs
fs/hsfs
fs/lofs
fs/mntfs
fs/procfs
fs/sockfs
fs/specfs
fs/tmpfs
fs/ufs
ipp/ipgpc
sched/TS
sched/TS_DPTBL
strmod/atun
strmod/authmd5h strmod/authsha1
strmod/bufmod
strmod/connld
strmod/dedump
strmod/encr3des
strmod/encrdes
strmod/ldterm
strmod/pckt
strmod/pfmod
strmod/pipemod
strmod/ptem
strmod/redirmod
strmod/rpcmod
	hard link: sys/rpcmod strmod/timod
strmod/tirdwr
strmod/ttcompat
strmod/tun
sys/c2audit
sys/doorfs
sys/inst_sync
sys/kaio
sys/msgsys
sys/pipe
sys/pset
sys/semsys
sys/shmsys
fs/nfs
				hard link: sys/nfs fs/autofs
fs/udfs
strmod/usb_ah
strmod/usbkbm
strmod/usbms
strmod/hwc dacf/consconfig_dacf
drv/i8042
drv/mouse8042
drv/symhisl
drv/pci_pci
drv/vgatext
misc/nfssrv
misc/acpi_intp
misc/pcmcia
ipp/dlcosmk
ipp/dscpmk
ipp/flowacct
ipp/tokenmt
ipp/tswtclmt
misc/rsmops
exec/coffexec
*
*	Loadable Object Path = /usr/kernel
*
drv/rsm
sched/FSS
drv/winlock
drv/pm
drv/tnf
strmod/u8koi8
strmod/u8lat1
strmod/u8lat2
drv/vol
drv/dump
drv/fssnap
drv/kstat
drv/ksyms
drv/lockstat
drv/logindmux
drv/ptm
drv/pts
exec/javaexec
fs/fdfs
fs/namefs
fs/pcfs
fs/xmemfs
sched/FX
sched/FX_DPTBL
sched/IA
sched/RT
sched/RT_DPTBL
strmod/rlmod
strmod/telmod
sys/acctctl
sys/exacctsys
sys/sysacct
drv/llc2
drv/sppp
drv/sppptun
				hard link: strmod/sppptun strmod/spppasyn
strmod/spppcomp
*
*	System Configuration
*
	swap files
swapfile       dev swaplo blocks   free /dev/dsk/c0d0s1   102,1    8 1048936 1048936 
*
*	Tunable Parameters
*
 3866624  maximum memory allowed in buffer cache (bufhwm) 2954    maximum number of processes (v.v_proc)
	99	maximum global priority in sys class (MAXCLSYSPRI)
	2949	maximum processes per user id (v.v_maxup)
	30	auto update time limit in seconds (NAUTOUP)
	25	page stealing low water mark (GPGSLO)
	5	fsflush run rate (FSFLUSHR)
	25	minimum resident memory for avoiding deadlock (MINARMEM)
	25	minimum swapable memory for avoiding deadlock (MINASMEM)
*
*	Utsname Tunables
*
			5.9 release (REL)
sola node name (NODE)
	SunOS system name (SYS) Generic_112234-03 version (VER) *
*	Process Resource Limit Tunables (Current:Maximum)
*
0x0000000000000100:0x0000000000010000  file descriptors *
*	Streams Tunables
*
			9		maximum number of pushes allowed (NSTRPUSH)
 65536		maximum stream message size (STRMSGSZ)
	1024		max size of ctl part of message (STRCTLSZ)
*
*	IPC Messages module is not loaded
*
*
*	IPC Semaphores module is not loaded
*
*
*	IPC Shared Memory module is not loaded
*
*
*	Time Sharing Scheduler Tunables
*
60				maximum time sharing user priority (TSMAXUPRI)
SYS			system class name (SYS_NAME)
Листинг 9.2. Файл sysdef

Запуск процесса init

Процесс init запускается ядром сразу после монтирования файловых систем из /etc/vfstab. После этого init осуществляет переход в тот режим выполнения, который ему указан как initdefault в файле /etc/inittab. Переход к этому режиму выполнения фактически означает запуск всех программ, которые перечислены в этом файле для указанного режима выполнения. Вот обычный файл /etc/inittab:

ap::sysinit:/sbin/autopush -f /etc/iu.ap ap::sysinit:/sbin/soconfig -f /etc/sock2path 
fs::sysinit:/sbin/rcS sysinit >/dev/msglog 2<>/dev/msglog </dev/console
is:3:initdefault:
p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/msglog 2<>/dev/msglog sS:s:wait:/sbin/rcS	>/dev/msglog 2<>/dev/msglog </dev/console
s0:0:wait:/sbin/rc0	>/dev/msglog 2<>/dev/msglog </dev/console
s1:1:respawn:/sbin/rc1	>/dev/msglog 2<>/dev/msglog </dev/console
s2:23:wait:/sbin/rc2	>/dev/msglog 2<>/dev/msglog </dev/console
s3:3:wait:/sbin/rc3	>/dev/msglog 2<>/dev/msglog </dev/console
s5:5:wait:/sbin/rc5	>/dev/msglog 2<>/dev/msglog </dev/console
s6:6:wait:/sbin/rc6	>/dev/msglog 2<>/dev/msglog </dev/console
fw:0:wait:/sbin/uadmin 2 0	>/dev/msglog 2<>/dev/msglog </dev/console
of:5:wait:/sbin/uadmin 2 6	>/dev/msglog 2<>/dev/msglog </dev/console
rb:6:wait:/sbin/uadmin 2 1	>/dev/msglog 2<>/dev/msglog </dev/console
sc:234:respawn:/usr/lib/saf/sac -t 300
Листинг 9.3. Файл /etc/inittab
< Лекция 8 || Лекция 9: 12345 || Лекция 10 >