LOCALES: The Solaris [TM] 8 Operating System locales

1. How are locales packaged in Solaris 8?

2. What is the difference between the Solaris 8 Base Product and the Solaris 8 Multilingual Product? - The Solaris 8 Base Product - The Solaris 8 Multilingual Product - What are the contents of the Solaris 8 CD-ROMs?

3. What is a locale?

4. What is the difference between full and partial locales? - Where are the packages for the partial locales? - Where are the packages for the full locales?

5. Contents of the Solaris 8 Products. - What geographic regions are supported by Solaris 8? - What are the locales available on Solaris 8? - What are the full locales available on Solaris 8?

6. How do I add a locale to Solaris 8?

7. What are the packages I need to add XXX locale to Solaris 8?

8. The American, European, Middle Eastern and Australasian Locales.

9. The Asian Locales

10. Solaris 8 locales frequently asked questions (FAQs) and Troubleshooting help

11. Using locales in Solaris 8


1. How are the locales packaged in Solaris 8? ---------------------------------------------------------------------------- The packaging of locales has been changed in Solaris 8 Operating Environment. There are now 2 Solaris 8 Product kits that can be purchased:

- The Solaris 8 Base Product - The Solaris 8 Multilingual Product

What are the new features that these Solaris 8 Products provide?

The Solaris 8 operating environment now includes support for more than 90 locales, covering 37 languages, on both the Solaris 8 Software CD-ROMs and the Solaris 8 Languages CD-ROM. The Solaris 8 Software CD-ROMs provide an English interface to input, display, and print text in a target language, including multibyte locales. In addition, the Solaris 8 Languages CD provides the localized interface and documentation.

Note: Locales were packaged differently prior to Solaris 8. - For information about Solaris 7 locales see infodoc 44505


2. What is the difference between the Solaris 8 Base Product and the Solaris 8 Multilingual Product? ---------------------------------------------------------------------------- The Solaris 8 Base Product: The Solaris 8 Base Product provides all partial locales, (including partial multibyte locales) which provide the functionality needed to input, display and print text in their target languages while using English user interfaces.

The Solaris 8 Base Product has 2 separate CD-ROMs: - Solaris 8 Software 1 of 2 - Solaris 8 Software 2 of 2


The Solaris 8 Multilingual Product: The Solaris 8 Multilingual Product is made up of the Solaris 8 Base Product PLUS the Solaris 8 Languages CD-ROM.

The Solaris 8 Multilingual Product has 3 separate CD-ROMs: - Solaris Software 1 of 2 - Solaris Software 2 of 2 - Solaris 8 Languages


What are the contents of the Solaris 8 CD-ROMs? - The Solaris Software 1 of 2 CD-ROM contains most of core/essential localization packages. - The Solaris Software 2 of 2 CD-ROM also contains some localization packages. - The Solaris 8 Languages CD-ROM provides message translations (user interface and documentation) for 9 full locales: French, German, Italian, Spanish, Swedish, Japanese, Korean, Simplified Chinese, and Traditional Chinese. It also includes some additional software as BCP support, optional fonts, and locale-specific utilities.


3. What is a locale? ---------------------------------------------------------------------------- A locale is a collection of files, data and sometimes code which contain the necessary information to adapt Solaris to a specific geographical market. A locale is essentially a "bundle", containing information such as:

the messages displayed to the user (localized messages)

codesets

date and time formatting conventions

monetary conventions decimal formatting conventions

collation (sort) order

fonts and/or other writing specific information.

Note: Asian locales also contain input and output methods that are used to input and output the locale's characters. See * below.

* These input/output methods are usually processed by an input method server with various language engines and rendered by X11 internationalization output methods and associated libraries. Due to that, if you want to use native Asian input methods, you must start the input method server prior to do any input; otherwise, the only thing that you can input in the Asian locales would be 7-bit ASCII characters (which cannot render the multibyte fonts for the complex characters that the Asian languages use). Normally, if you start OpenWindows or the CDE desktop with an Asian language/locale as the login, the session manager for each GUI session will automatically start the input method server for you. This is also the recommended way from Globalization group.

Multiple environments exist within the Solaris 8 Operating Environment for support of different national languages. Each of these national environments is called a locale, which contains the language, its characters, fonts and the customs used to input and format data. Locales are not the same as a language, however, because a language can be spoken in various regions or be spoken in different countries.

Note: In Solaris, there can be several locales for a single language.

For example, French is spoken in France and in Canada, but each country has different ways of displaying monetary and time information. Therefore, there is both the fr_FR locale (French - France) as well as the fr_CA locale (French - Canada) to accomodate these different cultural conventions. Additionally, an English speaking user in the United States can select the en_US locale (English for the United States), while an English speaking user in Great Britain can select en_GB (English for Great Britain).

There are 2 types of locales in Solaris 8 - partial locales and full locales.




4. What is the difference between full and partial locales?
----------------------------------------------------------------------------
Partial Locales Partial locales have the locale functions listed above but they do not provide localized messages (messages translated into the language of the locale ). For example, the Russian ru locale can process input, output, sorting, and so on, but it does not have localized messages in Russian. For this reason it is a partial locale.

Note: In a partial locale , the messages from Solaris are in English.

However, some partial locales *do* use non-English messages because there may be a full locale with the localized messages. For example, the de_AT is a partial locale for Austria. Austrians speaks German but use a different currency. The Austrian is a subset of the German de . It displays messages in German and currency in Austrian shillings instead of German marks. Partial locales are the enablers of all the locales. The partial locales must be installed in order for a full locale to be functional.

With partial locales installed on the system, users can run applications on the target locales, while the OS/GUI messages from Solaris are English.


Full locales Full locales are made up of the partial locales PLUS the packages that provide the translations of messages from Solaris, and also provide on-line help files, optional fonts, and language specific features. A full Solaris locale has all of the listed functions and the localized system messages in that language. For example, the German de locale is a full locale. A German language user sees all system messages in German.

The full locale packages include translations of software messages, on-line help files, optional fonts and language specific features. Full locale packages provide the full set of language features to 9 languages.

Where are the packages for the partial locales? All partial locale packages are available on the Solaris 8 Operating System CD-ROMs. You do not need to have the Solaris 8 Languages CD-ROM to install the partial locales.

Where are the packages for the full locales? The message translation and language-specific feature packages that boost the German, French, Spanish, Swedish, Italian, Japanese, Korean, Simplified Chinese and Traditional Chinese partial locales into full locales are on the Solaris 8 Languages CD-ROM.

Note: The partial locale packages (enablers) also must be installed from the Solaris 8 Operating System CD-ROMs in order for the full locales to be functional.


5. Contents of the Solaris 8 Products. ---------------------------------------------------------------------------- Solaris 8 provides support for over 90 partial locales and 9 full locales which support the geographic regions of the Americas, Europe, the Middle East, Australasia and Asia. What geographic regions are supported by Solaris 8?

North America

Central America

South America

Northern Europe

Central Europe

Western Europe

Eastern Europe

Southern Europe

Middle East

North Africa

Australasia

Asia

What are the locales available on Solaris 8? The following tables list the available locales by geographic region.

Locale
User Interface
Territory
Codeset
Language Support

C
English
-
ISO/IEC 646(7-bit ASCII)
English

en_CA.ISO8859-1
English
Canada
ISO8859-1
English (Canada)

en_US.ISO8859-1
English
USA
ISO8859-1
English (U.S.A.)

en_US.ISO8859-15
English
USA
ISO8859-15
English (U.S.A., ISO8859-15 - Euro)

en_US.UTF-8
English
USA
UTF-8
English (U.S.A., Unicode 3.0)

fr_CA.ISO8859-1
French
Canada
ISO8859-1
French (Canada)




Locale
User Interface
Territory
Codeset
Language Support

es_CR.ISO8859-1
Spanish
Costa Rica
ISO8859-1
Spanish (Costa Rica)

es_GT.ISO8859-1
Spanish
Guatemala
ISO8859-1
Spanish (Guatemala)

es_MX.ISO8859-1
Spanish
Mexico
ISO8859-1
Spanish (Mexico)

es_NI.ISO8859-1
Spanish
Nicaragua
ISO8859-1
Spanish (Nicaragua)

es_PA.ISO8859-1
Spanish
Panama
ISO8859-1
Spanish (Panama)

es_SV.ISO8859-1
Spanish
El Salvador
ISO8859-1
Spanish (El Salvador)




Locale
User Interface
Territory
Codeset
Language Support

es_AR.ISO8859-1
Spanish
Argentina
ISO8859-1
Spanish (Argentina)

es_BO.ISO8859-1
Spanish
Bolivia
ISO8859-1
Spanish (Bolivia)

es_CL.ISO8859-1
Spanish
Chilie
ISO8859-1
Spanish (Chile)

es_CO.ISO8859-1
Spanish
Colombia
ISO8859-1
Spanish (Colombia)

es_EC.ISO8859-1
Spanish
Ecuador
ISO8859-1
Spanish (Ecuador)

es_PE.ISO8859-1
Spanish
Peru
ISO8859-1
Spanish (Peru)

es_PY.ISO8859-1
Spanish
Paraguay
ISO8859-1
Spanish (Paraguay)

es_UY.ISO8859-1
Spanish
Uruguay
ISO8859-1
Spanish (Uruguay)

es_VE.ISO8859-1
Spanish
Venezuela
ISO8859-1
Spanish (Venezuela)

pt_BR.ISO8859-1
English
Brazil
ISO8859-1
Portuguese (Brazil)




Locale
User Interface
Territory
Codeset
Language Support

da_DK.ISO8859-1
English
Denmark
ISO8859-1
Danish (Denmark)

da_DK.ISO8859-15
English
Denmark
ISO8859-15
Danish (Denmark, ISO8859-15 Euro)

fi_FI.ISO8859-1
English
Finland
ISO8859-1
Finnish (Finland)

fi_FI.ISO8859-15
English
Finland
ISO8859-15
Finnish (Finland ISO8859-15 Euro)

is_IS.ISO8859-1
English
Iceland
ISO8859-1
Icelandic (Iceland)

no_NO.ISO8859-1@bokmal
English
Norway
ISO8859-1
Norwegian (Norway -- Bokmal)

no_NO.ISO8859-1@nyorsk
English
Norway
ISO8859-1
Norwegian (Norway -- Nynorsk)

sv_SE.ISO8859-1
Swedish
Sweden
ISO8859-1
Swedish (Sweden)

sv_SE.ISO8859-15
Swedish
Sweden
ISO8859-15
Swedish (Sweden, ISO8859-15 Euro)

sv_SE..UTF-8
Swedish
Sweden
UTF-8
Swedish (Sweden, Unicode 3.0)




Locale
User Interface
Territory
Codeset
Language Support

cs_CZ.ISO8859-2
English
Czech Republic
ISO8859-2
Czech (Czech Republic)

de_AT.ISO8859-1
German
Austria
ISO8859-1
German (Austria)

de_AT.ISO8859-15
German
Austria
ISO8859-15
German (Austria, ISO8859-15 - Euro)

de_CH.ISO8859-1
German
Switzerland
ISO8859-1
German (Switzerland)

de_DE.UTF-8
German
Germany
UTF-8
German (Germany, Unicode 3.0)

de_DE.ISO8859-1
German
Germany
ISO8859-1
German (Germany)

de_DE.ISO8859-15
German
Germany
ISO8859-15
German (Germany, ISO8859-15 - Euro)

fr_CH.ISO8859-1
French
Switzerland
ISO8859-1
German (Switzerland)

hu_HU.ISO8859-2
English
Hungary
ISO8859-2
Hungarian (Hungary)

pl_PL.ISO8859-2
English
Poland
ISO8859-2
Polish (Poland)

sk_SK.ISO8859-2
English
Slovakia
ISO8859-2
Slovak (Slovakia)




Locale
User Interface
Territory
Codeset
Language Support

en_GB.ISO8859-1
English
Great Britain
ISO8859-1
English (Great Britain)

en_GB.ISO8859-15
English
Great Britain
ISO8859-15
English (Great Britain, ISO8859-15 - Euro)

en_IE.ISO8859-1
English
Ireland
ISO8859-1
English (Ireland)

en_IE.ISO8859-15
English
Ireland
ISO8859-15
English (Ireland, ISO8859-15 - Euro)

fr_BE.ISO8859-1
French
Belgium-Walloon
ISO8859-1
French (Belgium-Walloon)

fr_BE.ISO8859-15
French
Belgium-Wallon
ISO8859-15
French (Belgium-Walloon, ISO8859-15 - Euro)

fr_FR.ISO8859-1
French
France
ISO8859-1
French (France)

fr_FR.ISO8859-15
7 French
France
ISO8859-15
French (France, ISO8859-15 - Euro)

fr_FR.UTF-8
French
France
UTF-8
French (France, Unicode 3.0)

nl_BE.ISO8859-1
English
Belgium-Flemish
ISO8859-1
Dutch (Belgium-Flemish)

nl_BE.ISO8859-15
English
Belgium-Flemish
ISO8859-15
Dutch (Belgium-Flemish, ISO8859-15 - Euro)

nl_NL.ISO8859-1
English
Netherlands
ISO8859-1
Dutch (Netherlands)

nl_NL.ISO8859-15
English
Netherlands
ISO8859-15
Dutch (Netherlands, ISO8859-15 - Euro)




Locale
User Interface
Territory
Codeset
Language Support

bg_BG.ISO8859-5
English
Bulgaria
ISO8859-5
Bulgarian (Bulgaria)

et_EE.ISO8859-15
English
Estonia
ISO8859-15
Estonian (Estonia)

hr_HR.ISO8859-2
English
Croatia
ISO8859-2
Croatian (Croatia)

lt_LT.ISO8859-13
English
Lithuania
ISO8859-13
Lithuanian (Lithuania)

lv_LV.ISO8859-13
English
Latvia
ISO8859-13
Latvian (Latvia)

mk_MK.ISO8859-5
English
Macedonia
ISO8859-5
Macedonian (Macedonia)

ro_RO.ISO8859-2
English
Romania
ISO8859-2
Romanian (Romania)

ru_RU.KOI8-R
English
Russia
KOI8-R
Russian (Russia, KOI8-R)

ru_RU.ANSI1251
English
Russia
ansi-1251
Russian (Russia, ANSI 1251)

ru_RU.ISO8859-5
English
Russia
ISO8859-5
Russia (Russia)

sh_BA.ISO8859-2@bosnia
English
Bosnia
ISO8859-2
Bosnian (Bosnia)

sl_SI.ISO8859-2
English
Slovenia
ISO8859-2
Slovenian (Slovenia)

sq_AL.ISO8859-2
English
Albania
ISO8859-2
Albanian (Albania)

sr_YU.ISO8859-5
English
Serbia
ISO8859-5
Serbian (Serbia)

tr_TR.ISO8859-9
English
Turkey
ISO8859-9
Turkish (Turkey)




Locale
User Interface
Territory
Codeset
Language Support

el_GR.ISO8859-7
English
Greece
ISO8859-7
Greek (Greece)

es_ES.ISO8859-1
Spanish
Spain
ISO8859-1
Spanish (Spain)

es_ES.ISO8859-15
Spanish
Spain
ISO8859-15
Spanish (Spain, ISO8859-15 - Euro)

es_ES.UTF-8
Spanish
Spain
UTF-8
Spanish (Spain, Unicode 3.0)

it_IT.ISO8859-1
Italian
Italy
ISO8859-1
Italian (Italy)

it_IT.ISO8859-15
Italian
Italy
ISO8859-15
Italian (Italy, ISO8859-15 - Euro)

it_IT.UTF-8
Italian
Italy
UTF-8
Italian (Italy, Unicode 3.0)

pt_PT.ISO8859-1
English
Portugal
ISO8859-1
Portuguese (Portugal)

pt_PT.ISO8859-15
English
Portugal
ISO8859-15
Portuguese Portugal, ISO8859-15 - Euro)




Locale
User Interface
Territory
Codeset
Language Support

he_IL.ISO8859-8
English
Israel
ISO8859-8
Hebrew (Israel)




Locale
User Interface
Territory
Codeset
Language Support

ar_EY.ISO8859-1
English
Egypt
ISO8859-6
Arabic (Egypt)




Locale
User Interface
Territory
Codeset
Language Support

en_AU.ISO8859-1
English
Australia
ISO8859-1
English (Australia)

en_NZ.ISO8859-1
English
New Zealand
ISO8859-1
English (New Zealand)




Locale
User Interface
Territory
Codeset
Language Support

ja
Japanese
Japan
eucJP
Japanese (EUC)





JISX0201-1976



7

JISX0208-1990





JISX0212-1990

ja_JP.PCK
Japanese
Japan
PCK
Japanese (PC kanji)





JISX0201-1976





JISX0208-1990

ja_JP.UTF-8
Japanese
Japan
UTF-8
Japanese (UTF-8) Unicode 3.0

ko
Korean
Korea
5601
KSC 5601-1987

ko.UTF-8
Korean
Korea
UTF-8
Unicode 3.0

th
English
Thailand
TIS620.2533
Thai TIS620.2533

zh
Simplified Chinese
PRC
gb2312
GB2312-1980

zh.GBK
Simplified Chinese
PRC
GBK
Simplified Chinese (GBK) GBK

zh.UTF-8
Simplified Chinese
PRC
UTF-8
Unicode 3.0

zh_TW
Traditional Chinese
Taiwan
cns11643
CNS 11643-1992

zh_TW.BIG5
Traditional Chinese
Taiwan
BIG5
BIG5

zh_TW.UTF-8
Traditional Chinese
Taiwan
UTF-8
Unicode 3.0



Note : A single locale can have more than one locale name. For example, ja_JP.eucJP is the same as ja. Also, fr_FR.ISO8859-1 is the same as fr.

Note : Locale names have been updated from the Solaris 7 environment in keeping with international naming standards.




이어지는 내용

by 무난하게 | 2005/04/20 13:09 | Technical.Doc | 트랙백

prstat (2)


일반적인 서버에서는 수많은 소형 프로세스가 빈번하게 일어나며 각각은 CPU를 적게나마 사용하게 된다. 많은 사용자들이 공유하는 서버와 같은 시스템에서, prstat는 어떤 사용자들이 가장 많은 자원 사용하고 있는지 알아내는 데 사용될 수 있다. 만일 시스템에서 가장 많은 자원을 사용하는 사용자를 알아낼 수 있다면, 적어도 작업의 일부분을 다른 시스템으로 옮길 수도 있을 것이다. 사용자가 자원을 소모하는 통계치를 prstat를 이용해 알아보려면, prstat 명령어에 -a 옵션을 붙이면 된다.

prstat 명령어에 -a 옵션을 붙이면 각 사용자들이 사용하는 프로세서의 개수, CPU의 퍼센테이지, 메모리 사용량 등을 알 수 있다. prstat -s cpu -a -n 8 명령어는 CPU를 사용하고 있는 최상위 8개의 프로세스와 각 사용자별 자원 사용 통계치를 나열해준다.

다음 결과값은 사용자 larry가 대부분의 CPU 자원을 차지하고 있는 것을 보여준다.



kincaid/tartan 43 $ prstat -s cpu -a -n 8

PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
17005 larry 888K 432K run 21 0 0:03.15 38% cpuhog/1
17015 larry 888K 432K run 21 0 0:03.06 36% cpuhog/1
17175 larry 944K 872K run 24 0 0:00.37 5.7% find/1
16911 moe 944K 872K sleep 58 0 0:00.48 3.3% find/1
16915 moe 944K 872K sleep 59 0 0:00.43 3.3% find/1
17849 curly 944K 872K run 31 0 0:00.00 3.0% find/1
16472 root 132M 42M sleep 59 0 0:01.00 0.9% Xsun/1
16827 kincaid 6864K 4704K sleep 48 0 0:00.05 0.4% dtterm/1

NPROC USERNAME SIZE RSS MEMORY TIME CPU

8 moe 8248K 6800K 0.7% 0:01.31 6.6%
3 curly 3336K 2832K 0.3% 0:00.00 3.0%
34 root 213M 95M 9.5% 0:03.05 1.0%
78 kincaid 433M 294M 30% 0:00.38 0.7%

Total: 132 processes, 218 lwps, load averages: 3.90, 4.29, 2.45

kincaid/tartan 44 $


프로세서들의 집합 살펴보기
Solaris 운영체계는 멀티프로세서 머신 상에서 애플리케이션을 작동시키는 데 사용된다. 시스템 관리자는 프로세서 집합이라는 것을 빈번하게 생성한다. 프로세서 집합이란 작업을 부여할 수 있는 CPU의 집합이다. 예를 들어 웹 서버와 애플리케이션 서버를 가동하는 데 사용되는 4개의 CPU를 장착한 머신을 생각해보자. 이 두 작업 간의 CPU 자원을 분배하는 접근 방법 중 하나는 각각 2개의 CPU를 하나로 하는 프로세서 집합을 2개 생성한 후, 하나의 프로세서 집합에는 웹 서버를, 또 하나의 프로세서 집합에는 애플리케이션 서버를 연결시키는 것이다. 이러한 방법은 하나의 서버가 시스템의 모든 CPU 자원을 소비하는 것을 막아준다.

다음에 포함된 것은 2개의 프로세서 집합을 생성하기 위해 사용할 수 있는 명령어 집합들이다.

# psrset -c 0
created processor set 1
processor 0: was not assigned, now 1

# psrset -a 1 1
processor 1: was not assigned, now 1

# psrset -c 2
created processor set 2
processor 2: was not assigned, now

2 # psrset
user processor set 1: processors 0 1
user processor set 2: processor 2

프로세서 집합이 생성된 후, prstat 명령어는 특정 프로세서 집합에 대한 프로세스 결과값만을 검색할 수 있도록 제한해 사용할 수 있다. 이는 -C 옵션을 이용하면 된다. 예를 들어 prstat -C 1 -s cpu라고 명령하면 프로세서 집합 1에만 한정된 프로세스 활동이 출력되며 CPU 점유율 순으로 정렬된다. 이 명령어는 어떤 프로세서 집합에 어떤 프로세스들이 수행되고 있는가를 알아보는 데 매우 유용하다.

프로세서 집합에 대한 CPU 컬럼을 평가하는 것은 프로세서 집합이 얼마나 바쁘게 움직이는지를 판단하는 데에도 유용하게 사용되므로 어떤 프로세서 집합에 어떠한 작업을 부여하는지를 결정할 수 있는 것이다.
단 prstat의 CPU 컬럼은 항상 프로세스가 사용하고 있는 시스템 CPU 자원의 점유율을 출력해주는 것이지 프로세서나 프로세서 집합의 CPU 자원 점유율을 나타내는 것은 아니다. 이것은 -C 옵션을 명령어와 함께 사용할 때에도 마찬가지이다. 예를 들어 4개의 프로세서를 장착한 시스템 상에서 2개의 프로세서 집합이 있을 때 prstat -C를 한 프로세서 집합에서 실행시킬 경우, 프로세서 집합은 시스템 CPU의 50%만 가지고 있으므로 CPU 컬럼의 전체 점유율은 50%를 넘지 않을 것이다.



시스템 상에서 활성화된 작업이 시스템에서 가용한 물리적 메모리의 양보다 많은 메모리 자원을 요구할 경우, 시스템은 프로그램의 활성화 섹션을 위해 가용한 메모리를 만들어주려고 디스크에 페이징을 요청하게 된다. 이것을 페이징이라고 한다. 시스템이 페이징을 시작하면, 시스템 성능은 현저하게 떨어진다. 시스템이 페이징되고 있는지 여부를 판단할 수 있는 좋은 툴로서는 sar가 있다. sar -g 명령어는 주어진 시스템에서의 페이징 통계를 보여준다.

시스템이 페이징을 하는 가장 일반적인 원인에는 시스템 메모리의 대부분을 이용하는 프로세스나 프로세스 그룹이 있다. prstat는 어떤 프로세스가 시스템 메모리의 대부분을 사용하고 있는지를 알아내는 아주 좋은 툴이다. 앞서 말한 명령어와 비슷하게 prstat -s size라는 명령어를 이용하면 CPU의 사용량이 아닌 크기별로 prstat의 결과값이 나열된다.

다음 결과값은 매우 높은 페이징을 하고 있는 시스템에 대해 sar -g 명령을 내렸을 때이다.

sar -g 5 5
SunOS tartan 5.8 Generic_108528-01 sun4u 02/12/01
13:20:37 pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
13:20:42 39.92 538.72 670.26 1147.31 0.00
13:20:47 36.60 483.80 515.40 353.80 0.00
13:20:52 40.20 508.20 632.00 1125.20 0.00
13:20:57 35.80 462.60 580.40 1141.60 0.00
13:21:02 0.00 0.00 0.00 0.00 0.00
Average 30.51 398.72 479.69 753.74 0.00

일단 시스템 성능 저하의 주범이 과도한 페이징 작업의 결과라고 판단을 내렸으면, 다음으로는 어떤 프로세스가 원인인가를 밝혀야 한다. 또한 스캐닝이 수시로 발생한다면(앞의 결과값에서 pgscan/s 컬럼에 나온 수치) 시스템의 메모리가 부족한 것이다. 페이징의 원인을 모두 밝혀내기란 쉽지 않지만 대부분의 가상 메모리를 사용하고 있는 프로세스를 먼저 알아내는 것이 좋은 방법이 된다. 가상 메모리 대부분을 사용중인 프로세스를 보려면 prstat 명령어에 -s size 옵션을 사용하면 된다. prstat -s size -n 5라고 명령하면 가상 메모리를 사용하는 시스템 내의 5개 상위 프로세스가 나타난다. 앞서의 sar 명령어를 수행한 시스템에 다시 prstat -s size -n 5라는 명령을 내린 것이 다음 예이다.

tartan% prstat -s size -n 5

PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
21307 kincaid 1001M 616M run 2 0 0:01.16 32% memhog/1
16472 root 138M 43M sleep 59 0 0:17.28 1.2% Xsun/1
1813 kincaid 92M 31M sleep 49 0 0:01.42 0.0% soffice.bin/9
16574 kincaid 44M 24M sleep 49 0 0:10.37 0.2% .netscape.bin/1
16674 kincaid 36M 25M sleep 49 0 0:00.08 0.0% sdtperfmeter/1

Total: 130 processes, 220 lwps, load averages: 0.51, 0.36, 0.23

위의 예에서 보면 한 개의 프로세스가 가상 메모리를 1,000MB 이상 사용하고 있다. 이 시스템은 물리적 메모리가 총 1GB밖에 되지 않는다. ID 21307인 memhog라는 프로세스가 시스템의 성능 저하를 가져온 프로세스로 보인다. 시스템의 해당 프로세스를 종료시키는 kill -9 21307 명령을 주면, 성능은 다시 정상으로 돌아오며 sar 명령어를 다시 수행하면 모든 페이징 및 스캐닝이 멈췄음을 다음과 같이 확인할 수 있다.

tartan% sar -g 5 5

SunOS tartan 5.8 Generic_108528-01 sun4u 02/12/01

13:20:02 pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
13:20:07 0.00 0.00 0.00 0.00 0.00
13:20:12 0.00 0.00 0.00 0.00 0.00
13:20:17 0.00 0.00 0.00 0.00 0.00
13:20:22 0.00 0.00 0.00 0.00 0.00
13:20:27 0.00 0.00 3.80 590.60 0.00
Average 0.00 0.00 0.76 118.07 0.00



앞서에서는 시스템 성능에 영향을 주는 프로세스를 알아내는 데 사용되는 prstat의 사용법을 알아보았다. 이번에는 prstat를 이용해 개별 프로세스를 세부적으로 알아보는 방법을 살펴본다. 이번에 소개하는 기술은 서버 애플리케이션을 개발하거나 수행할 때 자주 직면하게 되는 특정한 형태의 버그나 문제들을 디버깅하는 데 유용한 것들이다.

prstat는 프로세스에 대한 새로운 통계치를 화면에 주기적으로 갱신해준다. 특정 프로세스에 대한 집중적인 사항을 알아보는 데에는 두 개의 명령어 옵션이 있으며, 이를 이용해 장시간동안 프로세스를 감시할 수 있다.



prstat를 이용해 특정 프로세스나 프로세스 집합에 대한 한정된 통계치를 얻으려면 -p 옵션을 이용하면 해당 프로세스 ID에 대한 결과값이 나온다. 프로세스 ID는 ps -ef 명령어를 이용해 얻을 수 있다. 성능에 영향을 미칠 것이라고 의심이 되는, 실행중인 프로세스의 정보를 수집하는 데에는 아주 유용한 방법이다.



기본적으로 prstat는 모니터링중인 프로세스에 대한 새로운 통계치를 리포트할 때마다 터미널 스크린을 업데이트해준다. 그러나 만일 프로세서가 자원 누수를 나타내는지 혹은 프로세서 성격이 어떠한지를 파악해야 할 때에는 비교를 위해 prstat 결과값에 대한 여러 개의 데이터 집합군을 갖는 편이 유용하다. 만일 사용자가 prstat의 출력을 파일로 리다이렉션한다면 prstat가 생성해내는 통계치는 파일로 보존된다.

by 무난하게 | 2005/02/27 00:44 | Technical.Doc | 트랙백(1)

prstat (3)


다음과 같은 시나리오를 생각해보자. 사용자는 소프트웨어 벤더가 제공한 서버 애플리케이션이 약간의 메모리 누수 현상을 보이고 있다고 의심한다고 가정해보자. 이 사실을 벤더에게 제시하기 위해, 서버 애플리케이션의 프로세스 ID로 제한하는 prstat 명령어를 수행시켜서 매 15초마다 결과값을 수합하고자 한다. 다음 코드 예제는 이를 실행시키는 방법을 나타낸다.


kincaid/tartan 74 $ server &

[1] 2423
kincaid/tartan 75 $
kincaid/tartan 56 $ prstat -p 2423 15 > server.out &
kincaid/tartan 57 $ tail -f server.out
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 32M 1008K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 47M 1248K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 62M 1488K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 77M 1728K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 92M 1968K sleep 58 0 0:00.00 0.0% server/1
Total: 1 processes, 1 lwps, load averages: 0.00, 0.01, 0.01
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
2443 kincaid 107M 2208K sleep 58 0 0:00.00 0.0% server/1

prstat가 수집하는 데이터를 보면, 프로세스는 매 15초마다 대략 15MB씩 증가하고 있는 것이 명확히 나타난다. 또한 프로세스의 레지던트 세트 크기는 매 15초마다 대략 40K씩 증가하고 있다. 서버 애플리케이션의 메모리 누수 현상 외에 이 현상을 설명할 다른 방안도 있겠지만, 이 코드 예제에서 나타난 바와 같은 데이터는 애플리케이션의 메모리 누수 현상이 있을 것이라는 강력한 의심을 뒷받침한다.

Java 서버 애플리케이션 메모리 누수 쓰레드를 관찰하기 위해 prstat 명령어를 사용하는 방법이 나오는 예제가 여기에 있다. prstat는 항상 각 프로세서 내에 lwps(쓰레드) 번호를 나타내준다.



kincaid/tartan 47 $ prstat -p 3221 > threads.out &

[1] 3235
kincaid/tartan 48 $ tail -f threads.out
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M run 58 0 0:00.00 32% java/43
Total: 1 processes, 43 lwps, load averages: 1.29, 1.20, 1.18
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M sleep 58 0 0:00.00 36% java/45
Total: 1 processes, 45 lwps, load averages: 1.44, 1.23, 1.19
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M sleep 58 0 0:00.00 38% java/48
Total: 1 processes, 48 lwps, load averages: 1.43, 1.23, 1.19
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M run 44 0 0:00.00 45% java/50
Total: 1 processes, 50 lwps, load averages: 1.65, 1.29, 1.21
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M sleep 58 0 0:00.00 52% java/52
Total: 1 processes, 52 lwps, load averages: 2.03, 1.37, 1.24
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
3221 kincaid 29M 11M run 48 0 0:00.00 55% java/55


이 출력 내용은 시간 경과에 따른 lwps의 수치를 보여준다. 따라서 서버 애플리케이션이 쓰레드를 누수하는 가능성을 보여준다.



사용자는 prstat를 이용해 다른 자원 누수 현상도 찾아낼 수 있다. prstat가 가진 아주 매력적인 특징은 -L 스위치를 사용하면 볼 수 있으며, 이 경우 prstat는 프로세스의 각 쓰레드에 대한 통계치를 출력해준다. 이것은 다음과 같이 다양하게 사용할 수 있다.

- 각 쓰레드의 CPU 점유율을 살펴봄으로서 풀 간에 작업량을 어떻게 조절할 수 있는지를 판단할 수 있다.
- 프로세서만이 아니라 개별 쓰레드에 대한 자원 누수 현상을 감소시킬 수 있는 옵션이다. 예를 들어 사용자는 어떤 쓰레드가 메모리를 누수시키는지를 판단할 수 있다.

kincaid/tartan 49 $
kincaid/tartan 49 $ prstat -L -p 3295

PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/LWPID
3295 kincaid 28M 10M sleep 38 0 0:00.01 2.1% java/16
3295 kincaid 28M 10M sleep 55 0 0:00.01 1.9% java/17
3295 kincaid 28M 10M sleep 48 0 0:00.01 1.8% java/15
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.8% java/23
3295 kincaid 28M 10M sleep 52 0 0:00.01 1.7% java/12
3295 kincaid 28M 10M sleep 48 0 0:00.01 1.6% java/22
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.5% java/13
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.5% java/14
3295 kincaid 28M 10M sleep 48 0 0:00.01 1.4% java/19
3295 kincaid 28M 10M sleep 48 0 0:00.01 1.4% java/18
3295 kincaid 28M 10M sleep 38 0 0:00.01 1.4% java/21
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.3% java/24
3295 kincaid 28M 10M sleep 58 0 0:00.01 1.2% java/20
3295 kincaid 28M 10M sleep 58 0 0:00.00 0.0% java/1
3295 kincaid 28M 10M sleep 58 0 0:00.00 0.0% java/11
3295 kincaid 28M 10M sleep 0 0 0:00.00 0.0% java/10
3295 kincaid 28M 10M sleep 59 0 0:00.00 0.0% java/9
3295 kincaid 28M 10M sleep 0 0 0:00.00 0.0% java/8
3295 kincaid 28M 10M sleep 0 0 0:00.00 0.0% java/7
3295 kincaid 28M 10M sleep 59 0 0:00.00 0.0% java/6
3295 kincaid 28M 10M sleep 58 0 0:00.00 0.0% java/5

Total: 1 processes, 24 lwps, load averages: 1.30, 1.22, 1.21
kincaid/tartan 50 $



어떤 프로세스가 작동중인지를 좀더 확인해보려면, 사용자는 prstat에 -m 옵션을 이용해 프로세스의 미시적 통계치를 출력해볼 수 있다. 사용자가 -m 옵션을 지정하면, prstat는 다른 컬럼 집합을 보여주는데, 이곳에는 최종 샘플이 구해진 이후 프로세스가 어떻게 시간을 사용했는지를 나타내게 된다.
표 1은 마이크로 통계 컬럼 머릿말과 의미를 나타낸 것이다.

표 1. 마이크로 통계 컬럼 머릿말과 의미
컬럼 머릿말 의미
USR 사용자 모드에서 프로세스가 사용한 시간 점유율
SYS 시스템 모드에서 프로세스가 사용한 시간 점유율
TRP 시스템 트랩을 처리하면서 사용한 시간 점유율
DFL 데이터 페이지 fault를 처리하면서 사용한 시간 점유율
LCK 사용자 잠금 대기 시간에 프로세스가 사용한 시간 점유율
SLP 절전 모드에 프로세스가 사용한 시간 점유율
TFL 텍스트 페이지 fault를 처리하면서 사용한 시간 점유율

다음 예제는 앞서 나온 서버 애플리케이션에서 -m 옵션을 사용해 출력된 것이다.

prstat -m -p 3295
PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/NLWP
3295 kincaid 0.8 0.0 0.0 0.0 0.0 0.0 99 0.0 22 4 25 0 java/24


이러한 컬럼의 의미와 내용을 여기서 설명하는 것은 다소 주제를 벗어나는 일이다. 그러나 사용자가 운영체계의 개념 및 Solaris 내부구조와 점점 친숙해짐으로써, 개별 프로세스나 혹은 프로세스 그룹의 미시적인 통계치를 모니터링하는 능력은 아주 강력한 툴이 되어줄 것이며, 특히 성능과 관련된 사항을 파악하고자 할 때는 더욱 그러할 것이다. 또한 -m 옵션은 -L 옵션과 함께 사용할 수 있으므로 프로세스의 각 쓰레드의 미시적인 통계치도 감시할 수 있다.



이미 언급했듯이, prstat는 다른 Solaris 성능 감시 툴과 함께 사용할 수 있으므로 개발자에게 있어서는 시스템 성능과 관련된 문제를 디버깅하고 증상을 파악하는 데 사용하는 무기라고 할 수 있다. 다른 몇몇 Solaris 툴로서 살펴볼 만한 가치가 있는 것으로는 sar와 iostat, netstat, mpstat 등이 있다. 이들은 시스템 성능 문제를 파악하는 데 있어서 아주 좋은 툴들이다. prstat는 이들의 아주 좋은 보완 툴이다. 즉 prstat는 시스템 성능 문제에 직접 영향을 주는 프로세스와 쓰레드를 더욱 세밀하게 파악할 수 있도록 해주기 때문이다.



prstat는 Solaris 툴 세트에 첨가된 매우 훌륭한 툴이다. 이것은 표준형으로서 Solaris 2.8부터 소개되었다. 개발자들은 더 이상 새로운 Solaris가 출시될 때마다 top 버전을 업그레이드하지 않아도 된다. prstat는 top 버전에서는 발견할 수 없는 여러 가지 강력한 특징이 추가되어, 사용자들이 가장 널리 사용되는 특징들을 모두 가지고 있다.

이 글을 통해서 Solaris 개발자들은 자신의 애플리케이션이 시스템 자원을 어떻게 소모하며 애플리케이션이 시간을 어떻게 소모하고 있는지를 이해했을 것이다. 이와 함께 개발자들은 자신의 애플리케이션에서의 자원 고갈을 파악하고 이를 보정할 수 있으며, 자신의 애플리케이션이 Solaris 플랫폼상에서 더욱 향상된 성능을 낼 수 있도록 변경할 수 있는 방법을 얻게 된 셈이다.



이 글은 Tom Kincaid와 Andrei Dorofeev씨가 쓴 ‘Topping top in Solaris 8 with prstat’를 정리한 것임을 밝혀둔다

by 무난하게 | 2005/02/27 00:43 | Technical.Doc | 트랙백(1)

TCP Keepalive

INFODOC ID: 17468

개요: TCP Keepalive 해설
세부 설명:


Sun Microsystems는 TCP keepalive 매개 변수(tcp_keepalive_interval)를 15분 미만으로 설정하는 것은 바람직하지 않다고 봅니다.
이제 TCP keepalive를 설명한 후에, 왜 그것이 바람직하지 않은지 몇 가지 이유를 설명할 것입니다.

우선, keepalive가 TCP의 필수 요소가 아니라는 점을 말하고 싶습니다. keepalive는 TCP 규격에 나오는 옵션 기능의 하나이며, 제조업체의 재량에 따라 포함시킬 수 있습니다. Sun은 TCP에 이 기능을 포함시키기로 결정했습니다. 하지만 TCP 규격에서는 keepalive 기능을 포함시키는 경우 간격을 최소한 2시간 이상으로 기본 설정해야 한다고 규정합니다. 뿐만 아니라 이 기능을 옵션 기능으로 만들어야 합니다. 바로 그 점 때문에 TCP keepalive를 설정할 것인지 여부를 각 프로그램에게 맡기게 되는 것입니다.
프로그램이 TCP keepalive를 명시적으로 실행하지 않으면, 탐색 패킷(probe)을 보내지 않을 것입니다. TCP keepalive는 setsockopt()을 사용하여 소켓 옵션(SO_KEEPALIVE)을 설정하면 사용할 수 있게 됩니다.

소켓 옵션이 설정되면 tcp_keepalive_interval로 지정된 시간 동안 연결이 유휴 상태가 되었을 때 keepalive 탐색 패킷을 보냅니다.
응답 메시지가 수신될 때까지 또는 tcp_ip_abort_interval로 지정된 시간이 다 경과할 때까지 탐색 패킷을 보냅니다. 응답은 연결 상대측을 지연시키는 요소의 영향을 받습니다. 연결 상대측이 연결을 닫거나 다시 부팅을 하면 응답 메시지는 RST(reset packet)가 됩니다. 수신 주소에 도달할 수 없다는 ICMP 메시지를 수신하게 될 가능성도 있습니다. 라우터가 고장나거나 케이블 연결이 끊긴 경우에 그런 상황이 발생합니다. 그 외에도 많은 가능한 상황이 있습니다. 탐색 패킷 자체는 tcp_rexmit_interval로 지정된 간격으로 보내집니다.

keepalive를 15분 미만으로 설정해서는 안된다고 제안하는 이유 중의 하나는 바로 이것입니다. 그렇게 설정하면 TCP가 장애를 일으킬 가능성이 다분히 있습니다. tcp_rexmit_interval의 값은 3초로 기본 설정됩니다. 20초 정도로 높게 설정할 수도 있습니다. 그런데, tcp_keepalive_interval을 tcp_rexmit_interval 보다 작은 값으로 줄이면, 재전송하기 전에 keepalive 탐색 패킷을 보낼 것입니다. 하지만, 네트워크가 느리거나 팻 상태가 되면 재전송이 매우 중요합니다. 어쩌면 통신 상대측 시스템이 느려서 아직 응답하지 않은 것일 수도 있습니다. 재전송을 보내는 이유가 바로 이것입니다. 이것은 누군가에게 조금 전에 내가 한 말을 들었느냐고 묻는 것과 같습니다. 상대방이 없다고 판단되면 대화를 미리 중단하거나 상대방이 있는지 알아 보려고 시간을 낭비하게 될 것입니다. 상대측이 여전히 대화에 참여하고 있다면 그에게 직접 조금 전에 내가 한 말을 들었느냐고 다시 묻게 될 것입니다. 이렇게 되면 네트워크가 팻 상태가 됩니다. 네트워크가 팻 상태가 되면 될수록 제대로 작동이 되려면 재전송을 더 많이 해야 합니다. 그렇게 하여 TCP가 장애를 일으키게 됩니다.
(이제 tcp_rexmit_interval가 3개의 매개 변수, 즉 tcp_rexmit_interval_initial, tcp_rexmit_interval_max, 그리고 tcp_rexmit_interval_min로 나누어져 있다는 점을 지적해야겠습니다. 이 점에 대한 해설은 keepalive 해설에서 벗어난 것입니다. 여기서 사용하는 예에서는 주로 tcp_rexmit_interval_initial을 다룰 것입니다.)

텔넷의 경우에는 더 인상적입니다. 시스템에 텔넷 방식으로 연결되면 로그인을 하여 필요한 모든 작업을 할 수 있습니다. 하지만, 종종 작업을 멈추고 생각하는 시간도 있습니다. 그렇게 생각하는 동안 원격 호스트는 대기합니다. 그렇게 기다리는 동안에는 keepalive 탐색 패킷이 도착할 때까지 로컬 시스템과 원격 시스템 사이에 전송되는 패킷이 전혀 없습니다.
원격 호스트로 로그인한 다음에 10분 이상 생각에 잠기는 경우도 종종 있습니다. 그 10분 간격 동안 라우터가 다운이 되어 다시 부팅하게 되는 일도 쉽게 일어납니다. keepalive를 높은 값으로 설정하면 라우터 충돌을 느끼지 못하고 작업을 계속하게 될 것입니다.
하지만 1분 후에 keepalive 탐색 패킷를 보내면, 라우터는 다시 부팅할 시간이 없기 때문에 연결된 측이 준비가 되기 전에 연결이 닫히게 됩니다. 그러면 다시 로그인해야 합니다. 뿐만 아니라, 일단 연결이 닫히면 TIME_WAIT 상태로 유지된다는 점을 생각해야 합니다. TIME_WAIT 상태는 한쪽 호스트가 연결을 닫았는데, 늦게 도착한 패킷 때문에 다른 한 호스트에서는 연결을 계속 열어 두게 되는 상황을 방지하기 위해 사용합니다. 하지만, 이처럼 너무 일찍 연결을 종료시키면, 시스템에서 이용할 수 있는 모든 소켓이 닫히게 될 가능성이 있습니다. 그렇게 되면 전혀 연결이 되지 않을 것입니다. 이와 같은 시나리오에서는 15분이 훨씬 더 타당한 값입니다.

keepalive를 사용하는 주된 이유는 종단 시스템 중의 하나가 다운될 때 발생할 수 있는 한쪽만 열린 연결 상태를 정리하는 것입니다. 로컬 시스템이 대화를 하고 있는 원격 시스템이 다운이 되면, 로컬 시스템은 여전히 연결을 열어두고 있을 것입니다. 하지만, 다운된 그 시스템은 그렇지 않습니다. 이것을 한쪽만 열린 연결 상태라고 합니다. 네트워크 응용 프로그램이 시간 종료값이나 TCP keepalive 소켓 옵션을 설정하지 않는 한, 그 한쪽만 열린 연결 상태는 시스템이 다시 부팅할 때까지 그대로 유지됩니다. keepalive 탐색 패킷은 한쪽만 열린 연결 상태인지 확인하는데 사용되며, 한쪽만 열린 연결 상태이면 그 연결을 닫습니다.

이상의 내용은 몇 가지 상황에 대한 해설에 불과합니다. 분명히 사용자의 현재 상황에 훨씬 더 어울리는 시나리오가 더 많이 있을 것입니다. 기본적으로 여기서 말한 내용은 TCP 규격 자체가 keepalive의 기본 설정값이 최소한 두 시간이어야 한다고 규정한다는 점입니다. 더 나아가 Sun이 제안하는 요점은 TCP가 장애를 일으켜 네트워크를 팻 상태로 만드는 것을 방지하는 데 있습니다.
이것은 사용자가 수정하는 시스템과 네트워크의 다른 호스트에 그대로 적용됩니다. 문제의 네트워크에 전세계적인 인터넷이 포함되면 좀더 극적이 되는 것일 뿐입니다. 마지막 예에서는 keepalive를 다소 낮게 설정했을 때 발생하는 문제의 유형을 사용자 수준에서 설명합니다.

여기서 제안된 내용은 기술 지원과 개발 엔지니어링 분야에서 그리고 Sun Microsystems 전체에서 TCP를 다루는 작업을 하는 엔지니어들에게서 장기간에 걸쳐 보완된 것입니다.

TCP keepalive에 관하여 좀더 알고 싶다면 RFC 1122와 RFC 1123을 권합니다. Addison Wesley에서 발행한 책인 "TCP/IP Illustrated Volume I", ISBN: 0-201-63346-9의 필자인 Stevens도 멋지게 설명합니다.


제품 영역: Gen. Network
제품: TCP/IP
SUNOS 릴리즈: 해당 없음
하드웨어: 해당 없음

by 무난하게 | 2005/02/27 00:40 | Technical.Doc | 트랙백

ufsdump 로 disk copy

DISK의 용량 증설이나 DISK block error 발생시 디스크 카피 할 일이 생깁니다.
여기서 찾아 봤는데 DISK COPY하는 방법이 잘 설명 되어 있더군여
ufsdump 0f - 원데이터경로 | (cd 대상경로; ufsrestore xf -)
하셔두 되구여
해당 디렉토리로 이동 하시구
ufsdump 0f - *| (cd 대상경로; ufsrestore xf -)
하시면 됩니다.

참고로 OS 파티션을 COPY 한 경우 boot를 줘야 합니다. 아님 부팅 안됩니다..ㅡㅡ;;
installboot ./bootblk /dev/dsk/c0t0d0s0

Disk to Dsik Copy
ex)
hoetosolaris # ufsdump 0f - /dev/rdsk/c0t3d0s0 | (cd /root2; ufsrestore xf -)

# cd /usr
# ufsdump 0f - /usr | (cd /usr2; ufsrestore xf - )


by 무난하게 | 2005/02/27 00:38 | Technical.Doc | 트랙백

프로세스의 이상자원 파악

Java 프로세스에 대해 prstat 명령을 실행합니다. 패턴을 파악할 수 있도록 이 명령을 여러 번 반복합니다. 예를 들면 다음과 같습니다. prstat -L -p 1 1
Java 프로세스에 대해 pstack 명령을 실행하여 LWP(Light Weight Process)를 PID(프로세스 ID)로 매핑합니다.
예: pstack 9499 실행 후 출력을 파일로 리다이렉션합니다.
Solaris에서 일반적인(/usr/lib) 스레드 라이브러리를 사용하는 경우 즉, LD_LIBRARY_PATH에 /usr/lib/lwp가 없는 경우, LWP는 OS 스레드로 직접 매핑되지 않으므로 프로세스에 대해 pstack을 실행해야 합니다. 따라서 대체(alternate, /usr/lib/lwp) 스레드 라이브러리를 사용하고 있는지 확인해야 합니다.
실행 중인 스레드에 대한 올바른 정보를 얻기 위해 몇 번에 걸쳐 서버의 스레드 덤프를 작성합니다.
이 작업을 수행하려면 Java 프로세스에 대해 kill -3 를 수행합니다.

LWP ID를 Java 스레드 ID에 매핑합니다.
예를 들어, 문제의 LWP가 "8"이고 그것이 Java 스레드 "76"으로 매핑되었다고 가정합니다. 그러면 76의 16진수 값인 0x4c를 구합니다.

스레드 덤프에서 "nid= <스레드 식별자>"와 일치하는 스레드를 찾습니다.
이 예에서 "nid=0x4c"와 일치하는 스레드를 찾을 수 있으며, 이 스레드가 바로 CPU 사용량이 높은 스레드입니다.

그런 후 다음을 수행해야 합니다.
코드에서 이러한 문제가 발생한 이유를 파악합니다.

또는 스택 트레이스의 내용에 WebLogic 라이브러리가 최상위에 있는 경우 BEA 고객 지원부에 문의합니다.
다음은 위에 설명한 프로세스를 Solaris용으로 만든 예제입니다.

Java 프로세스에 대해 prstat 명령을 실행합니다.
$ prstat -L -p 9499 1 1
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/LWPID
9499 usera 153M 100M sleep 58 0 0:00.22 0.6% java/8
9499 usera 153M 100M sleep 58 0 0:00.10 0.2% java/10
9499 usera 153M 100M sleep 58 0 0:00.11 0.1% java/9
9499 usera 153M 100M sleep 58 0 0:00.03 0.0% java/5
9499 usera 153M 100M sleep 58 0 0:01.01 0.0% java/1
9499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/12
9499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/11
9499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/14
9499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/13
9499 usera 153M 100M sleep 59 0 0:00.07 0.0% java/7
9499 usera 153M 100M sleep 59 0 0:00.00 0.0% java/6
9499 usera 153M 100M sleep 59 0 0:00.00 0.0% java/4
9499 usera 153M 100M sleep 58 0 0:00.11 0.0% java/3
9499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/2

pstack 명령을 실행합니다.
예: pstack 9499 실행 후 출력을 파일로 리다이렉션합니다.
Solaris에서 일반적인 스레드(/usr/lib) 라이브러리를 사용하는 경우 즉, LD_LIBRARY_PATH에 /usr/lib/lwp가 없는 경우, LWP는 OS 스레드로 직접 매핑되지 않으므로 프로세스에 대해 pstack을 실행해야 합니다. 따라서 대체(alternate, /usr/lib/lwp) 스레드 라이브러리를 사용하고 있는지 확인해야 합니다.

위의 예제에서는 prstat 결과의 최상위에 "java/8" 프로세스가 표시되었습니다.

"lwp# 8"에 대한 pstack 결과를 검토합니다.
아래와 같이 이 값이 pstack 결과의 "thread# 76"에 매핑된다는 것을 알 수 있습니다.

----------------- lwp# 8 / thread# 76 --------------------
ff29d190 poll (e2e81548, 0, bb8)
ff24d154 select (0, 0, 0, e2e81548, ff2bf1b4, e2e81548) + 348
ff36b134 select (0, bb8, 7fffffff, fe4c8000, 0, bb8) + 34
fe0f62e4 __1cCosFsleep6FpnGThread_xl_i_ (0, bb8, fe4c8000, 1, 0, 1e2fd8) + 234
fe23f050 JVM_Sleep (2, 0, bb8, fe4de978, fe4c8000, 1e2fd8) + 22c
0008f7ac ???????? (e2e818d4, bb8, 1e2fd8, 984a4, 0, 109a0)
0008c914 ???????? (e2e8194c, 1, fe4d6a80, 98564, 8, e2e81868)
fe5324e8 __1cMStubRoutinesG_code1_ (e2e819d8, e2e81c10, a, f6cb5000, 4, e2e818f0) + 3ec
fe0cbe94 __1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_ (e2e81c08,fe4c8000, e2e81b54, 1e2fd8, 8e764, e2e81c10) +308
fe1f6dbc __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandlee81c08, e2e81b54) + 150pnGThread__v_(f6cb64b8, e2e81b40, e2e81b44, fe4c8000, e2d8) + 60e_5pnGThread__v_ (e2e81c08, e2e81c04, e2e81c00,e2e81bf4, e2e81bec, 1e2f8000, e2e81d10, 1e, e) + 120FpnKJavaThread_pnGThread__v_ (f6817ff8, 1e2fd8, fe4c
7fd70) + 3d8cKJavaThreadDrun6M_v_ (e2e02000, fe4d3e34, fe4c8000, 7fd70, 1e2fd8,
fe213ec8 _start (fe4c8000, fe625d10, 0, 5, 1, fe401000) + 20
ff36b728 _thread_start (1e2fd8, 0, 0, 0, 0, 0) + 40

Java 프로세스에 대해 다음을 수행하여 서버의 스레드 덤프를 가져옵니다.
kill -3
lwp# 8은 스레드 #76에 매핑되어 있으므로 76의 16진수 값을 계산하여 4c를 구할 수 있습니다.
이 값은 JVM 스레드 덤프의 nid=0x4c에 매핑됩니다.


"Thread-6" prio=5 tid=0x1e2fd8 nid=0x4c waiting on monitor [0xe2e81000..0xe2e819d8]
at java.lang.Thread.sleep(Native Method)
at weblogic.management.deploy.GenericAppPoller.run(GenericAppPoller.java:139)

이 예제에서 CPU 사용량이 가장 높은 스레드는 실제로 휴식 상태입니다. 서버를 개발 모드(Development Mode)로 시작하면 응용 프로그램 폴러가 실행됩니다. 응용 프로그램 폴러는 30초 간격으로 실행됩니다. 따라서 스레드 덤프가 이 스레드의 동작하는 시점에 만들어 지지 않았음을 알 수 있습니다.

이론적으로는 세 단계를 모두 빠르게 연속적으로 수행하여 가능한 거의 동시에 데이터를 캡처할 수 있어야 합니다. 이러한 일련의 작업들은 아래와 같은 간단한 셸 스크립트를 이용하여 수행할 수 있습니다.


#
# Takes an argument (PID of the WLS process) and loops three times. This will append the prstat information to a file called dump_high_cpu.txt. The thread dump information will either be in file where stdout was redirected or printed on the screen.
#

for loopnum in 1 2 3
do
prstat -L -p $1 1 1 >> dump_high_cpu.txt
pstack $1 >> dump_high_cpu.txt
kill -3 $1
echo "prstat, pstack, and thread dump done. #" $loopnum
sleep 1
echo "Done sleeping."
done

그런 후 해당 스레드를 검토하여 수행 중인 작업이나 문제를 확인할 수 있습니다.
맨 위로



Linux


top 실행 결과에서 WLS를 시작한 유저의 것 중 CPU 사용량이 높은 PID를 찾습니다.
kill -3 를 실행하여 WebLogic Server의 스레드 덤프를 여러 번 생성합니다.
첫 번째 단계에서 얻은 PID 번호를 16진수 값으로 변환합니다.
Linux용 JVM은 Java 스레드를 native 스레드로 구현하였으므로 각 스레드는 별도의 Linux 프로세스가 됩니다.

스레드 덤프에서 "nid=" 다음에 나오는 값이 이전 단계에서 가져온 16진수와 일치하는 스레드를 찾습니다.
이렇게 하면 높은 CPU 사용량 문제를 발생시키는 스레드를 알 수 있습니다.

사용자의 코드에서 이러한 문제가 발생한 이유를 파악하고, 스택 트레이스의 내용에 WebLogic 라이브러리가 최상위에 있는 경우 BEA 고객 지원부에 문의하십시오.
다음은 위에 설명한 프로세스를 Linux용으로 만든 예제입니다.
top 실행 결과에서 WLS를 시작한 유저의 것 중 CPU 사용량이 높은 PID를 찾습니다.
해당 숫자를 16진수 값으로 변환합니다.
아래의 top 결과 예제를 참조하십시오 (WLS 프로세스에는 더 많은 스레드가 있지만 이 예제에서는 일부만 나타낸 것입니다.)


Linux에서 각 스레드는 Unix의 스레드와 달리 프로세스에 매핑됩니다.


PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
...........
22962 usera 9 0 86616 84M 26780 S 0.0 4.2 0:00 java
...........

PID가 22962이면 16진수 값은 0x59B2가 됩니다.

이 16진수 값을 사용하고 스레드 덤프에서 "nid=" 다음에 해당 값이 나오는 올바른 스레드를 찾아 가져옵니다.
예를 들어, 해당 스레드에 문제가 있을 경우 0x59B2는 ExecuteThread "0"이 됩니다.


"ExecuteThread: '0' for queue: 'default'" daemon prio=1 tid=0x83da550 nid=0x59b2 waiting on monitor [0x56138000..0x56138870]
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:415)
at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:146)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:172)

그런 후 해당 스레드를 검토하여 수행 중인 작업이나 문제를 확인할 수 있습니다.
위의 예제에서는 문제의 스레드가 현재 0%의 CPU를 사용하고 있으므로 이 작업의 프로세스만 표시됩니다. 이론적으로는 세 단계 모두 빠르게 연속적으로 수행하여 가능한 거의 동시에 데이터를 캡처할 수 있어야 합니다. 이러한 일련의 작업들은 아래와 같은 간단한 셸 스크립트를 이용하여 수행할 수 있습니다.


#
# Takes an argument (PID of the WLS process) and loops three times. This will append the prstat information to a file called dump_high_cpu.txt. The thread dump information will either be in file where stdout was redirected or printed on the screen.
#

for loopnum in 1 2 3
do
top -b -n1 >> dump_high_cpu.txt
kill -3 $1
echo "cpu snapshot and thread dump done. #" $loopnum
sleep 1
echo "Done sleeping."
done

by 무난하게 | 2005/02/27 00:35 | Technical.Doc | 트랙백

dump 분석하기

dump 분석하기
글쓴이 : howtosolaris (2002년 04월 26일 오후 03:09) 읽은수: 4,028 [ 시스템튜닝 ]
Crash Dump 분석하기

제공 : howtosolaris.com


솔라리스 시스템에서 갑작스런 패닉 현상이 나타나게 되면 보통 crash 디렉터리를 지정을
하지 않았다면 /var/crash/[hostnam]/ 밑에 unix 파일과 core 파일을 남긴다.

그 파일을 이용하여 시스템 패닉전에 무슨일이 있었는지 분석이 가능 하다.

분석에 사용하는 명령어들과 보기를 들어 보겠다.

우선 core 파일과 unix파일이 있는 디렉터리로 이동한다. ( /var/crash/[hostname] )

1. strings

# strings vmcore.0 | grep SunOS ---> OS 의 종류를 보여준다.

# strings vmcore.0 | grep macine ---> 어떤 호스트인지 열거 하여 준다.

# strings vmcore.0 | more ---> 다 보여준다.

2. netstat

# netstat -d unix.0 vmcore.0 --> 네트웍 통계보기

# netstat -n unix.0 vmcore.0 --> NFS통계보기

3. arp

# arp -a unix.0 vmcore.0 --> arp 테이블보기

4. ipcs

# ipcs -a -N unix.0 -C vmcore.0 --> ipc 보기


5. crash

사용법 : crash [ -d dumpfile ] [ -n namelist ] [ -w output-file ]

예)

# crash -d unix.0 vmcore.0
dumpfile = vmcore.0, namelist = /dev/ksyms, outfile = stdout
> status
system name: SunOS
release: 5.7
node name: ns
version: Generic_106541-15
machine name: sun4u
time of crash: 수 11월 7 11:23:10 2001
age of system: 1 hr., 6 min.
panicstr: [AFT1] errID 0x000003a4.70f365cc %sError(s)
See previous message(s) for details
panic registers:
pc: 10010104 sp: 400275d8
> help
help [-w filename] function[s]
help function
alias:
acceptable aliases are uniquely identifiable initial substrings
> help p
p [-e] [-f] [-l] [-w filename] [([-p] [-a] tbl_entry | #procid)... | -r]
tbl_entry = slot number | address | symbol | expression | range
process table
alias: proc
acceptable aliases are uniquely identifiable initial substrings
p -e
PROC TABLE SIZE = 2922
SLOT ST PID PPID PGID SID UID PRI NAME FLAGS
0 t 0 0 0 0 0 96 sched load sys lock
1 s 1 0 0 0 0 58 init load
2 s 2 0 0 0 0 98 pageout load sys lock nowait
3 s 3 0 0 0 0 60 fsflush load sys lock nowait
4 s 347 1 347 347 0 58 sac load jctl
5 s 350 1 350 350 0 37 dmispd load
6 s 138 1 138 138 0 41 keyserv load
7 s 53 1 53 53 0 43 devfseventd load
8 s 57 1 57 57 0 50 devfsadm load
9 s 136 1 136 136 0 58 rpcbind load
10 s 205 1 205 205 0 53 nscd load
11 s 130 1 130 130 60001 58 tocsin load
12 s 188 1 188 188 0 52 syslogd load
13 s 178 1 178 178 0 58 automountd load
14 s 170 1 170 170 0 58 in.named load jctl
15 s 163 1 163 163 0 0 inetd load
16 s 233 228 228 228 1006 23 mshttpd load
17 s 300 267 0 0 0 58 mysqld load
18 s 193 1 193 193 0 49 cron load
19 s 232 228 228 228 1006 33 mshttpd load
20 s 228 1 228 228 0 59 mshttpd load
21 s 234 228 228 228 1006 13 mshttpd load
22 s 235 228 228 228 1006 3 mshttpd load
23 s 236 228 228 228 1006 0 mshttpd load
24 s 249 1 249 249 0 58 utmpd load
25 s 267 1 0 0 0 10 safe_mysqld load
26 s 253 1 253 253 0 58 sendmail load jctl
27 s 265 1 265 265 0 58 httpd load
28 s 10139 265 265 265 60001 58 httpd load
29 s 10146 265 265 265 60001 58 httpd load
30 s 10141 265 265 265 60001 58 httpd load
31 s 10151 265 265 265 60001 58 httpd load
32 s 10140 265 265 265 60001 58 httpd load
33 s 281 1 279 279 0 60 auditd load
36 s 331 1 331 331 0 48 dtlogin load jctl
37 s 325 1 325 325 0 23 mountd load
38 s 327 1 327 327 0 33 nfsd load
40 s 351 347 347 347 0 58 listen load nowait jctl
41 s 348 1 348 348 0 55 ttymon load
42 s 14566 331 14566 14566 0 59 Xsun load
43 s 352 347 347 347 0 58 ttymon load jctl
44 s 10137 265 265 265 60001 53 httpd load
50 s 14585 1 14574 14574 0 59 fbconsole load
55 s 14605 14574 14605 14605 0 59 dtgreet load
60 s 14574 331 14574 14574 0 50 dtlogin load
71 s 10150 265 265 265 60001 58 httpd load
76 s 10138 265 265 265 60001 58 httpd load
82 s 11077 265 265 265 60001 58 httpd load
90 s 11085 265 265 265 60001 58 httpd load
> p -l
p_lock: owner 0 waiters 0
cr_lock: owner 0 waiters 0
Condition variable p_cv: 0
Condition variable p_flag_cv: 0
Condition variable p_lwpexit: 0
Condition variable p_holdlwps: 0
Condition variable p_srwchan_cv: 0
82 s 11077 265 265 265 60001 58 httpd load

p_lock: owner 0 waiters 0
cr_lock: owner 0 waiters 0
Condition variable p_cv: 0
Condition variable p_flag_cv: 0
Condition variable p_lwpexit: 0
Condition variable p_holdlwps: 0
Condition variable p_srwchan_cv: 0
90 s 11085 265 265 265 60001 58 httpd load
.
.
.
. 이하생략..

> q

6. adb 사용하기

# adb -k unix.0 vmcore.0 ( unix파일이나 core파일 대신 커널쪽을 볼수도 있다 ex> adb -k /dev/ksyms /dev/mem )
adb -k unix.0 vmcore.0
physmem 5b01
*panicstr/s ---> 패닉 메세지가 무엇이었나 보여준다.
0x40027768: [AFT1] errID 0x000003a4.70f365cc %sError(s)
See previous message(s) for details
$ 호스트 이름과 장비에 관해 열거해준다.

utsname:
utsname: sys SunOS
utsname+0x101: node ns
utsname+0x202: release 5.7
utsname+0x303: version Generic_106541-15
utsname+0x404: machine sun4u

srpc_domain/s ---> 도메인
srpc_domain:
srpc_domain:

hw_provider/s ---> 제조업체
hw_provider:
hw_provider: Sun_Microsystems

*time-(lbolt%0t100)=Y --->부트시간/날짜
2001 Oct 6 21:26:01

$ 최근 메세지 버펄를 열거 하여 준다
SunOS Release 5.7 Version Generic_106541-15 [UNIX(R) System V R
elease 4.0]
0x700b57e0: Copyright (c) 1983-1999, Sun Microsystems, Inc.
0x700b53c3: Ethernet address = 8:0:20:86:23:9e
0x700b4fa0: mem = 196608K (0xc000000)
0x700b4b80: avail mem = 188989440
0x700b4763: root nexus = Sun Ultra 1 SBus (UltraSPARC 167MHz)
0x700b4343: sbus0 at root: UPA 0x1f 0x0 ...
0x70155ee3: sbus0 is /sbus@1f,0
0x70155ac0: dma0 at sbus0: SBus0 slot 0xe offset 0x8400000
0x701556a3: dma0 is /sbus@1f,0/espdma@e,8400000
0x70155280: /sbus@1f,0/espdma@e,8400000/esp@e,8800000 (esp0):
esp-options=0x46
0x70154e60: esp0 at dma0: SBus0 slot 0xe offset 0x8800000 Onboard device spa
rc9 ipl 4
0x70154a43: esp0 is /sbus@1f,0/espdma@e,8400000/esp@e,8800000
0x70154620: NOTICE: Memory scrubber exiting
0x70154200: sd0 at esp0:
0x70177d40: target 0 lun 0
0x70177923: sd0 is /sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@0,0
0x70177500:
0x701770e0: sd1 at esp0:
0x70176cc0: target 1 lun 0
0x701768a3: sd1 is /sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@1,0
0x70176480:
0x70176060: sd4 at esp0:
0x70179c00: target 4 lun 0
0x701797e3: sd4 is /sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@4,0
0x701793c0:
0x70178fa0: sd6 at esp0:
0x70178b80: target 6 lun 0
0x70178763: sd6 is /sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@6,0
0x70178347: root on /sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@0,0:a fstyp
e ufs
0x700efee0: zs0 at sbus0: SBus0 slot 0xf offset 0x1100000 Onboard device spa
rc9 ipl 12
0x700efac3: zs0 is /sbus@1f,0/zs@f,1100000
0x700ef6a0: zs1 at sbus0: SBus0 slot 0xf offset 0x1000000 Onboard device spa
rc9 ipl 12
0x700ef283: zs1 is /sbus@1f,0/zs@f,1000000
0x700eee66: keyboard is major <29> minor <2>
0x700eea46: mouse is major <29> minor <3>
0x700ee626: stdin is major <29> minor <2>
0x700ee200: cgsix0 at sbus0: SBus0 slot 0x1 offset 0x0 SBus level 5 sparc9 i
pl 9
0x7015fea3: cgsix0 is /sbus@1f,0/cgsix@1,0
0x7015fbe1: cgsix0: screen 1152x900, single buffered, 1M mappable, rev 11
0x7015f926: stdout is major <39> minor <0>
0x7015f660: cpu0: SUNW,UltraSPARC (upaid 0 impl 0x10 ver 0x22 clock 167 MHz)
0x7015f3a0: ledma0 at sbus0: SBus0 slot 0xe offset 0x8400010
0x7015f0e0: le0 at ledma0: SBus0 slot 0xe offset 0x8c00000 Onboard device sp
arc9 ipl 6
0x7015ee23: le0 is /sbus@1f,0/ledma@e,8400010/le@e,8c00000
0x7015eb63: dump on /dev/dsk/c0t0d0s1 size 1000 MB
0x7015e8a2: pseudo-device: devinfo0
0x7015e5e3: devinfo0 is /pseudo/devinfo@0
0x7015e320: fd0 at sbus0: SBus0 slot 0xf offset 0x1400000 Onboard device spa
rc9 ipl 11
0x7015e063: fd0 is /sbus@1f,0/SUNW,fdtwo@f,1400000
0x70559d60: sbusmem0 at sbus0: SBus0 slot 0x0 offset 0x0
0x70559aa3: sbusmem0 is /sbus@1f,0/sbusmem@0,0
0x705597e0: sbusmem1 at sbus0: SBus0 slot 0x1 offset 0x0
0x70559523: sbusmem1 is /sbus@1f,0/sbusmem@1,0
0x70559260: sbusmem2 at sbus0: SBus0 slot 0x2 offset 0x0
0x70558fa3: sbusmem2 is /sbus@1f,0/sbusmem@2,0
0x70558ce0: sbusmem3 at sbus0: SBus0 slot 0x3 offset 0x0
0x70558a23: sbusmem3 is /sbus@1f,0/sbusmem@3,0
0x7042b70b: WARNING: [AFT1] EDP event on CPU0 Data access at TL=0, errID 0x0
00003a4.70f365cc
AFSR 0x00000000.80400002 AFAR 0xffffffff.ffffffff
AFSR.PSYND 0x0002(Score 95) AFSR.ETS 0x00 Fault_PC 0x1018af18
UDBH 0x0000 UDBH.ESYND 0x00 UDBL 0x0000 UDBL.ESYND 0x00
0x7055834b: [AFT2] errID 0x000003a4.70f365cc No error found in ecache (No fa
ult PA available)
0x70558080: panic[cpu0]/thread=40027e60:
0x70558b80: [AFT1] errID 0x000003a4.70f365cc EDP Error(s)
See previous message(s) for details
0x70154fc0:
0x7015f7c3: syncing file systems...
0x7015fd43: [4]
0x7015f243: [4]
0x7015f500: panic[cpu0]/thread=4003fe60:
0x700ef800: panic sync timeout
0x7015ea00:
0x700efc23: dumping to /dev/dsk/c0t0d0s1, offset 209780736

$c ---> C 스택 역추적
complete_panic(0xf,0x10437c00,0x40027e60,0x7011478a,0x0,0x10107880) + 24
do_panic(0x1,0x40027954,0x10107f70,0x0,0x0,0x400277bb) + 174
vcmn_err(0x3,0x40027768,0x40027954,0x7efefeff,0x81010100,0xff00) + 14
cpu_aflt_log(0x400278f8,0x400277bb,0x40027978,0x3,0x1010785c,0x10107880) + 4c0

rootfs$ 루투장치는 어떤것인가

rootfs:
rootfs: fstype ufs^@^@^@^@^@^@^@^@^@^@^@^@^@
rootfs+0x10: name /sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@0,0:a^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@
rootfs+0x90: flags size vp
0 0 0

swapfile$ 스왑장치는 어떤것인지 열거

swapfile:
swapfile: fstype ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
swapfile+0x10: name ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@
swapfile+0x90: flags size vp
0 0 0

$q ---> 종료

by 무난하게 | 2005/02/27 00:32 | Technical.Doc | 트랙백

Fault Analysis and Diagnosis

1. Fault Analysis and Diagnosis


1.1. The Fault Analysis Method


Fault Analysis : 문제의 인식, 문제의 수집 비교 를 통한 분석
Diagnosis : 복구하고 테스트하고 문제를 레포팅 하는 것



1.2. Step of Fault Analysis and Diagnosis


l stating the problem
어떤것(object, device or subsystem) 이 문제인지 결정하고 가설을 세워라
이미 알려진 문제인지 확인해라(Patch)
l Describing the problem
모든 시스템의 메시지를 모으고 확인하며 조건과 현상에 대해 확인해라
가장최근의 관련된 변화를 찾아라
l Listing All Observed Facts
육하원칙에 의거 문제를 제기하라
l Establishing Comparative Facts
같은 시스템, 문제없는 시스템과 비교하라
※. Core 분석을 다른 시스템에서 해야 할 경우는 같은 OS, 같은 H/W 이야 한다.
l Identifying Differences
사적인 의견이 아닌 객관적으로 한번에 하나씩 비교하여 다른점을 찾아라
기록을 유지해라
l Listing Relevant Changes
어떤 기간에 문제가 발생하는지, 비정상적인 변화가 있는지 찾아라
l Generating Likely Causes
유사한(가능성있는) 가설(원인)을 세워라
l Testing Likely Causes
세운 가설을 테스트해봐라
l Verification
사실적이고 논리적으로 분석하라
l Verifying the Most Likely Cause
가장 시스템 영향, 비용, 시간 이 적은 가능성 있는 이유를 확인하라
l Taking Corrective Action
완벽히 복구하고, 확인 테스트 하고, 문서로 남겨라

1.3. Diagnostic Tool
1.3.1. Type of Errors
l software ? core발생, return code발생
예) # cat
ctrl +
# ls core
# file core
진단 : truss명령으로 program진행 추적
adb등의 tool으로 분석
l hardwaere
① 일반적으로 고쳐질수 있는 system(H/W) error
예) ECC error
- prtdiag로 확인
② watchdog-reset (치명적 H/W Error)
- 확인불가
- ok모드처럼 watchdog-reset 프롬프트로 떨어짐
l panic
① system panic :panic()이 호출되면서 fail
② hang : panic()가 호출되지 않아 system log가 없다.



2. Kernel Core Dump Analysis

Core Dump 순서











start end
뒤쪽에서부터 저장

system hang soft hang e stop + a , ok sync a core dump 생성
hard hang e stop + a 사용않됨
single swap disk 영역이 메모리 영역보다 크거나 같아야 한다.
/var/crash 를 위해 공간이 충분해야 한다.

# sync 동기화
$ sync
OK sync 동기화 & core 생성

2.1. Analyzing Core Dumps Using the MDB Utility
2.1.1. Introducing the mdb Utility
# mdb
Loading modules : [ unix krtld genunix ip ufs_log nfs random ptm lofs ipc logindmux cpc ]
>
> $P”mdb: “ // mdb의 prompt를 변경
mdb: ::help ps
::ps [-fltTP] ? list processes (and associated thr, lwp)

mdb: ::ps ?lt // -lt 옵션은 thread들과 LWPs를 보여준다.
….
필드는 Panic의 원인인 thread를 나타낸다.
….


2.1.2. Features of the mdb Utility
Mdb Utility는 Kernel과 user process들의 debugger와 Analyzer(분석기)에 일반적인 목적이 있다. 또한 running kernel, kernel crash dumps, running processes, process core files, object files등을 검토하거나 수정할때도 사용된다.

2.1.3. General mdb Commad Formats
● ? ? Displays code or variables in an executable object file
● / - Displays data from the core file
● = - Prints values in different formats
● $< - Includes macro invocations for miscellaneous commands
● > - Assigns a value to a variable or a register
● < - Reads a value from a variable or a register
● Return ? Repeats the previous command with a count of 1 and increments the current location represented by a dot(.)




2.1.4. Examing System Dumps by the mdb Utility
# mdb ?k unix.# vmcore.#
Ø $ //부팅당시의 kernel image 정보를 보이도록하는 macro

Ø $r // register의 정보확인
%pc = 가
// panic을 유발하는 instrction주소

Ø panic_thread/K
//panic시 동작한 thread의 주소
panic_thread : 나
//g7의 값과 동일한 값이 나온다.

Ø 나 $ //panic시 동작한 thread의 데이터 구조 주소를 나타내는 pointer
proc의 값
//process의 주소값

Ø proc의 값$ //process가 실행될 당시의 상태의 원인 추적

panic시의 프로세스의 이름 및 psargs 값을 확인하여 프로그램에 전달된 aguments확인








3. Messages


3.1. Memory Error : [AFT*]
0 : correctable error
1 : uncorrectable or fatal error
2 : Sun support
3 : kernel error recovery code
3.2. Error and Events (ultraSPARC II CPUs)
● ETP : Ecache Tag Parity
● EDP : Ecache Data Parity
● LDP : Load Data Parity
● WP : Writeback Parity
● CP : Copyout Parity
● UE : Uncorrectavle memory error
● CE : Correctable memory error

3.3. Error and Events (ultraSPARC III CPUs)
● UCC : Software correctable external cache ECC error
● UCU : Uncorrectable external cache ECC error
● EDC : Hardware corrected external cache ECC error

by 무난하게 | 2005/02/27 00:30 | Technical.Doc | 트랙백

TCP Tuning Parameter

글쓴이 : 좋은진호(truefeel)
작성일 : 2001.4.18
수정일 : 2001.7.16
정리일 : 2003.9.4(목)

솔라리스에서는 리눅스의 sysctl 명령어 처럼 ndd를 이용해서 커널 파라미터를 변경할 수 있다.

1) 커널 네트워크 파라미터 설정

ping 응답 무시하고, 포워딩을 막는 IP관련 네트워크 파라미터를 설정하는 방법은 다음과 같다.
또한 솔라리스에서는 그 의미가 약한 SYN flooding 공격에 대처하는 파라미터 설정도 마지막
3줄에 포함뫼었다.

------------------------------------------------
# IP forwarding을 하지 않음
ndd -set /dev/ip ip_forwarding 0
ndd -set /dev/ip ip_strict_dst_multihoming 0
ndd -set /dev/ip ip_forward_directed_broadcasts 0
ndd -set /dev/ip ip_forward_src_routed 0

# echo request Broadcast 핑 응답 무시
ndd -set /dev/ip ip_respond_to_echo_broadcast 0

# TCP parameter
ndd -set /dev/tcp tcp_ip_abort_cinterval 60000
ndd -set /dev/tcp tcp_conn_req_max_q0 2048
ndd -set /dev/tcp tcp_conn_req_max_q 512
------------------------------------------------

TCP 파라미터에 대해 설명하면.

tcp_ip_abort_cinterval :
연결이 있은 후 정상적으로 established 가 안되면 연결을 끊을 시간을 설정한다.
즉, Abort timer 값을 정한다.
단위는 밀리초. 따라서 60000 = 60초임 (default=180000 = 180초)
tcp_conn_req_max_q0 :
완벽히 접속되지 않은 상태의 연결(half-open)을 위한 큐(default=1024)
tcp_conn_req_max_q :
established 상태의 연결을 위한 큐 (default=128)

2) 부팅용 스크립트

부팅용 스크립트를 여기에 두었다.

http://coffeenix.net/doc/misc/tf.tcpparameter.txt

tf.tcpparameter.txt를 /etc/init.d에 옮기고
rc2.d에서 링크를 걸어 부팅할 때 실행되도록 하면 된다.

------------------------------------------------
# mv tf.tcpparameter.txt /etc/init.d/tf.tcpparameter
# cd /etc/rc2.d 또는 cd /etc/rc3.d
# ln -s ../init.d/tf.tcpparameter S99tcpparameter
------------------------------------------------
================================================

부팅용 스크립트

================================================

#!/bin/sh
#
# Solaris Kernel Parameters
#
# by Jinho Hwangbo(truefeel@coffeenix.net, 메일주소는 2003.9.4 변경함)
#
# 2001.4.18

case "$1" in
'start')
# IP forwarding을 하지 않음
ndd -set /dev/ip ip_forwarding 0
ndd -set /dev/ip ip_strict_dst_multihoming 0
ndd -set /dev/ip ip_forward_directed_broadcasts 0
ndd -set /dev/ip ip_forward_src_routed 0

# echo request Broadcast 핑 응답 무시
ndd -set /dev/ip ip_respond_to_echo_broadcast 0

# TCP parameter
ndd -set /dev/tcp tcp_ip_abort_cinterval 60000
ndd -set /dev/tcp tcp_conn_req_max_q0 2048
ndd -set /dev/tcp tcp_conn_req_max_q 512
;;
'stop')
# IP parameter
ndd -set /dev/ip ip_forwarding 0
ndd -set /dev/ip ip_strict_dst_multihoming 0
ndd -set /dev/ip ip_forward_directed_broadcasts 1
ndd -set /dev/ip ip_forward_src_routed 1

# echo request Broadcast 핑 응답
ndd -set /dev/ip ip_respond_to_echo_broadcast 1

# TCP parameter
ndd -set /dev/tcp tcp_ip_abort_cinterval 180000
ndd -set /dev/tcp tcp_conn_req_max_q0 1024
ndd -set /dev/tcp tcp_conn_req_max_q 128
;;
'status')
# IP parameter
echo "ip_forwarding : `ndd /dev/ip ip_forwarding`"
echo "ip_strict_dst_multihoming : `ndd /dev/ip ip_strict_dst_multihoming`"
echo "ip_forward_directed_broadcasts : `ndd /dev/ip ip_forward_directed_broadcasts`"
echo "ip_forward_src_routed : `ndd /dev/ip ip_forward_src_routed`"

echo "arp_cleanup_interval : `ndd /dev/arp arp_cleanup_interval`"
echo "tcp_ip_abort_cinterval : `ndd /dev/tcp tcp_ip_abort_cinterval`"

# echo request Broadcast
echo "ip_respond_to_echo_broadcast : `ndd /dev/ip ip_respond_to_echo_broadcast`"

# TCP parameter
echo "tcp_conn_req_max_q0 : `ndd /dev/tcp tcp_conn_req_max_q0`"
echo "tcp_conn_req_max_q : `ndd /dev/tcp tcp_conn_req_max_q`"
;;
*)
echo "usage: $0 {start|stop|status}"
exit 1
;;
esac

exit 0

by 무난하게 | 2005/02/27 00:27 | Technical.Doc | 트랙백(3)

Proc

Solaris Proc utility



/usr/proc/bin/pflags


Type: /usr/bin/pflags [ -r ] [ pid | core ]
각각의 프로세스(또는 lwp)에 대하여 /proc 플래그 및 수행되거나 걸려있는 시그널을 출력하고, 기타 /proc 에 대한 정보를 보여준다.

Option
-r : 만약 프로세스가 정지되어 있으면, 그 프로세스의 machine registers(?)를 보여준다.

example
#pflags 669
669: /opt/netscape/netscape http://www.sunworld.com/
data model = _ILP32 flags = PR_ORPHAN
/1: flags = PR_PCINVAL|PR_ASLEEP [ poll(0xef201a00,0x5,0xa603) ]
sigmask = 0x00002000,0x00000000 lwppend = 0x00002000,0x00000000


/usr/proc/bin/pcred


Type : /usr/bin/pcred [ pid | core ]
각 프로세스의 effective,real, saved(u/g)id를 표시한다. (보안정보)

Option
-F : 다른 프로세스가 컨트롤임에도 불구하고 해당(target)프로세스에 대한 정보를 나열한다.

example
#pcred 669
669: e/r/suid=101 e/r/sgid=14

/usr/proc/bin/pmap


Type : /usr/bin/pmap [ -rxlF ] [ pid | core ]
각 프로세스의 메모리 주소공간을 출력한다.
메모리 주소번지와 메모리 세그먼트 사이즈 표시한다.

Option
-r : 해당 프로세스의 예약된(reserved) 주소를 표시한다.
(현재 사용중인 세그먼트 크기보다 크게 표현)
-x : 해당 프로세스의 자세한 메모리 매핑 정보를 제공한다.
Resident/Shared/Private/Permission
- Resident :해당 프로세스가 가지는 총 물리적 메모리 크기
(공유 바이러나 및 라이브러리 포함)
- Shared : 다른 프로세스와 공유하고 있는 메모리의 총합
(공유 라이브러리, 메모리 포함)
- Private : 다른 프로세스와 공유된 메모리 공간을 제외한 Resident 메모리의 총합
-l : unresolved(?)의 동적 링커의 맵 이름을 포함해서 표현한다.
-F : 다른 프로세스가 컨트롤임에도 불구하고 해당(target)프로세스에 대한 정보를 나열한다.

Example
#pmap 669
669: /opt/netscape/netscape http://www.sunworld.com/
00010000 13124K read/exec /opt/netscape/netscape
00CF0000 988K read/write/exec /opt/netscape/netscape
00DE7000 15816K read/write/exec [ heap ]
EEE60000 8K - [ anon ]

[root@KOREA1/etc]# pmap -x 3420
3420: in.telnetd
Address Kbytes Resident Shared Private Permissions Mapped File
08045000 12 12 4 8 read/write/exec [ stack ]
08050000 24 24 24 - read/exec in.telnetd
08066000 4 4 - 4 read/write/exec in.telnetd
08067000 20 20 12 8 read/write/exec [ heap ]
DF9A0000 12 8 8 - read/exec libmp.so.2
DF9B3000 4 4 4 - read/write/exec libmp.so.2
DF9C0000 540 512 512 - read/exec libc.so.1
DFA57000 24 24 16 8 read/write/exec libc.so.1
DFA5D000 8 8 8 - read/write/exec libc.so.1
DFA70000 4 4 - 4 read/write/exec [ anon ]
DFA80000 12 12 12 - read/exec libcmd.so.1
DFA93000 4 4 4 - read/write/exec libcmd.so.1
DFAA0000 24 24 24 - read/exec libpam.so.1
DFAB6000 8 8 8 - read/write/exec libpam.so.1
DFAC0000 64 52 52 - read/exec libbsm.so.1
DFAD0000 8 8 8 - read/write/exec libbsm.so.1
DFAD2000 4 - - - read/write/exec libbsm.so.1
DFAE0000 476 404 404 - read/exec libnsl.so.1
DFB67000 24 24 24 - read/write/exec libnsl.so.1
DFB6D000 28 16 16 - read/write/exec libnsl.so.1
DFB80000 40 40 40 - read/exec libsocket.so.1
DFB9A000 4 4 4 - read/write/exec libsocket.so.1
DFBB0000 4 4 - 4 read/write/exec [ anon ]
DFBC0000 4 4 4 - read/exec libdl.so.1
DFBD0000 112 112 112 - read/exec ld.so.1
DFBFB000 8 8 4 4 read/write/exec ld.so.1
DFBFD000 4 4 - 4 read/write/exec ld.so.1
-------- ------ ------ ------ ------
total Kb 1480 1348 1304 44


- Mapped file에 나타나 있는 파일명이나, device번호 inode가 있는 것은 파일시스템에 있는 파일과 mapping을 유지하고 있음을 의미
- [heap],[anon],[stack]은 익명페이지(anonymous page)를 나타낸다.
- 프로세스가 실행되면서 동적으로 메모리를 할당받으면 [heap]영역에 할당되고, 그 영역의 크기를 확인해야 한다.
- 프로세스가 동작하는 역할에 비해 heap영역이 높게 사용되면 메모리관리에 오류가 있을 가능성이 있다.




/usr/proc/bin/pfiles


Type : /usr/bin/pfiles [ -F ] pid
각 프로세스가 open 된 파일 및 파일 개수를 보여준다
Open된 파일의 정보를 나열한다.
(file type, file flags, mode bit, size)

Option
-F : 다른 프로세스가 컨트롤임에도 불구하고 해당(target)프로세스에 대한 정보를 나열한다.

Example
3420: in.telnetd
Current rlimit: 256 file descriptors
0: S_IFCHR mode:0000 dev:182,0 ino:49903 uid:0 gid:0 rdev:0,0
O_RDWR
1: S_IFCHR mode:0000 dev:182,0 ino:49903 uid:0 gid:0 rdev:0,0
O_RDWR
2: S_IFCHR mode:0000 dev:182,0 ino:49903 uid:0 gid:0 rdev:0,0
O_RDWR
3: S_IFCHR mode:0000 dev:102,0 ino:34216 uid:0 gid:0 rdev:23,2
O_RDWR
4: S_IFCHR mode:0620 dev:102,0 ino:978986 uid:500 gid:7 rdev:24,2
O_RDWR
5: S_IFDOOR mode:0444 dev:187,0 ino:31558 uid:0 gid:0 size:0
O_RDONLY|O_LARGEFILE FD_CLOEXEC door to nscd[21746]
6: S_IFCHR mode:0000 dev:102,0 ino:34208 uid:0 gid:0 rdev:4,0
O_RDWR|O_NDELAY
7: S_IFCHR mode:0000 dev:102,0 ino:34214 uid:0 gid:0 rdev:4,1
O_RDWR|O_NDELAY…

/usr/proc/bin/pstack


Type : /usr/bin/pstack [ -F ] [ pid | core ]
실행중인 프로세스에 있는 각각의 lwp 스택 점유상태를 보여준다.
(function call, 16진수값과 심볼릭 값(?)으로 메모리 표시 및 추적)
만일 문제가 생긴 프로세스면 어디서에 프로세스가 정지했는지 확인할 수 있다.

Option
-F : 다른 프로세스가 컨트롤임에도 불구하고 해당(target)프로세스에 대한 정보를 나열한다.

Example
[root@KOREA1/etc]# pstack 3420
3420: in.telnetd
df9e9599 poll (80476bc, 1, ffffffff)
df9fd28b select (8, 8047884, 8047804, 8047784, 0) + 247
0805358c telnet (7, 6) + 424
08052e0f doit (0, 8047cc4) + 5db
080525d0 main (1, 8047df4, 8047dfc) + 17c



/usr/proc/bin/psig


Type : /usr/bin/psig pid ...
프로세스의 시그널 action(성향) 리스트를 보여준다

Option
none

Example
[root@KOREA1/etc]# psig 3420
3420: in.telnetd
HUP default
INT ignored
QUIT ignored
ILL default
TRAP default
ABRT default
EMT default
FPE default
KILL default
BUS default
SEGV default
SYS default
PIPE default
ALRM default
TERM default
USR1 default
USR2 default
CLD caught RESETHAND,NODEFER,NOCLDSTOP
PWR default


/usr/proc/bin/pldd


Type : /usr/bin/pldd [ -F ] [ pid | core ]
해당 프로세스가 링크한 동적 라이브러리를 보여준다.

Option
-F : 다른 프로세스가 컨트롤임에도 불구하고 해당(target)프로세스에 대한 정보를 나열한다.

Example
[root@KOREA1/etc]# pldd 3420
3420: in.telnetd
/usr/lib/libdl.so.1
/usr/lib/libsocket.so.1
/usr/lib/libnsl.so.1
/usr/lib/libbsm.so.1
/usr/lib/libpam.so.1
/usr/lib/libcmd.so.1
/usr/lib/libc.so.1
/usr/lib/libmp.so.2





/usr/proc/bin/ptree


Type : /usr/bin/ptree [ -a ] [ [ pid | user ]
프로세스의 트리구조를 보여준다
(각각의 프로세스의 자식/부모간의 관계, pid, user 등)

Option
-a : ALL

Example
[root@KOREA1/etc]# ptree 3420
176 /usr/sbin/inetd -s
3420 in.telnetd
3427 -ksh
12482 -ksh
27773 ptree 3420
[root@KOREA1/etc]# ptree -a 3420
1 /etc/init -
176 /usr/sbin/inetd -s
3420 in.telnetd
3427 -ksh
12482 -ksh
29454 ptree -a 3420

#pmap, pstack을 사용한 코어분석



Type
$ /usr/proc/bin/pstack core
$ /usr/proc/bin/pmap core

Core file
- core file은 실행중인 프로세스의 이미지를 파일로 저장
- 실행 중 오류로 인하여 특정 시그널을 받아서 생성
(SIGSEGV, SIGSUB)
- SIGSEGV : 프로세스가 자신에게 주어진 주소공간 밖을 접근하거 나 읽기/쓰기/실행권한 모드를 위배했을 경우 커널이 발생시킴
- SIGBUS : 프로세스가 메모리 접근시 주소 단위가 있는데, 이점을 위배하여 접근하면 커널이 발생시킴
- 즉, SIGSEGV와 SIGBUS는 core 파일을 생성하고 종료시키는 신호임

Example
- pstack
----------------- lwp# 14 / thread# 25 --------------------
ff369764 __sigprocmask (ff36bf60, 0, 0, e6181d70, ff37e000, 0) + 8
ff35e110 _sigon (e6181d70, ff385930, 6, e6180114, e6181d70, 6) + d0
ff361150 _thrp_kill (0, 19, 6, ff37e000, 19, ff2c0450) + f8
ff24b900 raise (6, 0, 0, ffffffff, ff2c03bc, 4) + 40
ff2358ec abort (ff2bc000, e6180268, 0, fffffff8, 4, e6180289) + 100
fe3c68fc __1cCosFabort6Fl_v_ (1, fe4c8000, 1, e61802e8, 0, e9f90420) + b8
fe3c59f0 __1cCosbBhandle_unexpected_exception6FpnGThread_ipCpv_v_ (ff2c02ac, fe53895c, fe4dc164, fe470ab4, fe4c8000, e6180308) + 254
fe20a8b4 JVM_handle_solaris_signal (0, 25d5b8, e6180d90, fe4c8000, b, e6181048) + 8ec
ff36b824 __sighndlr (b, e6181048, e6180d90, fe20a8cc, e6181e14, e6181e04) + c
ff3684d8 sigacthandler (b, e6181d70, 0, 0, 0, ff37e000) + 708
--- called from signal handler with signal 11 (SIGSEGV) ---
e9f90420 Java_HelloWorld_displayHelloWorld (25d644, e6181224, e61819b8, 0, 2, 0) + 30
00090ae4 ???????? (e6181224, e61819b8, 25d5b8, fe4c8000, 0, 109a0)
0008dc4c ???????? (e61812c4, ffffffff, ffffffff, 97400, 4, e61811b8)


- pmap
E9800000 4608K read
E9F60000 136K read/write/exec
E9F90000 8K read/exec /home/usera/wls70/solaris/projectWork/lib/libhello.so
E9FA0000 8K read/write/exec /home/usera/wls70/solaris/projectWork/lib/libhello.so
E9FB4000 8K read/write/exec
E9FC0000 120K read/exec /usr/lib/libelf.so.1
- pstack 출력에서 오류가 발생한 주소는 e9f90420이다.
- pmap 출력 코드 부분에서 e9f90420은 E9F90000-E9FA0000 사이이므로 libhello.so 공유 개체 내부에서 오류가 발생




참고
코어파일을 생성을 위해 검사해야 할 운영체제 구성
1. 시스템 또는 사용자 별 ulimit -c(코어 파일의 설정된 크기)를 검사함
2. 사용 가능한 사용자 디스크 공간을 검사함
(예: 디스크 할당량이 있습니까?)
3. Solaris에서는 /etc/system 파일에 다음 매개변수가 있는데 이 값에 따라 코어 파일이 생성되지 않을 수 있음
(set sys:coredumpsize=0)

by 무난하게 | 2005/02/27 00:25 | Technical.Doc | 트랙백

패치시에 에러코드

installpatch and backoutpatch exit error codes


Patch를 install 하거나 backout 할때 발생되는 error code에 대한 설명은 아래와
같다.
1. INSTALLPATCH ERROR CODES:
Exit Codes:
0 No error
1 Usage error
2 Attempt to apply a patch that's already been applied
3 Effective UID is not root
4 Attempt to save original files failed
5 pkgadd failed
6 Patch is obsoleted
7 Invalid package directory
8 Attempting to patch a package that is not installed
9 Cannot access /usr/sbin/pkgadd (client problem)
10 Package validation errors
11 Error adding patch to root template
12 Patch script terminated due to signal
13 Symbolic link included in patch
14 NOT USED
15 The prepatch script had a return code other than 0.
16 The postpatch script had a return code other than 0.
17 Mismatch of the -d option between a previous patch
install and the current one.
18 Not enough space in the file systems that are targets of the patch.
19 $SOFTINFO/INST_RELEASE file not found
20 A direct instance patch was required but not found
21 The required patches have not been installed on the manager
22 A progressive instance patch was required but not found
23 A restricted patch is already applied to the package
24 An incompatible patch is applied
25 A required patch is not applied
26 The user specified backout data can't be found
27 The relative directory supplied can't be found
28 A pkginfo file is corrupt or missing
29 Bad patch ID format
30 Dryrun failure(s)
31 Path given for -C option is invalid
32 Must be running Solaris 2.6 or greater
33 Bad formatted patch file or patch file not found
34 The appropriate kernel jumbo patch needs to be installed
2. BACKOUT PATCH ERRORS CODES:
Exit Codes:
0 No error
1 Usage error
2 Attempt to backout a patch that hasn't been applied
3 Effective UID is not root
4 No saved files to restore
5 pkgrm failed
6 Attempt to back out an obsoleted patch
7 Attempt to restore CPIO archived files failed
8 Invalid patch id format
9 Prebackout script failed
10 Postbackout script failed
11 Suspended due to administrative defaults
12 Backoutpatch could not locate the backout data
13 The relative directory supplied can't be found
14 Installpatch has been interrupted, re-invoke installpatch
15 This patch is required by a patch already installed, can't back it out

by 무난하게 | 2005/02/27 00:22 | Technical.Doc | 트랙백

TCP Wrapper

유닉스 서버는 TCP/IP 프로토콜을 통해 서비스를 제공할 때 모든 사람에게 개방하거나 폐쇄하거나 둘 중 택일해야 한다. 이런 개념적인 약점 외에도 출처(source)나 시간과 같은 접속 기록은 최소한 이거나 아예 포함되어 있지 않다. 접속 시도는 사이트가 공격받고 있음을 조기에 경보해주는 신호가 될 수 있으므로 가능하면 많은 정보를 얻고 싶을 것이다.

tcpd(tcp wrapper를 구현한 프로그램)는 실제로 있었던 공격의 산물로 만들어진 것이다. tcpd는 (1) 접속 요구를 한 출처와 목적지에 기반한 몇 가지 수준의 접근 제어와 (2) 성공하거나 실패한 접속 기록을 제공한다. tcp wrapper는 요구한 실제 서버 프로세스를 시작하기 전에 필터 프로그램을 시작한다. 실제 서버 프로세스는 접속 요구가 접근 제어 목록에 의해 허가된 다음에 실행된다. 접속과 접속 시도에 관한 모든 메시지는 syslogd를 통해 기록된다.

이 문서는 Sun 솔라리스 운영체제 버전 2.5.1에 tcp wrapper tcpd 버전 7.6을 내려 받고 설치하고 설정하는 데 필요한 정보를 설명한다.



--------------------------------------------------------------------------------

준비 작업
tcp wrapper의 최신 버전은 ftp://ftp.porcupine.org/pub/security/에서 anonymous ftp로 얻을 수 있다.


설치 요구 조건을 만족하는지 확인


tcp wrapper의 실행 파일을 만들려면, 다음과 같은 것이 필요하다.

최근 버전을 얻기 위한 인터넷 접속
소프트웨어의 진위를 확인하기 위한 PGP(www.pgp.com 참조)
내려 받기한 파일의 압축을 풀기 위한 GZIP
실행 파일을 만들기 위한 C 컴파일러


tcp wrapper 배포판을 내려 받기


ftp://ftp.porcupine.org/pub/security/tcp_wrappers_7.6.tar.gz에서 anonymous ftp로 파일을 받아와라. 바로 다음 과정을 수행하려면 ftp://ftp.porcupine.org/pub/security/tcp_wrappers_7.6.tar.gz.sig 파일도 필요하다.


tcp wrapper 배포판이 진짜인지 확인하기


이 과정을 수행하려면, 당신 자신의 PGP 공개 키 목록에 "wietse venema "의 PGP 공개키가 필요하다. W. Venema는 tcp wrapper 소프트웨어 프로그램을 만들 사람이며, 그의 디지털 서명과 일치한다면 내려 받기한 소프트웨어가 아무 이상 없음을 보증해 준다. 디지털 서명을 확인하려면, 다음 명령을 내려 받기한 파일이 있는 디렉토리에서 실행해라.

$ pgp tcp_wrappers_7.6.tar.gz.sig tcp_wrappers_7.6.tar.gz서명이 일치하지 않는다면 소프트웨어가 조작되었을 가능성이 있다. 그렇다면 이 버전을 사용해서는 안 된다.


tcp wrapper 배포판 풀기


압축된 파일을 GNU gunzip 유틸리티로 압축을 푼 후, 시스템 tar 명령어로 다시 풀어라.

$ gunzip tcp_wrappers_7.6.tar.gz
$ tar xvf tcp_wrappers_7.6.tar이 명령을 실행하고 나면 tcp_wrappers_7.6 라는 이름의 부 디렉토리가 생긴다. 이 후의 모든 작업은 이 부 디렉토리에서 이루어진다.



--------------------------------------------------------------------------------

실행 파일 만들기와 설치
Makefile 은 솔라리스 2.X를 비록한 많은 운영체제에서 아무 문제없이 동작한다.


tcp wrapper 이진 파일 만들기


make 명령어로 tcpd와 libwrap.a의 이진 파일을 만들려면 몇 가지 옵션을 지정해 주어야 한다.

$ make REAL_DAEMON_DIR=/usr/sbin STYLE=-DPROCESS_OPTIONS FACILITY=LOG_DAEMON sunos5옵션
설명

REAL_DAEMON_DIR
telnetd와 같은 기존 네트워크 디몬 프로그램의 경로

STYLE
추가적인 설정 옵션을 활성화

FACILITY
syslog 메시지에 사용

sunos5
운영체제를 지정


tcpd는 기본적으로 모든 메시지를 LOG_MAIL facility를 사용하여 기록한다. 우리는 네트워크 서버에 의해 만들어진 메시지들은 LOG_MAIL에 의해 생성된 파일과는 다른 곳에 저장되길 권고한다.

주의: 시스템에 Sun C 컴파일러(cc) 대신 GNU C 컴파일러(gcc)가 설치되어 있다면, make 명령을 다음처럼 실행해야 한다.

$ make REAL_DAEMON_DIR=/usr/sbin STYLE=-DPROCESS_OPTIONS FACILITY=LOG_DAEMON CC=gcc sunos5NIS(Network Information Service, 전에는 YP(Yellow Pages)라 불림)를 사용 가능하다면 tcpd가 사용하는 접근 규칙에 Netgroup을 사용할 수 있다. Netgroup을 사용하려면 make 명령에 "NETGROUP= -DNETGROUP" 옵션을 포함시켜라.


tcp wrapper와 부속 파일 설치하기


make를 이상 없이 실행한 후, 프로그램과 man 페이지를 미리 정한 시스템 디렉토리로 복사해라:

$ cp tcpd /opt/sbin
$ cp safe_finger /opt/sbin
$ cp tcpdchk /opt/sbin
$ cp tcpdmatch /opt/sbin
$ cp try-from /opt/sbin
$ cp hosts_access.3 /opt/man/man3
$ cp hosts_access.5 /opt/man/man5
$ cp hosts_options.5 /opt/man/man5
$ cp tcpd.8 /opt/man/man8
$ cp tcpdchk.8 /opt/man/man8
$ cp tcpdmatch.8 /opt/man/man8

tcp wrapper 라이브러리 설치하기


logdaemon처럼 tcp wrapper의 라이브러리를 사용하는 다른 프로그램이 있다면 다음 명령을 실행해야 한다:

$ cp libwrap.a /opt/lib
$ cp tcpd.h /opt/includetcpd.h가 라이브러리가 설치된 디렉토리와 다른 곳에 위치한다면, 라이브러리를 사용하는 다른 툴들을 설치할 때 약간의 수정을 해주어야 한다. 헤더 파일을 통상적인 시스템 디렉토리에 놓아두는 것이 아주 좋은 해결책이다. 그러나 이런 방법을 싫어한다면 헤더 파일을 /opt/lib 에 복사해 두어라.



--------------------------------------------------------------------------------

tcpd 설정하기
tcpd 프로그램을 설치한 후 설정 파일을 수정해야 한다. tcpd가 접근 제어와 기록 둘 다에 사용된다면 두 가지 설정 파일을 사용해야 한다. 설정 파일의 구조와 몇 가지 옵션, 키워드를 설명하기 위해 예제를 포함했다. 더 자세한 것은 man 페이지에서 얻을 수 있다: hosts_options (3), host_options (5), and hosts_access (5).


tcp wrapper로 모든 네트워크 데몬을 다 보호할 수는 없다.


네트워크 프로토콜과 서비스가 아주 다양하기 때문에 tcpd로 모든서버를 다 보호할 수는 없다:

tcpd는 접속 기록을 하기 위해 새로 접속할 때마다 시작되도록 설계되었다. 부하가 많이 걸리는 sendmail과 같은 서버들은 보통 시작 부하를 줄이기 위해 한번만 시작된다; 그러므로 그런 서버들은 첫번째 접속만 기록하는 tcpd로는 관리하기가 힘들다.
tcpd는 TCP (transmission control protocol)와UDP (user datagram protocol)를 사용하는 서버만 보호할 수 있다.
어떤 서버들은 TCP와 RPC (remote procedure call) 프로토콜을 둘 다 사용한다. 이런 서버들은 tcp wrapper로 보호할 수 없다. 이런 서버들은 inetd.conf (4)의 세 번째 항인 프로토콜에 rpc/tcp가 기록되어 있다.
한번에 하나의 접속만을 처리하는 서버만 보호할 수 있다. (주어진 시간에 서버 프로세스의 복사본이 여러 개 있을 수는 있지만, 각 복사본은 정확히 하나의 접속만을 처리하고 완료되자마자 종료됨을 주의해라. 이것은 하나의 복사본이 도착하는 여러 개의 접속을 처리하는 것과는 다르다.) 그 외의 서버들은 초기 접속을 처리한 후에도 살아남아서 다른 접속 요구를 기다린다. 그런 서버들은 inetd.conf의 네 번째 항이 "wait"로 되어 있어서 구별할 수 있다.


설정 파일의 용도


모든 규칙은 설정 파일에 저장된다. 규칙은 놓여진 순서대로 적용된다. 어떤 규칙이 해당 접속에 일치한다면 다른 규칙은 고려하지 않는다. 기본적으로 두 개의 파일이 정의된다. 접속이 두 개의 파일 중 어떤 것에도 일치하지 않는다면 접근이 허가된다:

hosts.allow
말 그대로, 접근을 허가하는 규칙들.
hosts.deny
말 그대로, 접근을 거부하는 규칙들. 명시적으로 허가하지 않는 접속 외에는 모두 거부하는 "만물상" 규칙을 둘 것을 권한다.
두 개의 파일을 가지는 대신에 모든 규칙을 하나의 파일 안에 둘 수도 있다. 이 때는 각 규칙이 어떻게 적용될지 지정하기 위해 옵션으로 "ALLOW"와 "DENY" 키워드를 사용한다.


설정 파일의 구조


한 줄에 하나의 규칙이 오며, 최소 세 개의 항목으로 이루어 진다. 이 때 각 항목은 ":" 문자로 구분된다:

첫번째 항목은 inetd.conf에 등록된 서비스를 지정한다. 단 서비스를 수행하는 프로그램을 적어준다. 예를 들면, "telnet" 서비스는 "in.telnetd" 프로그램에 의해 제공된다. 그러므로 "telnet" 서비스의 규칙은 "in.telnetd"로 시작해야 한다. "ALL" 키워드는 모든 서비스를 의미한다.
두번째 항목은 규칙이 적용될 출처 주소를 지정한다. 호스트 명과 도메인명을 사용할 수도 있지만 IP(Internet protocol) 주소나 IP 주소 범위를 사용하는 것이 더 적절하다. 호스트 명과 도메인 명은 추가로 DNS(domain name system)탐색을 해야 하고, DNS spoofing 공격(외부 호스트의 IP 주소가 조직 안의 호스트 명을 가진 것처럼 조작)의 위험성도 있다. 두 가지 키워드를 사용할 수 있다: (1) "LOCAL"은 같은 서브넷이나 서브 도메인에 있는 모든 호스트를 말하고 (2) "ALL"은 주소에 상관없이 모든 호스트를 의미한다.
세번째 항목은 옵션을 지정한다. 여러 개의 옵션이 올 수 있으며, ":" 문자로 구분한다.


설정 파일에 사용 가능한 옵션


예제의 옵션들은 가장 많이 쓰이는 것들이다. 옵션들의 의미는 다음과 같으며, 아무 규칙에나 순서와 조합에 상관 없이 사용할 수 있다.
옵션
설명

RFC931
접속할 때마다 ident 탐색이 수행된다. ident에 사용되는 프로토콜은 원래 RFC 931(현재는 RFC 1413)에 문서화되어 있다. ident 서비스를 제공하는 시스템으로부터 접속 요구가 온다면 해당 시스템에 사용자 명을 요구할 수 있다. 이렇게 하는 것이 사용자 확인을 완벽하게 보장해주지는 못하지만 침입을 분석할 때 유용한 정보를 제공할 수는 있다. ident 요구는 접속을 지연시켜서 사용자가 알아차릴 수도 있다.

BANNERS
이 옵션은 telnet, ftp, rlogin과 같은 프로토콜에 대해 접근 제한, 기록 등이 이루어지고 있음을 사용자에게 부가적인 텍스트를 보여줄 수 있다. 배너가 출력될 서비스의 이름과 같은 파일이 지정된 디렉토리 안에 존재해야 한다. (더 자세한 것은 각각의 서비스에 대해 배너를 만들어주는 도구에 첨부된 프로그램 문서에서 얻을 수 있다.)

SPAWN
특정한 명령을 수행하는 프로세스를 만든다. 명령어 안에 접속을 요구한 곳의 IP 주소나 호스트 명을 %h 변수를 사용하여 넣을 수도 있다. %d는 서비스를 나타내는 변수이고, %u는 ident 탐색의 결과를 나타내며, "UNKNOWN"은 결과를 얻을 수 없을 때 얻는 값이다. (%u 변수가 사용되면 RFC931 옵션이 없더라도 ident 탐색이 이루어진다.)







--------------------------------------------------------------------------------

예제
다음 예는 세 개의 서브네트워크가 있음을 가정한다. 부서 A는 네트워크 주소가 10.0.1.0이고, netmask는 255.255.255.0이다. 전산소는 netmask는 같지만, 네트워크 주소는 10.0.250.0이다. 부서 B의 서버는 원격 접근을 허용하고 IP 주소는 10.0.2.15이다.

다음 설정은 부서 B에서 사용된다:


/etc/hosts.allow


같은 서브넷과 부서 A, 전산소에서는 모든 서비스에 대한 접근이 허용된다. 원격 접근 서버에서 접속한 사용자는 telnet과 ftp만 허용된다.

ALL: LOCAL 10.0.1.0/255.255.255.0 10.0.250.0/255.255.255.0: RFC931 : BANNERS /opt/sbin/sec/banners
in.telnetd: 10.0.2.15: RFC931 : BANNERS /opt/sbin/sec/banners
in.ftpd: 10.0.2.15: RFC931 : BANNERS /opt/sbin/sec/banners

/etc/hosts.deny


다른 모든 접속은 거부된다.

ALL: ALL: RFC931 : BANNERS /opt/sbin/sec/reject :
SPAWN (/usr/sbin/sec/safe_finger -l @%h | /usr/ucb/mail -s %d-%h root) &

더 자세한 설명


예로 든 설정에서, RFC931과 BANNERS가 모든 접속에 대해서 사용된다. 이 회사는 ident 서버를 지원하므로 사용자는 지연되는 것을 거의 느낄 수 없다. banners는 추가적인 보안을 위해 확장된 기록을 할 목적으로 사용된다. 접속이 거부되면, 특별한 "reject" 배너를 출력해서 추후에 접속하지 않도록 해준다.

SPAWN 명령어는 접속이 거부되었을 때 사용된다. 즉, 접속을 요구한 곳에 대한 더 자세한 정보를 얻어와서 필요하다면 더욱 자세한 분석을 할 수 있도록 관리자에게 경보를 보내준다. SPAWN은 tcp wrapper의 일부인 safe_finger 프로그램을 호출 해서, finger 탐색을 한 후 메일 프로그램으로 결과를 보낸다. 메일 프로그램은 요구한 서비스와 접속을 요구한 호스트 또는 IP 주소를 나열한다.



--------------------------------------------------------------------------------

inetd 설정하기
tcp wrapper는 inetd.conf를 수정하여 몇 가지 서비스를 대신하도록 설정되어 있다. 이런 서비스들에 대한 접속은 모두 기록되며, 접근 제어가 적용된다. tcpd는 hosts.allow나 hosts.deny 파일 안의 규칙에 지정된 서비스만을 보호한다. 그 외 다른 서비스들은 "ALL"을 사용하여 보호된다. inetd.conf 안에서 tcpd 가 호출되면 규칙의 유무에 상관없이 모든 접속이 기록된다.


inetd 안에서 tcpd 호출하기


다음은 inetd.conf 설정의 예로부터 따온 것이다:

ftp stream tcp nowait root /opt/sbin/tcpd in.ftpd
telnet stream tcp nowait root /opt/sbin/tcpd in.telnetd
shell stream tcp nowait root /opt/sbin/tcpd in.rshd
login stream tcp nowait root /opt/sbin/tcpd in.rlogind
finger stream tcp nowait nobody /opt/sbin/tcpd in.fingerd이 문장들은 위의 예에서 계속된 것이다. ftp와 telnet 외에 세 개의 다른 서비스들(rsh, rlogin, finger)가 tcpd로 보호되고 있다. 예에서는 명시적으로 지정되지 않은 이런 서비스들은 두 개의 "ALL" 규칙에 의해 적용을 받는다. 이 규칙은 같은 서브넷/서브도메인, 부서 A와 B, 전산소에 위치한 시스템의 사용자에게는 접근을 허용한다. 그 외의 다른 곳에서의 접근은 거부된다.


Activate the updated configuration.


수정을 한 후에는 inetd를 재시작해야 한다:

$ kill -HUP


--------------------------------------------------------------------------------

배겨 지식과 추가로 알아둘 만한 것

다음은 몇 가지 추가로 알아둘 만한 것들이다.


덫을 준비하기


조기 경보를 위해 덫을 준비해둘 수도 있다. 즉, 설정할 때 필요하지 않은 서비스를 활성화시켜 두고, tcpd를 사용해서 모든 접속을 기록한 다음 서비스를 거부해 버리는 것이다. 이렇게 해두면 침입자가 더욱 고도의 기술을 쓰기 전에 먼저 잘 알려진 공격을 시도해 볼 때 매우 유효할 것이다.

이런 접근 방법은 제한 적으로 사용돼야 한다. 다음은 시스템에 대한 정보를 제공하는 두 가지 서비스에 대한 접속을 허용해준다:

systat stream tcp nowait nobody /opt/sbin/tcpd /bin/false
netstat stream tcp nowait nobody /opt/sbin/tcpd /bin/falsetcpd의 매개 변수로 서비스를 제공하는 실제 프로그램을 넣지 않는 것이 중요하다. 접근이 실수로 허용되더라도(예를 들면, 잘못된 설정 때문에)부주의하게 서비스를 제공하고 싶지는 않을 것이다. /bin/false로 두면 즉시 종료돼서 사용자 입력을 전혀 받아들이지 않기 때문에 매우 안전한 방법이 된다.


설정 사항 점검


tcp wrapper의 설정 사항은 호스트의 보안에 심각한 영향을 미친다. 그래서 두 가지 검사 프로그램이 소프트웨어의 일부로 제공된다:


tcpdchk(8)는 inetd.conf를 분석해서 tcp wrapper와 관련된 모든 에러를 보여준다.
tcpdmatch(8)는 주어진 IP 주소에 대해서 설정이 어떻게 되어 있고, 접속이 허가되는지 거부되는지 결과를 출력해준다.


IP spoofing의 위험성


접근 제어와 기록은 IP 프로토콜의 IP 주소를 기반으로 이루어진다. 그러나 특정한 환경에서는 IP 주소를 속일 수도 있으며, 이는 침입자가 접근 권한을 얻을 수 있는 가능성을 주게 된다. tcp wrapper는 약점을 줄이기 위해 두 번의 DNS 탐색을 행함으로서 이런 방식의 공격을 탐지하려고 한다:즉, 연결을 요구한 IP 주소에 대한 호스트명을 찾아보고, 다시 해당 호스트명에 대해 IP 주소를 찾아본다. 그 결과 얻어낸 IP 주소가 원래의 주소와 일치하지 않는다면, 접속은 거부된다. 이 모드는 "PARANOIDE"라고 부르며 컴파일할 때 꺼놓을 수 있다. (DNS를 통해서 원래의 주소로 호스트명을 얻을 수 없다면 적법한 호스트였을지라도 접속은 거부된다. 이것은 reverse 탐색이 제공되지 않는 사이트에 특히 영향을 미칠 수 있다.) 부연하자면, 접속을 제한하려는 모든 주소는 IP 주소로 기술되야 한다. 호스트 명은 접속을 제한하려는 곳을 IP 주소로는 표현할 수 없을 때만 사용해야 한다.


설정 사항을 보호하기


설정 파일은 시스템에 저장되므로 조작될 가능성이 있다. 그러므로 이런 파일들의 관리용 복사본을 만들어서 물리적으로 쓰기 금지된 매체에 옮겨서 보관할 필요가 있다. 그리고 나서 Tripwire와 같은 결함 검사 도구 중 하나를 사용해서 이런 설정 파일들을 검사해 볼 필요가 있다.

by 무난하게 | 2005/02/27 00:14 | Technical.Doc | 트랙백

솔라리스 볼륨매니져 [Mirror] |

4) Mirror

- Encapsulate 지원된다.
- Read Option : Round Robin(교대로 읽기), Geometric( sequential 에 빠름 ) ,
First ( target hdd의 성능이 느릴때 )
- Write option : Parallel , Serial ( Write 시간 길어짐 )
- Pass Number : Reboot 시 Sync단계 0 - none
Mirror하는 Slice가 여러개 있을땐, 이 값을 틀리게 줘야 병목이 줄어든다.
swap은 항상 '0' 로 준다.

* Root DIsk Mirror 하기

[c0t0d0s0 = root, c0t0d0s1 = swap , c0t1d0 은 target 이라 가정 ]
- System Mount point : /, /swap, /var, /usr ...은 meta device에 일단 넣어둔후
Reboot 한뒤, md로 OS를 시작시킨후, target Disk를 붙여서 미러링 해야 한다.

-백업 & target Disk slice 생성
# cp /etc/vfstab /etc/vfstab_before_md
# cp /etc/system /etc/system_before_root_mirror
# prtvtoc /dev/rdsk/c0t0d0s2 | fmthard -n os_mirror -s - /dev/rdsk/c0t1d0s2

- 진행하면서, Metatool & 로 변하는 모양을 잘 본다.

# metainit -f d10 1 1 c0t0d0s0 ; sub Disk d10
# metainit d20 1 1 c0t1d0s0 ; sub Disk d20
# metainit d50 -m d10 ; meta device d50 속에 sub disk d10 넣기
#metaroot d50 ; vfstab의 / 부분을 자동으로 변경하고, system file로 변경

# metainit -f d11 1 1 c0t0d0s1 ; swap
# metainit d21 1 1 c0t1d0s1
# metainit d51 -m d11

..... /var 나 다른 놈이 있으며 계속 작업

#vi /etc/vfstab 수정; / 이외의 부분은 자동으로 안 바뀐다.

# Reboot

- 이제 target disk를 source에 붙여서 동기화 시킨다.
이때, disk I/O 작업이 없어야 한다.

# lockfs -fa ; ufs lock 걸기 , i/o 발생이 없으면 안 해도 무방
# metattach d50 d20
# metattach d51 d21 ...

#metastat 나 metatool 에서 Sync 되는 것을 확인한다.

- OBP에 mirror Disk 정보 입력

# cd /usr/platform/sun4u/sbin
# format 명령으로 Mirror Disk의 물리적 주소를 적어 둔다.
# eeprom use-nvramrc?=true
# eeprom nvramrc='devalias os_mirr /pci@1f,4000/scsi@3/disk@3,0'
; > ok mode에서 reset해야 설정됨

또는 okmode에서 devlias 로 작업...


- Boot Test

; 소스, 미러 디스크를 둘 다 장착되어 있는 상태에서
ok> boot os_mirr 로 test

; 소스 디스크를 빼고, test 할 경우, 간혹 metadb가 소스디스크 쪽을
사용하고 있으면, 싱글모드로 빠져서 정상 부팅이 안 될때가 있다.
이때는, 싱글 상태에서 빠져버린 디스크쪽의 metadb를 지우면 된다.
# metadb -d -f c0t0d0s7


* Root disk unmirror 하기
; 미러링을 제거 할때는, 미러링 할때의 반대 순서로 하면 된다.

#metadetach d50 d20
#metadetach d51 d21
#metaroot /dev/dsk/c0t0d0s0
; /etc/vfstab에서 / 이외의 부분은 자동으로 바뀌지 않으므로,
/dev/md을 원 OS 영역으로 바꿔준다.
# Reboot

# df -k 로 / 에서 md가 사라진 것을 확인
# metaclear -r d50; metaclear d10
# metaclear -r d51; metaclear d11
# metaclear d20; metaclear d21...

; 더 이상 md 기능을 사용치 않으려면,metadb를 다 지우고
pkg를 찾어서 제거한다.

by 무난하게 | 2005/02/02 21:23 | Technical.Doc | 트랙백

◀ 이전 페이지          다음 페이지 ▶