- Synchronous interrupt:
- Asynchronous interrupt:
「주역」의 ‘계사전’에는 “궁즉변 변즉통 통즉구(窮則變 變則通 通則久 : 다하면 변하고 변하면 통하며 통하면 지속된다)”라는 말이 나온다. 원래 「주역」이란 책은 ‘변화의 책’이다. 하지만 ‘변화’는 역설적으로 수천년을 이어오면서도 변하지 않는 지고지선의 이치다. 공자가 책을 묶은 가죽끈이 일곱 번이나 끊어질 정도로 열심히 읽었다는 주역의 근본 이치는 ‘어떤 일이 막히면(뜻대로 되지 않거나 그것이 한계에 이르면) 변화하고, 변화하면 통하게 되며, 통함으로써 영원하다’라는 궁즉변의 이치를 설명하는 통변론(通變論)이다. 「주역」에서는 이것을 이렇게 설명한다. “달이 차면 이지러지고, 해가 중천에 이르면 기울게 되는데 사물의 이치야 말해 무엇하겠는가! 그것이 다함에도 변하지 않으면 소멸할 것이요, 막혔다고 여겨지면 변화하여 그것이 서로 통하게 하면 영원할 것이다.” 이렇듯 주역은 철저한 부정에서 긍정으로 나아가는 길을 이야기한다. -시골의사-
2012년 4월 17일 화요일
리눅스 커널의 이해: 인터럽트와 예외
인터럽트(Interrupt): 프로세서가 실행하는 명령어의 순서를 바꾸는 사건
2012년 4월 10일 화요일
2012년 4월 9일 월요일
2012년 4월 8일 일요일
solaris: 오브젝트 덤프를 이용하여 커널 패닉 분석하기
가정 1. 커널 패닉이 발생하여 덤프 파일이 생성되어 있다 2. 커널 패닉이 발생한 위치가 자신이 빌드한 소스에서 발생하였다 위 두가지 가정하에서 커널 패닉이 유발 시킨 자신의 '코드의 위치'를 찾는 방법에 대하여 소개한다. 커널 덤프 확인 디폴트로 설치된 솔라리스 시스템에서 커널 패닉이 발생하면 덤프 파일이 생성되게 된다. 보통 /var/adm/messege 로그를 보면 최근 발생한 패닉의 정보를 확인 할 수 있는데, messege 파일이 생성되지 않는 경우에서 덤프 파일을 이용하여 패닉 정보를 확인하여야 한다. 덤프 파일이 생성되는 위치는 /var/crash/노드이름/ 하위에 생성되는데, 덤프 파일 이름은 unix.#, vmcore.# 이다. 덤프 파일을 확인 하기 위해서는 adb를 사용하면된다.
위와 같이 패닉 위치를 확인 할 수 있다. 오브젝트 덤프 생성 하기 커널 패닉 위치 감은 잡았지만 적확히 소스의 위치를 확인 하기위해서는 오브젝트 덤프를 생성하여야 한다. 위 패닉 정보에서 '0x3000168ce63: 000002a1007a3ec0 mdp_ke:putMemUse+120 (6d, 2, 3000905bb10, 780ea000, 10, 7374616c6c2f636f)' 패닉의 원인으로 가장 유력해 보이지만 소스의 어느 위치인지 모른다. 솔라리스에서 오브젝트 덤프를 생성하기 위해서는 -fast -xcg92 -S 옵션을 주고 오브젝트 파일을 생성하지 않으면 .s파일이 생성 된다.
위와 같이 오브젝트 덤프를 확인 할 수 있다. 덤프 내용을 살펴보면 어셈블과 0x00으로된 주소, 그리고 자신의 코드를 확인 할 수 있다. 앞에서 확인한 커널패닉 로그를 다시 보면 '0x3000168ce63: 000002a1007a3ec0 mdp_ke:putMemUse+120 (6d, 2, 3000905bb10, 780ea000, 10, 7374616c6c2f636f)' putMemUser함수에서 +120 번째에서 났다는것을 의미 한다. 그러므로 위 코어 더프내용에서 putMemUse 함수를 찾고 그함수 내부에서 0x0120을 찾으면 된다. |
AIX: how to create the user core file
멀티스레드 프로그램의 코어 파일 요구사항
기본적으로 프로세스는 전체 코어 파일을 생성하지 않습니다. 응용프로그램이 공유 메모리 영역 특히, 스레드 스택의 데이터를 디버그해야 할 경우 전체 코어 덤프를 생성해야 합니다. 전체 코어 파일 정보를 생성하려면 다음 명령을 루트 사용자로 실행하십시오.
각 pthread는 생성된 코어 파일의 크기에 추가합니다. pthread가 필요로 하는 코어 파일 공간의 양에는 사용자가 pthread_attr_setstacksize 서브루틴으로 제어할 수 있는 스택 크기가 포함됩니다. 널(NULL) pthread 속성으로 작성된 pthread의 경우, 32비트 프로세스의 각 pthread는 128KB를 코어 파일의 크기에 추가하고 64비트 프로세스의 각 pthread는 256KB를 코어 파일의 크기에 추가합니다.
기본적으로 프로세스는 전체 코어 파일을 생성하지 않습니다. 응용프로그램이 공유 메모리 영역 특히, 스레드 스택의 데이터를 디버그해야 할 경우 전체 코어 덤프를 생성해야 합니다. 전체 코어 파일 정보를 생성하려면 다음 명령을 루트 사용자로 실행하십시오.
# chdev -l sys0 -a fullcore=true |
각 pthread는 생성된 코어 파일의 크기에 추가합니다. pthread가 필요로 하는 코어 파일 공간의 양에는 사용자가 pthread_attr_setstacksize 서브루틴으로 제어할 수 있는 스택 크기가 포함됩니다. 널(NULL) pthread 속성으로 작성된 pthread의 경우, 32비트 프로세스의 각 pthread는 128KB를 코어 파일의 크기에 추가하고 64비트 프로세스의 각 pthread는 256KB를 코어 파일의 크기에 추가합니다.
2012년 4월 5일 목요일
잡담: 지식의 여신은 쉽게 옷을 벗지 않는다
지식의 여신은 쉽게 옷을 벗지 않는다 [펌]
나자신도 크게 다를바 없었겠지만 사회생활을 시작하는 입장에 서있는 사람들은 일자리를 고르면서 보수나 복지, 근무시간을 먼저 따지게 되는 경우가 많을 것이다. 어느 인사 담당자가 사회에 첫발을 내딛는 패기만만해야 할 젊은이들이 맨 처음 챙기는 것이 고작 퇴직규정이라고 개탄했다는 얘기도 있다. 하지만 당장 눈앞의 현실에 대한 걱정이 앞서는 보통 사람들의 입장을 비난할 수만은 없을 것이다. 하옇든 젊은이들의 부푼 기대와는 달리 이 땅에서 나처럼 평범한 엔지니어가 되면 일단은 그저그런 봉급에 대부분의 시간을 회사에 반납해야할 상황에 처하게 될 확률이 많을 것이다. 금전적인 문제야 요즘 시대상황이 급변하는 만큼, 변수가 많아 논외로 치더라도 엔지니어로서 새로운 것을 생각해내야 하거나, 도무지 종잡을 수 없는 혼돈 속에서 질서를 잡아내며 코 앞에 닥친 문제를 해결해 나가기 위해서는 일에 많은 시간의 투자가 필요하기 마련이다. 모든 직업이 마찬가지 겠지만, 이런저런 애환을 들먹거리지 않더라도 일을 통해 나름대로의 가치를 찾지 못한다면 그 생활은 그저 고달픈 것일 수 밖에 없을 것이다.
그렇다면 엔지니어 생활의 가치란 무엇일까? 사람마다 다를 수 있겠지만 나의 경우를 들자면 세간의 입에 오르내릴 대단한 일은 못될 지라도, 일단 주어진 문제를 해결하고 새로운 지식을 얻는 과정에서 발생하는 나름대로의 창조적 과정을 즐기는 것이다. 새로 맡은 개발 업무를 부담스러워하는 후배들에게 본인이 잘 인용하는 지식에 대한 몇가지 법칙이 있다. 그 첫번째는 바로 '지식의 여신(또는 남신)은 쉽게 옷을 벗지 않는다'라는 것이다. 지식의 여신은 새침떼기에 콧대가 높아서, 절대 함부로 그 신비한 내면을 드러내지 않는 법이다.
새로운 프로젝트가 떨어지면 각자의 위치와 내공에 따라 업무를 할당받게 될 것이다. 익숙한 업무를 반복하는 것이라면 이미 통성명에 술자리까지 해서 친숙해진 몇몇 여신들과 반갑게 하이 파이브나 하면서 일사천리로 일을 진행시켜 나갈 수 있겠지만, 대신 재미가 좀 덜하고 자칫 지루해지기 쉽상이다. 좀더 재미있게 세상을 살기 위해서는 흔히 말하는 대로 보다 도전적이고 진취적인 선택을 할 필요가 있다. 그 동기는 단순히 재미를 위한 것일 수도 있고 아니면 내공 증진을 통한 몸 값 키우기 같은 것처럼 좀더 세속적인 것일 수도 있다. 어쨌든 나름대로 대단한 결심을 한 직 후, 우리는 자신의 앞에 낯설은 문이 하나 가로놓여 있음을 깨닳게 된다. 또한 그 문을 여는 순간 신비스러운 자태의 지식의 여신이 범접하기 어려운 모습으로 우리의 길을 가로막고 있음을 보게 된다. 여신의 허락이 없이는 더이상 진행할 수가 없다. 적절한 내공을 갖추지 못한 채 아부나 인맥으로 정치공작을 해댄다고 해도, 돌아오는 것은 야속하리 만치 냉정한 새침떼기 여신의 괄시와 배척뿐이다.
길은 오로지 정성을 다해 공을 들이는 것 뿐이다. 그동안 한 두 번 재수로 일이 쉽게 풀렸다고 할 지라도, 아니면 타고난 천재라서 여지껏 문제없이 일을 해결해 왔을지라도 언젠가는 각자 레벨에 맞는 호적수를 만나게 된다고 보면 틀림없을 것이다. 여신의 비밀을 풀기 위해서 우리들은 오늘도 디버거에 올린 코드를 수십, 수백번 재 실행시키거나 이미 누더기가 된 칩 사양서를 읽고 또 읽으며, 다운된 보드를 하루에도 수백번 재부팅시켜야만 한다. 포기하고픈 마음이 생기는 경우도 있을 것이다. 하지만 잘나가는 엔지니어가 되기위해서, 또는 상급자가 무서워서, 아니면 회사의 중요한 전략적 과제에 대한 책임때문에 포기란 있을 수 없는 법이다. 하지만 단순히 난관을 극복하고 어쩌구 저쩌구하는 통속적인 설명을 떠나서, 쉽게 포기해서는 안될 한가지 더 큰 이유가 있다. 잘 알려지지는 않았지만 지식의 여신은 처음 생각했던것 보다 더 큰 보상을 돌려주는 경향이 있다. 이는 지식에 관한 두번째 법칙으로, 지식의 여신은 쉽게 지식을 허락하지는 않지만 일단 한번 자신을 극복한 사람에 대해서는 보너스까지 덧붙여서 마구 퍼준다는 것이다. 한번 여신이 따뜻한 미소를 지으며 친밀감을 표시하는 순간 뜻밖의 선물을 받게 될 지도 모른다. 복잡하게 얽히고 섥혀 자신을 괴롭히던 많은 문제들이 한순간 제자리를 잡으며 머릿속에 정돈될 때 느끼는 환희는 어떤 것과도 바꿀수 없지만, 더불어 이제 지식의 여신은 자기가 가지고 있던 모든 것을 차례 차례 보여주기 시작할 것이다. 우리는 다시 아름다운 여신의 안내에 따라 미쳐 생각지도 못했던 것까지 친절한 설명을 듣게 되는 것이다. 하긴 요즘 쇼핑은 제품보다 경품이라는데 아까워서라도 쉽게 포기할 수는 없는 것이다.
게다가 한번 지식의 여신의 선물을 받아보게 되면 그것은 하나의 성공 체험이되어 자신에게 깊은 영향을 주게된다. 그것은 나이 어린 사람에게 일생을 좌우할 만한 중요한 경험이 되기도 한다. 후배를 가르쳐야 하는 입장이라면 어떤 식으로건 이러한 성공 체험을 할 수있도록 유도하는 것이 중요하다고 생각한다. 쓸 만한 후배라면 그 다음부터는 자기가 알아서 할 것이다.
이제 마지막으로 한가지 법칙만 남았다. 우리는 얼마간 그 여신의 방에서 즐거운 시간을 보내게 된다. 쾌적한 상태가 지속될수록 이제 떠나야 할 시간이 얼마남지 않았다는 것을 직감적으로 느끼게 된다. 프로젝트는 계속되어야 하는 것이다. 여태까지의 문제는 어느 정도 정리가 되었고 여신과의 작별인사도 이미 나누었으니 아쉬움을 뒤로하고 다시 걸음을 재촉할 수 밖에 없다. 잠시 여신과의 추억을 되새겨 보기도 한다. 하지만 무심코 코너를 돌아선 순간 우린 '악' 하는 비명과 함께 그 자리에 멈춰서고 만다. 지식에 관한 세번째 법칙, '지식의 여신은 코너를 돌면 또 나온다'. 새로운 얼굴의 여신이 또 길을 막아선 것이다. 아마도 뉴톤은 이 법칙을 너무나 잘 알고 있었기 때문에 자신은 진리의 바다에 이제 막 발목을 담구었을 뿐이라고 겸손을 보였던 모양이다.
[끝]
2001/06/15 나성언 (http://user.chollian.net/~lase) :현재는 폐쇄중입니다.
출처: http://ehclub.tistory.com/entry/%EC%A7%80%EC%8B%9D%EC%9D%98-%EC%97%AC%EC%8B%A0%EC%9D%80-%EC%89%BD%EA%B2%8C-%EC%98%B7%EC%9D%84-%EB%B2%97%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4
나자신도 크게 다를바 없었겠지만 사회생활을 시작하는 입장에 서있는 사람들은 일자리를 고르면서 보수나 복지, 근무시간을 먼저 따지게 되는 경우가 많을 것이다. 어느 인사 담당자가 사회에 첫발을 내딛는 패기만만해야 할 젊은이들이 맨 처음 챙기는 것이 고작 퇴직규정이라고 개탄했다는 얘기도 있다. 하지만 당장 눈앞의 현실에 대한 걱정이 앞서는 보통 사람들의 입장을 비난할 수만은 없을 것이다. 하옇든 젊은이들의 부푼 기대와는 달리 이 땅에서 나처럼 평범한 엔지니어가 되면 일단은 그저그런 봉급에 대부분의 시간을 회사에 반납해야할 상황에 처하게 될 확률이 많을 것이다. 금전적인 문제야 요즘 시대상황이 급변하는 만큼, 변수가 많아 논외로 치더라도 엔지니어로서 새로운 것을 생각해내야 하거나, 도무지 종잡을 수 없는 혼돈 속에서 질서를 잡아내며 코 앞에 닥친 문제를 해결해 나가기 위해서는 일에 많은 시간의 투자가 필요하기 마련이다. 모든 직업이 마찬가지 겠지만, 이런저런 애환을 들먹거리지 않더라도 일을 통해 나름대로의 가치를 찾지 못한다면 그 생활은 그저 고달픈 것일 수 밖에 없을 것이다.
그렇다면 엔지니어 생활의 가치란 무엇일까? 사람마다 다를 수 있겠지만 나의 경우를 들자면 세간의 입에 오르내릴 대단한 일은 못될 지라도, 일단 주어진 문제를 해결하고 새로운 지식을 얻는 과정에서 발생하는 나름대로의 창조적 과정을 즐기는 것이다. 새로 맡은 개발 업무를 부담스러워하는 후배들에게 본인이 잘 인용하는 지식에 대한 몇가지 법칙이 있다. 그 첫번째는 바로 '지식의 여신(또는 남신)은 쉽게 옷을 벗지 않는다'라는 것이다. 지식의 여신은 새침떼기에 콧대가 높아서, 절대 함부로 그 신비한 내면을 드러내지 않는 법이다.
새로운 프로젝트가 떨어지면 각자의 위치와 내공에 따라 업무를 할당받게 될 것이다. 익숙한 업무를 반복하는 것이라면 이미 통성명에 술자리까지 해서 친숙해진 몇몇 여신들과 반갑게 하이 파이브나 하면서 일사천리로 일을 진행시켜 나갈 수 있겠지만, 대신 재미가 좀 덜하고 자칫 지루해지기 쉽상이다. 좀더 재미있게 세상을 살기 위해서는 흔히 말하는 대로 보다 도전적이고 진취적인 선택을 할 필요가 있다. 그 동기는 단순히 재미를 위한 것일 수도 있고 아니면 내공 증진을 통한 몸 값 키우기 같은 것처럼 좀더 세속적인 것일 수도 있다. 어쨌든 나름대로 대단한 결심을 한 직 후, 우리는 자신의 앞에 낯설은 문이 하나 가로놓여 있음을 깨닳게 된다. 또한 그 문을 여는 순간 신비스러운 자태의 지식의 여신이 범접하기 어려운 모습으로 우리의 길을 가로막고 있음을 보게 된다. 여신의 허락이 없이는 더이상 진행할 수가 없다. 적절한 내공을 갖추지 못한 채 아부나 인맥으로 정치공작을 해댄다고 해도, 돌아오는 것은 야속하리 만치 냉정한 새침떼기 여신의 괄시와 배척뿐이다.
길은 오로지 정성을 다해 공을 들이는 것 뿐이다. 그동안 한 두 번 재수로 일이 쉽게 풀렸다고 할 지라도, 아니면 타고난 천재라서 여지껏 문제없이 일을 해결해 왔을지라도 언젠가는 각자 레벨에 맞는 호적수를 만나게 된다고 보면 틀림없을 것이다. 여신의 비밀을 풀기 위해서 우리들은 오늘도 디버거에 올린 코드를 수십, 수백번 재 실행시키거나 이미 누더기가 된 칩 사양서를 읽고 또 읽으며, 다운된 보드를 하루에도 수백번 재부팅시켜야만 한다. 포기하고픈 마음이 생기는 경우도 있을 것이다. 하지만 잘나가는 엔지니어가 되기위해서, 또는 상급자가 무서워서, 아니면 회사의 중요한 전략적 과제에 대한 책임때문에 포기란 있을 수 없는 법이다. 하지만 단순히 난관을 극복하고 어쩌구 저쩌구하는 통속적인 설명을 떠나서, 쉽게 포기해서는 안될 한가지 더 큰 이유가 있다. 잘 알려지지는 않았지만 지식의 여신은 처음 생각했던것 보다 더 큰 보상을 돌려주는 경향이 있다. 이는 지식에 관한 두번째 법칙으로, 지식의 여신은 쉽게 지식을 허락하지는 않지만 일단 한번 자신을 극복한 사람에 대해서는 보너스까지 덧붙여서 마구 퍼준다는 것이다. 한번 여신이 따뜻한 미소를 지으며 친밀감을 표시하는 순간 뜻밖의 선물을 받게 될 지도 모른다. 복잡하게 얽히고 섥혀 자신을 괴롭히던 많은 문제들이 한순간 제자리를 잡으며 머릿속에 정돈될 때 느끼는 환희는 어떤 것과도 바꿀수 없지만, 더불어 이제 지식의 여신은 자기가 가지고 있던 모든 것을 차례 차례 보여주기 시작할 것이다. 우리는 다시 아름다운 여신의 안내에 따라 미쳐 생각지도 못했던 것까지 친절한 설명을 듣게 되는 것이다. 하긴 요즘 쇼핑은 제품보다 경품이라는데 아까워서라도 쉽게 포기할 수는 없는 것이다.
게다가 한번 지식의 여신의 선물을 받아보게 되면 그것은 하나의 성공 체험이되어 자신에게 깊은 영향을 주게된다. 그것은 나이 어린 사람에게 일생을 좌우할 만한 중요한 경험이 되기도 한다. 후배를 가르쳐야 하는 입장이라면 어떤 식으로건 이러한 성공 체험을 할 수있도록 유도하는 것이 중요하다고 생각한다. 쓸 만한 후배라면 그 다음부터는 자기가 알아서 할 것이다.
이제 마지막으로 한가지 법칙만 남았다. 우리는 얼마간 그 여신의 방에서 즐거운 시간을 보내게 된다. 쾌적한 상태가 지속될수록 이제 떠나야 할 시간이 얼마남지 않았다는 것을 직감적으로 느끼게 된다. 프로젝트는 계속되어야 하는 것이다. 여태까지의 문제는 어느 정도 정리가 되었고 여신과의 작별인사도 이미 나누었으니 아쉬움을 뒤로하고 다시 걸음을 재촉할 수 밖에 없다. 잠시 여신과의 추억을 되새겨 보기도 한다. 하지만 무심코 코너를 돌아선 순간 우린 '악' 하는 비명과 함께 그 자리에 멈춰서고 만다. 지식에 관한 세번째 법칙, '지식의 여신은 코너를 돌면 또 나온다'. 새로운 얼굴의 여신이 또 길을 막아선 것이다. 아마도 뉴톤은 이 법칙을 너무나 잘 알고 있었기 때문에 자신은 진리의 바다에 이제 막 발목을 담구었을 뿐이라고 겸손을 보였던 모양이다.
[끝]
2001/06/15 나성언 (http://user.chollian.net/~lase) :현재는 폐쇄중입니다.
출처: http://ehclub.tistory.com/entry/%EC%A7%80%EC%8B%9D%EC%9D%98-%EC%97%AC%EC%8B%A0%EC%9D%80-%EC%89%BD%EA%B2%8C-%EC%98%B7%EC%9D%84-%EB%B2%97%EC%A7%80-%EC%95%8A%EB%8A%94%EB%8B%A4
잡담: 망하는(or 흥하는) 제품의 흔한 개발 과정
망하는 제품의 흔한 개발 과정
- 리더 : 요즘 유행하는 대세를 들고 온다. 이것이 대세다!
- 리더 : 속으로는 이런 것들을 쓰는 사람들은 사회부적응자라 생각하고 본인은 정작 써 본 적이 없다.
- 기획 : 써 본적은 없지만 들어는 봤다. 이런 것을 쓰는 사람은 격이 떨어지는 사람이라 생각하고, 내가 우아하고도 유럽 명품에 견줄 수 있는 것을 보여주어야 겠다 생각한다.
- 기획 : 해당 제품군을 모조리 조사한다. 그래서 해당 제품군의 모든 특징을 합한 고질라 같은 것을 그려 낸다.
- 리더 : 그것만으로는 뛰어 넘을 수 없다고 한다.
- 기획 : 아이디어를 동원한다. 이제 그 고질라에 스타워즈, 반지의 제왕, 해리포터를 더하기 시작한다. 자신의 상상력의 끝은 어디인가 하면서 스스로 놀라워 한다.
- 리더 : 고질라에서 빠진 게 없나 살핀다. 다소 억지 스럽지만, 비슷한류의 제품을 가져와 하나 더 붙인다. 이런게 바로 리더의 통찰력이라 으쓱거린다. 기획자의 아이디어를 보고는 기획자가 미쳐 생각하지 못한 경우의 수를 생각해서, 더 복잡하게 만든다. 아직 가르칠게 많다고 생각한다.
- 개발 : 그런건 못만들어요 불평을 늘어놓는다.
- 리더 : 내앞에서 안된다는 말은 하지 말라고 하며, 할 수 없다는 것부터 이야기하는 태도가 문제라고 한다. 그리고는, 자신의 인생 역정기를 늘어 놓는다.
- 개발 : 기획에 대한 조언을 해 줘야 겠다고 생각한다. (사실 해당 제품군을 사용해 본 유일한 사람이다.)
- 리더 : 넌 아직 인지과학, 심리학을 모른다고 일축한다.
- 기획 : 파워포인트로 찍어 내는 노가다를 시작한다.
- 리더 : 문서에서 오타를 찾아 낸다.
- 개발 : 이 프로젝트는 어짜피 산으로 갈 것이라고 떠들어 대기 시작한다.
- 리더 : 최근 세미나에서 본 솔루션들을 쓰면 금방 할 것이라고 말한다. 그리고 비싼 돈을 들여 도입을 추진한다.
- 개발 : 그게 뭔지 모른다. 다만, 대충 들어보니, 그것 보다는 자기간 만들어 놓은 자작 솔루션이 훨씬 더 좋은거라고 속으로 생각한다.(사실 지금 이 상황에 그걸 배워서 만드는 것은 엄두가 나지 않는다) 그리고, 쓰는 척 시늉만 하기로 결심한다. 타인이 만든 것을 사용하는 것은 하수들이나 하는 짓이라 생각한다.
- 리더 : 개발기간은 3개월이라 한다.
- 개발 : 불가능한 일정이라 하고, 기획안을 조정하라고 주장한다.
- 리더 : 나는 어찌 저런 무능하고 게으른 개발자만 옆에 있는지 탄식한다. 나에게 해외 유수기업의 개발자를 붙여주면 단박에 성공 할 수 있으리라 생각한다.
- 개발 : 투덜거리며 밤 샌다. 불행하게도 고질라를 만들어 내는 과정과 SF 가 붙여 지는 과정은 개발 과정 진행중에 병행해서 발행하는 일이다. 스타워즈를 다 붙여놓으면, 어느덧 스토리는 해리포터로 바뀌어 있다. 다시 밤을 샌다.
- 리더 : 3개월 후면 다 되어 있겠지 생각을 한다. 개발 과정에는 관심이 없다. 개발이 진행되는 중간 중간, 어제밤 자다가 생각난 환타스틱한 장면을 기획자에게 넣으라고 말한다. 이 장면을 놓쳤으면 이번 제품에 핵심이 빠졌을 거라고 생각하고, 이제라도 넣게 되어 다행이다 생각한다. 그리고, 자신이 얼마나 디테일에 강한가 다시 한번 생각해 본다.
- 개발 : 코드는 개떡이 되어 간다. 어짜피 이건 내탓이 아니다. 정말 제대로 된 환경에서 했다면, 난 정말 멋지게 해 낼 수 있었을 텐데, 운없이 이런 놈들이랑 팀을 해서 이렇게 된거라 생각한다. 이 제품은 내 손에서 나왔지만, 내가 만든건 아니라 생각한다.
- 리더 : 3개월후, 생각했던게 안나오자 개발자에게 책임 추궁을 해야겠다 생각한다. 처음부터 태도도 안좋았고, 자기가 말한 것을 구현해 낼 실력도 없었던 사람이었다 생각한다. 후회한다. 이 모든 것은 개발의 문제다. 하지만, 일단 출하한다.
- 기획 : 자신의 유럽 명품적 감각의 파워포인트를 어떻게 이런 제3세계 제품으로 만들어 냈는지 의아해 한다.
- 리더 : 다시 시작하자 으쌰 으쌰 해 본다. 그리고, 그 사이 대세가 바뀌지 않았다 살펴 본다.
- 개발 : 어짜피 이렇게 된거, 처음부터 다시 시작하자고 한다. 나는 다시 내가 만든 것을 들여다 보고 싶지 않다.
- 리더 : 역시 중요한 것은 사람이다 라고 생각한다.
흥하는 제품의 흔한 개발 과정
- 리더 : 자신에게 꼭 필요했던 핵심가치(기능)을 발견한다. 현존하는 타 제품에서는 발견할 수 없기에, 만들어야 겠다고 결심한다.
- 기획,개발 : 자신도 꼭 필요했던 것이라 생각하고, 만들면 정작 자신이 가장 큰 혜택을 받을 것이라 생각한다.
- 리더,기획,개발 : 다 같이 모여서 기존 제품들을 맹렬히 비판해 낸다. 왜 다 이렇게 될 수 밖에 없었는지 생각해 본다.
- 개발 : 관련된 기술을 조사한다. 그리고, 조사한 결과를 공유한다.
- 기획 : 수없이 많은 기술을 가지고, 두개의 연결(조합)을 시도한다. 전혀 상관없을 것이라 생각했던 두가지 기술을 합하니, 매우 멋진 모습이 되었다.
- 리더 : 이 멋진 조합이 핵심가치를 구현하는 결정적 요소가 아니면, 버리자고 한다. 핵심가치에만 촛점을 맞춘다.
- 개발 : 핵심가치를 구현할 가장 단순한 방법을 찾는다. 구현이 단순할 수록 생각치 못한 일이 발생할 가능성이 줄어 든다.
- 리더 : 개발된 시제품을 써 본다. 하루고 이틀이고 계속 써 본다. 불편한 점을 찾거나, 그 보다 더 단순하게 할 방법을 생각해 낸다.
- 개발 : 반복적으로 만들어 낸다. 구현 방법이 단순하였기에, 이 반복과정이 고통스럽지 않다. 이 반복과정을 더 쉽게 할 수 있는 방법을 계속 추가해 낸다.
- 기획 : 이 단순한 핵심가치를 제공하는 이 제품이 생각보다 많은 곳에서 응용될 수 있다는 것을 찾아 낸다.
- 리더 : 기쁘지만, 처음 생각한 것에 집중하기로 한다.
- 리더 : 충분히 만족스러운 상태가 되면 제품으로 출하한다. 충분히 고민한 것이기 때문에, 아주 오랫동안 다시 이 문제를 생각할 필요가 없을 거라 생각한다. 누군가 흉내내면서 새로운 것을 덧붙여 내거나 변형을 시켜내도 크게 신경 쓰지 않는다.
- 기획 : 현재까지 이룩한 것에서 최소한의 노력으로 추가할 수 있는 핵심가치를 다시 찾기 시작한다.
- 리더 : 역시 중요한 것은 사람이다 라고 생각한다.
출처: http://wangsy.com/blog/2012/01/how-to-make-totally-shitty-things/
2012년 4월 4일 수요일
html: example
BOX
source:
<TABLE CLASS="SCREEN" BGCOLOR="#DCDCDC" WIDTH="100%" ><TR><TD>
<PRE CLASS="SCREEN"><TT CLASS="COMPUTEROUTPUT" >
Disk geometry for /dev/hda: 0.000-9765.492 megabytes
Disk label type: msdos
Minor Start End Type Filesystem Flags
1 0.031 101.975 primary ext3 boot
2 101.975 611.850 primary linux-swap
3 611.851 760.891 primary ext3
4 760.891 9758.232 extended lba
5 760.922 9758.232 logical ext3
</TT></PRE></TD></TR></TABLE>
result:
source:
<TABLE CLASS="SCREEN" BGCOLOR="#DCDCDC" WIDTH="100%" ><TR><TD>
<PRE CLASS="SCREEN"><TT CLASS="COMPUTEROUTPUT" >
Disk geometry for /dev/hda: 0.000-9765.492 megabytes
Disk label type: msdos
Minor Start End Type Filesystem Flags
1 0.031 101.975 primary ext3 boot
2 101.975 611.850 primary linux-swap
3 611.851 760.891 primary ext3
4 760.891 9758.232 extended lba
5 760.922 9758.232 logical ext3
</TT></PRE></TD></TR></TABLE>
result:
Disk geometry for /dev/hda: 0.000-9765.492 megabytes Disk label type: msdos Minor Start End Type Filesystem Flags 1 0.031 101.975 primary ext3 boot 2 101.975 611.850 primary linux-swap 3 611.851 760.891 primary ext3 4 760.891 9758.232 extended lba 5 760.922 9758.232 logical ext3 |
AIX: kernel extention debug(how to make the dump file)
dump 파일 생성 #snap -ac/tmp/ibmsupt/dump 밑에 unix.Z와 dump.BZ (또는 dump.Z) 파일이 생성됨을 확인할 수 있다. 용량이 크므로 적절한 위치로 이동시킨후 압축을 푼다. #dmpuncompress dump.BZ #uncompress unix.Z unix 와 dump 파일이 생성됨을 확인 할 수 있다. kdb 로 디버깅 한다. #kdb dump unix |
solaris: get the system call error in the kernel
#define GET_ERRNO() ttolwp(curthread)->lwp_errno
#define SET_ERRNO(no) set_errno(no)
#define SET_ERRNO(no) set_errno(no)
solaris: 시스템 마운트 정보 가져오기
1 #include <stdio.h>
2 #include <sys/mnttab.h>
3 #include <sys/types.h>
4 #include <sys/statvfs.h>
5 int main()
6 {
7 FILE *fp = NULL;
8 struct mnttab mountEntry;
9 struct statvfs m;
10 int ret = 0;
11
12 fp = fopen("/etc/mnttab", "r");
13 if( fp )
14 {
15 while(getmntent(fp, &mountEntry) == 0 )
16 {
17 if( statvfs(mountEntry.mnt_mountp, &m))
18 continue;
19 if( m.f_blocks > 0 )
20 {
21 printf("name: %s ", mountEntry.mnt_mountp);
22 printf(" (free size: %d KB)\n", (int)(m.f_bavail * (m.f_bsize / 1024.0)));
23
24 }
25 }
26 }
27 fclose(fp);
28 }
2 #include <sys/mnttab.h>
3 #include <sys/types.h>
4 #include <sys/statvfs.h>
5 int main()
6 {
7 FILE *fp = NULL;
8 struct mnttab mountEntry;
9 struct statvfs m;
10 int ret = 0;
11
12 fp = fopen("/etc/mnttab", "r");
13 if( fp )
14 {
15 while(getmntent(fp, &mountEntry) == 0 )
16 {
17 if( statvfs(mountEntry.mnt_mountp, &m))
18 continue;
19 if( m.f_blocks > 0 )
20 {
21 printf("name: %s ", mountEntry.mnt_mountp);
22 printf(" (free size: %d KB)\n", (int)(m.f_bavail * (m.f_bsize / 1024.0)));
23
24 }
25 }
26 }
27 fclose(fp);
28 }
solaris: install gcc (solaris 9)
1. Freeware For Solaris http://www.sunfreeware.com
2. 오른쪽 위에 Sparc/Solaris 9 또는 Intel/Solaris 9이라되어있습니다.
자신의 기종에 맞는것을 클릭합니다. (Solaris 9)
3. 다시 오른쪽 아래를 보시면 패키지의 리스트가 보입니다. 여기서 gcc-최신버전을 클릭합니다.
4. 가운데 화면에서 파란색으로 gcc-최신버전.gz 을 클릭해 다운로드 받습니다.
5. 다운로드 받은 파일을 솔라리스 머신에 전송합니다. (ftp로 SUN에 upload한다.)
6. telnet으로 SUN에 접속하여 root권한으로 설치시작. 디렉토리로 가서 압축을 풉니다.
# gunzip gcc-파일명.gz 또는 # gzip -d gcc-파일명.gz
7. 패키지를 설치합니다. # pkgadd -d gcc-최신버전-sol8-intel-local
(처음에 물어보는 것 all 두 번째 물어보는 것 y라 치고 엔터를 치면됩니다)
이와 같이 설치시 특별히 명령어를 지정해주지 않으면 /usr/local/ 이하 디렉토리에 파일이
설치됩니다. 각각의 면모를 살펴봅시다.
/usr/local/bin - 컴파일러에 필요한 실행 프로그램들이 설치되는 디렉토리,
이후 몇몇 프로그램들은 이곳에 실행 파일을 설치합니다.
/usr/local/lib - 컴파일러의 라이브러리. 이후 각각의 라이브러리들의 기본 설치
디렉토리로 사용됨
/usr/local/include - /usr/local/lib에 저장된 라이브러리들의 헤더(header 확장자 .h)
들이 설치되는 장소
/usr/local/man - /usr/local/bin에 설치된 명령어의 메뉴얼이 있을 경우 매뉴얼 설치
저장소
/usr/local/doc - /usr/local/bin에 설치된 명령어의 도큐먼트가 있을 경우 설치되는
저장소
8-1. path 설정 및 link
방법1. # ln -s /usr/local/bin/gcc /usr/bin/gcc
이렇게 하면 시스템의 모든 사용자가 gcc 를 사용할 수 있습니다.
방법2. # vi /.profile
PATH=$PATH:/usr/local/bin
/.profile에 위 항목을 집어 넣으시면 root 는 gcc 를 사용할수 있지만 다른 사용자는
일일이 .profile 에 위 PATH 설정을 해주어야 합니다.
8-2. vi편집기를 이용해 PATH와 LD_LIBRARY_PATH를 수정합니다. 아래의 내용을 가장 아래에
추가합니다.
# vi /etc/profile
....
PATH=/usr/local/bin:$PATH
export PATH
LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:/usr/openwin/lib:/usr/openwin/bin:/usr/dt/lib:
/usr/ucblib
export LD_LIBRARY_PATH
* 주의사항: LD_LIBRARY_PATH에서 디렉토리 경로의 순서를 바꾸시면 안됩니다!
역시 PATH에서 /usr/local/bin이 앞에 나와야 합니다.
9. 확인
# gcc
No Input file
이렇게 나오면 정상
# gcc
ld.so.1 파일 없음이나 libiconv 파일이 없다고 나오는 경우에는 sunfreeware 에서
libiconv 파일을 다운 받은후 패키지 설치를 해준후 다시 테스트 해본다.
Q : ld.so.1: 열기 실패: 해당 파일이나 디렉토리가 없음
A : 동적 라이브러리(Dynamic Library; Shared Object라고 불리는 것입니다.)를 로드하지 못해서
발생한 문제입니다. 말 그대로 libASH.so 파일을 실행 시간에 찾지 못한 문제네요.
해당 파일을 찾아서 LD_LIBRARY_PATH에 추가해 주세요.
Q1: ld.so.1: ./gen_lex_hash: fatal: libstdc++.so.5: open faild: No such file of directory
A : ld.so.1 파일은 동적 라이브러리를 처리하는데 필요한 라이브러리입니다. 이 파일을 통해
라이브러리가 가지는 함수 또는 사용 방법을 알아냅니다.
그런데 영어를 해석해봤듯이 ld.so.1 파일이 libstdc++.so.5 파일 열기에 실패했다고 나옵니다.
실패 원인 파일이 없다고 나오는 군요. 이 파일은 라이브러리입니다. 파일이 있다면 라이브러리
패스를 추가해주면 될 것이고 없다면 저 라이브러리를 설치해줘야 합니다.
Q2: configure:6089:error:readline libarary not found
A : configure 시 에러가 뜬 경우 이군요 에러 코드 6089는 찾아보면 알겠지만 찾기 귀찮습니다.
그러나 에러에 대한 메시지가 나온는 군요. readline 라이브러리가 없다고 말입입니다.
설치해주면 되겠지요?
Q3: configure:error: no acceptable C cmpiler found in $PATH
A : configure failed for srclib/apr 에러 메시지를 봅니다. configure 실행시 C 컴파일러가
패스에서 찾을 수 없다는 군요. C 컴파일러가 설치 않된걸까요??
설치 않되어 있으면 컴파일러를 설치합니다.
만약 설치되어 있다면 env, printenv를 쳐서 환경 파일을 살펴봅니다.
컴파일러가 설치된 디렉토리를 패스에 추가해줬는지 찾아봐야겠군요... ^^;
Q4: #/usr/ccs/bin/make
make: Fatal error: No arguments to bulid
A : 보통 configure 를 실행 후 만들어 지는 파일은 여러가지가 있지만 그 중 가장 중요한 파일은
Makein 파일입니다. 이 파일이 만들어져 있지 않으면 make명령이 실행되지 않습니다.
Q5: 컴파일 중 al-local 어쩌고 저쩌고 나오면서 컴파일이 중지되는 경우가 있습니다.
A : 이런 경우 make 버전이 낮기 때문입니다. 최신의 make 패키지를 설치하시면 됩니다.
설치했는데도 이런 에러가 뜬다면 패스 경로상 /usr/ccs/bin/make 보다 /usr/local/bin/make
의 경로가 뒤에 있기 때문입니다.
직접 패스까지 쳐서 실행하시거나 패스의 경로를 /usr/local/bin 을 앞으로 옮기시면 됩니다.
[출처] 솔라리스 9 GCC 설치 하기|작성자 큐피트
2. 오른쪽 위에 Sparc/Solaris 9 또는 Intel/Solaris 9이라되어있습니다.
자신의 기종에 맞는것을 클릭합니다. (Solaris 9)
3. 다시 오른쪽 아래를 보시면 패키지의 리스트가 보입니다. 여기서 gcc-최신버전을 클릭합니다.
4. 가운데 화면에서 파란색으로 gcc-최신버전.gz 을 클릭해 다운로드 받습니다.
5. 다운로드 받은 파일을 솔라리스 머신에 전송합니다. (ftp로 SUN에 upload한다.)
6. telnet으로 SUN에 접속하여 root권한으로 설치시작. 디렉토리로 가서 압축을 풉니다.
# gunzip gcc-파일명.gz 또는 # gzip -d gcc-파일명.gz
7. 패키지를 설치합니다. # pkgadd -d gcc-최신버전-sol8-intel-local
(처음에 물어보는 것 all 두 번째 물어보는 것 y라 치고 엔터를 치면됩니다)
이와 같이 설치시 특별히 명령어를 지정해주지 않으면 /usr/local/ 이하 디렉토리에 파일이
설치됩니다. 각각의 면모를 살펴봅시다.
/usr/local/bin - 컴파일러에 필요한 실행 프로그램들이 설치되는 디렉토리,
이후 몇몇 프로그램들은 이곳에 실행 파일을 설치합니다.
/usr/local/lib - 컴파일러의 라이브러리. 이후 각각의 라이브러리들의 기본 설치
디렉토리로 사용됨
/usr/local/include - /usr/local/lib에 저장된 라이브러리들의 헤더(header 확장자 .h)
들이 설치되는 장소
/usr/local/man - /usr/local/bin에 설치된 명령어의 메뉴얼이 있을 경우 매뉴얼 설치
저장소
/usr/local/doc - /usr/local/bin에 설치된 명령어의 도큐먼트가 있을 경우 설치되는
저장소
8-1. path 설정 및 link
방법1. # ln -s /usr/local/bin/gcc /usr/bin/gcc
이렇게 하면 시스템의 모든 사용자가 gcc 를 사용할 수 있습니다.
방법2. # vi /.profile
PATH=$PATH:/usr/local/bin
/.profile에 위 항목을 집어 넣으시면 root 는 gcc 를 사용할수 있지만 다른 사용자는
일일이 .profile 에 위 PATH 설정을 해주어야 합니다.
8-2. vi편집기를 이용해 PATH와 LD_LIBRARY_PATH를 수정합니다. 아래의 내용을 가장 아래에
추가합니다.
# vi /etc/profile
....
PATH=/usr/local/bin:$PATH
export PATH
LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:/usr/openwin/lib:/usr/openwin/bin:/usr/dt/lib:
/usr/ucblib
export LD_LIBRARY_PATH
* 주의사항: LD_LIBRARY_PATH에서 디렉토리 경로의 순서를 바꾸시면 안됩니다!
역시 PATH에서 /usr/local/bin이 앞에 나와야 합니다.
9. 확인
# gcc
No Input file
이렇게 나오면 정상
# gcc
ld.so.1 파일 없음이나 libiconv 파일이 없다고 나오는 경우에는 sunfreeware 에서
libiconv 파일을 다운 받은후 패키지 설치를 해준후 다시 테스트 해본다.
Q : ld.so.1: 열기 실패: 해당 파일이나 디렉토리가 없음
A : 동적 라이브러리(Dynamic Library; Shared Object라고 불리는 것입니다.)를 로드하지 못해서
발생한 문제입니다. 말 그대로 libASH.so 파일을 실행 시간에 찾지 못한 문제네요.
해당 파일을 찾아서 LD_LIBRARY_PATH에 추가해 주세요.
Q1: ld.so.1: ./gen_lex_hash: fatal: libstdc++.so.5: open faild: No such file of directory
A : ld.so.1 파일은 동적 라이브러리를 처리하는데 필요한 라이브러리입니다. 이 파일을 통해
라이브러리가 가지는 함수 또는 사용 방법을 알아냅니다.
그런데 영어를 해석해봤듯이 ld.so.1 파일이 libstdc++.so.5 파일 열기에 실패했다고 나옵니다.
실패 원인 파일이 없다고 나오는 군요. 이 파일은 라이브러리입니다. 파일이 있다면 라이브러리
패스를 추가해주면 될 것이고 없다면 저 라이브러리를 설치해줘야 합니다.
Q2: configure:6089:error:readline libarary not found
A : configure 시 에러가 뜬 경우 이군요 에러 코드 6089는 찾아보면 알겠지만 찾기 귀찮습니다.
그러나 에러에 대한 메시지가 나온는 군요. readline 라이브러리가 없다고 말입입니다.
설치해주면 되겠지요?
Q3: configure:error: no acceptable C cmpiler found in $PATH
A : configure failed for srclib/apr 에러 메시지를 봅니다. configure 실행시 C 컴파일러가
패스에서 찾을 수 없다는 군요. C 컴파일러가 설치 않된걸까요??
설치 않되어 있으면 컴파일러를 설치합니다.
만약 설치되어 있다면 env, printenv를 쳐서 환경 파일을 살펴봅니다.
컴파일러가 설치된 디렉토리를 패스에 추가해줬는지 찾아봐야겠군요... ^^;
Q4: #/usr/ccs/bin/make
make: Fatal error: No arguments to bulid
A : 보통 configure 를 실행 후 만들어 지는 파일은 여러가지가 있지만 그 중 가장 중요한 파일은
Makein 파일입니다. 이 파일이 만들어져 있지 않으면 make명령이 실행되지 않습니다.
Q5: 컴파일 중 al-local 어쩌고 저쩌고 나오면서 컴파일이 중지되는 경우가 있습니다.
A : 이런 경우 make 버전이 낮기 때문입니다. 최신의 make 패키지를 설치하시면 됩니다.
설치했는데도 이런 에러가 뜬다면 패스 경로상 /usr/ccs/bin/make 보다 /usr/local/bin/make
의 경로가 뒤에 있기 때문입니다.
직접 패스까지 쳐서 실행하시거나 패스의 경로를 /usr/local/bin 을 앞으로 옮기시면 됩니다.
[출처] 솔라리스 9 GCC 설치 하기|작성자 큐피트
solaris: make the time-string in the kernel
커널 내부에서 time string을 만드는 방법
#define KOR_PARALLAX_SEC (32400) // 9 hour
static char *month_string[12] = { "Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"};
static int getoftime_kor(todinfo_t *tod)
{
time_t utc = 0;
if( tod == NULL )
return -1;
//get the current unix time
utc = ddi_get_time();
// 한국 시차를 생각하여 9시간을 플러스 한다.
utc = utc + KOR_PARALLAX_SEC;
// 년, 월, 일, 분, 초를 계산하여 tod 구조체를 설정 한다.
*tod = utc_to_tod(utc);
return 0;
}
#define KOR_PARALLAX_SEC (32400) // 9 hour
static char *month_string[12] = { "Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"};
static int getoftime_kor(todinfo_t *tod)
{
time_t utc = 0;
if( tod == NULL )
return -1;
//get the current unix time
utc = ddi_get_time();
// 한국 시차를 생각하여 9시간을 플러스 한다.
utc = utc + KOR_PARALLAX_SEC;
// 년, 월, 일, 분, 초를 계산하여 tod 구조체를 설정 한다.
*tod = utc_to_tod(utc);
return 0;
}
AIX: How to make packege on AIX
1. 가상의 mount point(디렉토리)에 설치할 파일들을 인스톨 (/usr/local/project_name의 bin, sbin에 설치한다고 가정)
2. 가상 mount point를 베이스 디렉토리로 하여 bff 메타 파일 생성 (최초에 한번만 생성)
- template 파일을 interative 한 방법으로 생성해두면 계속해서 사용할 수 있습니다.
$ mkinstallp -d tmp
Using tmp as the base package directory.
Cannot find tmp/.info. Attempting to create.
Using tmp/.info to store package control files.
Cleaning intermediate files from tmp/.info.
************************************************************
| Beginning interactive package input |
| * - required; () - example value; [] - default value |
************************************************************
* Package Name (xyz.net) []: Project.Name
* Package VRMF (1.0.0.0) []: 1.0.0.0
Update (Y/N) [N]: (return)
Number of Filesets in SVault.miAR (1) [1]: (return)
Gathering info for new fileset (1 remaining)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* Fileset Name (SVault.miAR.rte) []: Project.Name.rte
* Fileset VRMF (1.0.0.0) []: 1.0.0.0
* Fileset Description (some text) []: How To make packege on AIX
Do you want to include an installp pre_i script for this fileset? (Y/N) [N]: (return)
Do you want to include an installp post_i script for this fileset? (Y/N) [N]: (return)
Do you want to include an installp pre_rm script for this fileset? (Y/N) [N]: (return)
Do you want to include an installp config script for this fileset? (Y/N) [N]: (return)
Bosboot required (Y/N) [N]: (return)
License agreement acceptance required (Y/N) [N]: (return)
Include license files for SVault.miAR.rte in this package (Y/N) [N]: (return)
Do you want to specify Requisites using a file for this fileset? (Y/N) [N]: (return)
Number of Requisites for SVault.miAR.rte (1) [0]: (return)
Number of filesystems requiring additional space for SVault.miAR.rte [0]: (return)
You should include any directories that you are creating in the file count.
(ie: For /usr/proj/myFile, enter 2; 1 for /usr/proj and 1 for /usr/proj/myFile)
Number of USR part Files in SVault.miAR.rte (1) [0]: (return)
You should include any directories that you are creating in the file count.
(ie: For /etc/proj/myFile, enter 2; 1 for /etc/proj and 1 for /etc/proj/myFile)
Number of ROOT part files in SVault.miAR.rte (1) [0]: (return)
Would you like to create an empty ROOT part? (Y/N) [N]: (return)
Using tmp/.info/project.name.template as the template file.
Project.name 1.0.0.0
processing projec.name.rte
creating ./.info/liblpp.a
creating ./tmp/Project.name.1.0.0.0.bff
3. "tmp/.info/Project.name.template" 파일을 수정
(Linux-rpm의 .spec, HPUX의 .psf, solaris의 pkginfo/prototype와 같은 패키지를 위한 파일)
- 버전 넘버 수정 (버전 넘버는 x.x.x.x 의 형태만 가능하며 알파벳 허용 안 됨)
- USRFiles 부분에 설치될 파일을 추가
Package Name: Project.name.miAR
Package VRMF: 1.0.0.0
Update: N
Fileset
Fileset Name: Project.name.rte
Fileset VRMF: 1.0.0.0
Fileset Description: How to make pakege on AIX
Bosboot required: N
License agreement acceptance required: N
Include license files in this package: N
Requisites:
USRFiles
/usr/local/Project/bin/바이너리 파일들 추가
....
EOUSRFiles
ROOT Part: N
ROOTFiles
EOROOTFiles
EOFileset
4. template 파일을 이용해서 패키지를 생성한다.
$ mkinstallp -d tmp -T tmp/.info/Project.name.template
Using tmp as the base package directory.
Using tmp/.info to store package control files.
Cleaning intermediate files from tmp/.info.
Using tmp/.info/Project.name.template as the template file.
Project.name.
processing Project.name.rte
creating ./.info/liblpp.a
creating ./tmp/Project.name.bff
5. 설치 테스트
$ installp -a -d tmp/tmp/Project.name.1.0.0.0.bff all
6. 설치 확인
$ lslpp -L | grep Project.name
Project.name.rte 1.0.0.0 C F How to make pakege on AIX
7. 제거
$ installp -u Project.name
2. 가상 mount point를 베이스 디렉토리로 하여 bff 메타 파일 생성 (최초에 한번만 생성)
- template 파일을 interative 한 방법으로 생성해두면 계속해서 사용할 수 있습니다.
$ mkinstallp -d tmp
Using tmp as the base package directory.
Cannot find tmp/.info. Attempting to create.
Using tmp/.info to store package control files.
Cleaning intermediate files from tmp/.info.
************************************************************
| Beginning interactive package input |
| * - required; () - example value; [] - default value |
************************************************************
* Package Name (xyz.net) []: Project.Name
* Package VRMF (1.0.0.0) []: 1.0.0.0
Update (Y/N) [N]: (return)
Number of Filesets in SVault.miAR (1) [1]: (return)
Gathering info for new fileset (1 remaining)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* Fileset Name (SVault.miAR.rte) []: Project.Name.rte
* Fileset VRMF (1.0.0.0) []: 1.0.0.0
* Fileset Description (some text) []: How To make packege on AIX
Do you want to include an installp pre_i script for this fileset? (Y/N) [N]: (return)
Do you want to include an installp post_i script for this fileset? (Y/N) [N]: (return)
Do you want to include an installp pre_rm script for this fileset? (Y/N) [N]: (return)
Do you want to include an installp config script for this fileset? (Y/N) [N]: (return)
Bosboot required (Y/N) [N]: (return)
License agreement acceptance required (Y/N) [N]: (return)
Include license files for SVault.miAR.rte in this package (Y/N) [N]: (return)
Do you want to specify Requisites using a file for this fileset? (Y/N) [N]: (return)
Number of Requisites for SVault.miAR.rte (1) [0]: (return)
Number of filesystems requiring additional space for SVault.miAR.rte [0]: (return)
You should include any directories that you are creating in the file count.
(ie: For /usr/proj/myFile, enter 2; 1 for /usr/proj and 1 for /usr/proj/myFile)
Number of USR part Files in SVault.miAR.rte (1) [0]: (return)
You should include any directories that you are creating in the file count.
(ie: For /etc/proj/myFile, enter 2; 1 for /etc/proj and 1 for /etc/proj/myFile)
Number of ROOT part files in SVault.miAR.rte (1) [0]: (return)
Would you like to create an empty ROOT part? (Y/N) [N]: (return)
Using tmp/.info/project.name.template as the template file.
Project.name 1.0.0.0
processing projec.name.rte
creating ./.info/liblpp.a
creating ./tmp/Project.name.1.0.0.0.bff
3. "tmp/.info/Project.name.template" 파일을 수정
(Linux-rpm의 .spec, HPUX의 .psf, solaris의 pkginfo/prototype와 같은 패키지를 위한 파일)
- 버전 넘버 수정 (버전 넘버는 x.x.x.x 의 형태만 가능하며 알파벳 허용 안 됨)
- USRFiles 부분에 설치될 파일을 추가
Package Name: Project.name.miAR
Package VRMF: 1.0.0.0
Update: N
Fileset
Fileset Name: Project.name.rte
Fileset VRMF: 1.0.0.0
Fileset Description: How to make pakege on AIX
Bosboot required: N
License agreement acceptance required: N
Include license files in this package: N
Requisites:
USRFiles
/usr/local/Project/bin/바이너리 파일들 추가
....
EOUSRFiles
ROOT Part: N
ROOTFiles
EOROOTFiles
EOFileset
4. template 파일을 이용해서 패키지를 생성한다.
$ mkinstallp -d tmp -T tmp/.info/Project.name.template
Using tmp as the base package directory.
Using tmp/.info to store package control files.
Cleaning intermediate files from tmp/.info.
Using tmp/.info/Project.name.template as the template file.
Project.name.
processing Project.name.rte
creating ./.info/liblpp.a
creating ./tmp/Project.name.bff
5. 설치 테스트
$ installp -a -d tmp/tmp/Project.name.1.0.0.0.bff all
6. 설치 확인
$ lslpp -L | grep Project.name
Project.name.rte 1.0.0.0 C F How to make pakege on AIX
7. 제거
$ installp -u Project.name
2012년 4월 3일 화요일
AIX: 32bit -> 64bit
change of kernel mode on AIX
32 bit -> 64 bit
# ln -sf /usr/lib/boot/unix_64/unix
# ln -sf /usr/lib/boot/unix_64/usr/lib/boot/unix
# bosboot -ad /dev/ipldevice
# shutdown -r
64 bit -> 32 bit
# ln -sf /usr/lib/boot/unix_mp/unix
# ln -sf /usr/lib/boot/unix_mp/usr/lib/boot/unix
# bosboot -ad /dev/ipldevice
# shutdown -r
출처: http://msnote.tistory.com/category/How%20to./IBM%20AIX
32 bit -> 64 bit
# ln -sf /usr/lib/boot/unix_64/unix
# ln -sf /usr/lib/boot/unix_64/usr/lib/boot/unix
# bosboot -ad /dev/ipldevice
# shutdown -r
64 bit -> 32 bit
# ln -sf /usr/lib/boot/unix_mp/unix
# ln -sf /usr/lib/boot/unix_mp/usr/lib/boot/unix
# bosboot -ad /dev/ipldevice
# shutdown -r
출처: http://msnote.tistory.com/category/How%20to./IBM%20AIX
hpux: aio_write()
man: aio_write
The aiocbp is already in use for another asynchronous I/O operation.
Once the write operation request has been enqueued by aio_write(), all of the errors normally reported by the write() function and the following errors may be reported asynchronously and returned in a subsequent call to aio_error() or aio_return() referencing the aiocb supplied in the successful aio_write() call.
error code:
[EBADF]
The aiocbp->aio_fildes was not a valid file descriptor open for writing.
[EINVAL]
The aiocb->aio_sigevent is not a valid address in the process virtual address space.
[EINVAL]
The parameters of the indicated sigevent in aiocb->aio_sigevent are invalid.
[EINVAL]
The value of aiocbp->aio_reqprio is not valid.
[EINVAL]
The value of aiocbp->aio_nbytes is invalid.
[EINVAL]
The file offset implied by aiocbp->aio_offset or aiocbp->aio_offset+ aiocbp->aio_nbytes are not valid for the file at the time the request is processed.
[ECANCELED]
The write operation was canceled due to a subsequent call to aio_cancel() referencing the same aiocb that was used to start the operation.
EXAMPLE
The following code sequence and call to aio_write() starts an asynchronous write operation.
#include
#include
#include
char buf[4096];
int retval;
ssize_t nbytes;
struct aiocb myaiocb;
bzero( &myaiocb, sizeof (struct aiocb));
bzero( &buf, sizeof (buf));
myaiocb.aio_fildes = open( "/dev/null", O_RDWR); myaiocb.aio_offset = 0;
myaiocb.aio_buf = (void *) buf;
myaiocb.aio_nbytes = sizeof (buf);
myaiocb.aio_sigevent.sigev_notify = SIGEV_NONE; retval = aio_write( &myaiocb );
if (retval) perror("aio_write:");
/* continue processing */
...
/* wait for completion */
while ( (retval = aio_error( &myaiocb) ) == EINPROGRESS) ;
/* free the aiocb */
nbytes = aio_return( &myaiocb);
The aiocbp is already in use for another asynchronous I/O operation.
Once the write operation request has been enqueued by aio_write(), all of the errors normally reported by the write() function and the following errors may be reported asynchronously and returned in a subsequent call to aio_error() or aio_return() referencing the aiocb supplied in the successful aio_write() call.
error code:
[EBADF]
The aiocbp->aio_fildes was not a valid file descriptor open for writing.
[EINVAL]
The aiocb->aio_sigevent is not a valid address in the process virtual address space.
[EINVAL]
The parameters of the indicated sigevent in aiocb->aio_sigevent are invalid.
[EINVAL]
The value of aiocbp->aio_reqprio is not valid.
[EINVAL]
The value of aiocbp->aio_nbytes is invalid.
[EINVAL]
The file offset implied by aiocbp->aio_offset or aiocbp->aio_offset+ aiocbp->aio_nbytes are not valid for the file at the time the request is processed.
[ECANCELED]
The write operation was canceled due to a subsequent call to aio_cancel() referencing the same aiocb that was used to start the operation.
EXAMPLE
The following code sequence and call to aio_write() starts an asynchronous write operation.
#include
#include
#include
char buf[4096];
int retval;
ssize_t nbytes;
struct aiocb myaiocb;
bzero( &myaiocb, sizeof (struct aiocb));
bzero( &buf, sizeof (buf));
myaiocb.aio_fildes = open( "/dev/null", O_RDWR); myaiocb.aio_offset = 0;
myaiocb.aio_buf = (void *) buf;
myaiocb.aio_nbytes = sizeof (buf);
myaiocb.aio_sigevent.sigev_notify = SIGEV_NONE; retval = aio_write( &myaiocb );
if (retval) perror("aio_write:");
/* continue processing */
...
/* wait for completion */
while ( (retval = aio_error( &myaiocb) ) == EINPROGRESS) ;
/* free the aiocb */
nbytes = aio_return( &myaiocb);
solaris: understand the init level
Solaris - understand the init level
init s or S = single user mode/ console
init 0 = firmware level
init 1 = all the local FS will be mounted. Only root can login . Similar to init 1 in LINUX
init 2 = multi user mode only
init 3 = multi user mode with network
init 4 = not in use
init 5 = shutdown
init 6 = reboot
check current init level
bash-3.00# who -r
run-level 3 Jun 30 00:28 3 0 S
init s or S = single user mode/ console
init 0 = firmware level
init 1 = all the local FS will be mounted. Only root can login . Similar to init 1 in LINUX
init 2 = multi user mode only
init 3 = multi user mode with network
init 4 = not in use
init 5 = shutdown
init 6 = reboot
check current init level
bash-3.00# who -r
run-level 3 Jun 30 00:28 3 0 S
OS별 시스템 정보 확인
the installed operating system name
AIX, Solaris, HP-UX
# uname -s
the installed operating system version
AIX
# oslevel
Solaris, HP-UX
# uname -r
model name
AIX
# lsattr -E -l sys0 | awk '/modelname/ {print $2}'
Solaris
# uname -i
HP-UX
# uname -m
CPU information
number of CPU
AIX
# lsdev -Cc processor | wc -l
Solaris
# psrinfo | wc -l
HP-UX
# ioscan -fknC processor | grep processor | wc -l
clock
AIX
# value=`lscfg -vp | grep "PS=" | head -1 | awk -F"PS=" '{print $2}' | awk -F"," '{print $1}'`
# value="0x$value"
# value=`printf "%dn" $value`
# expr $value / 1000000
Solaris
# psrinfo -v `psrinfo | awk '{print $1}' | head -1` | awk '/operates/ {print $6}'
HP-UX
# echo itick_per_user/D | adb -k /stand/vmunix /dev/mem | tail -1 | awk '{print $2}'
memory
number of memory
AIX
# lsdev -C | grep -i memory | wc -l
size of memory
AIX
# lsattr -E -l mem0 -a size | awk '{print $2}'
Solaris
# prtconf | awk '/Memory size/ {print $3}'
HP-UX
# value=`dmesg | grep Physical | grep Kbytes | awk '{print $2}'`
# expr $value / 1024
disk
number of disk
AIX
# lsdev -Cc disk | wc -l
Solaris
# format <<-! > /tmp/format.dat
> 0
> q
> !
# cat /tmp/format.dat | grep cyl | wc -l
HP-UX
# ioscan -fknC disk | grep disk | grep -v "CD-ROM" | grep -v "DVD-ROM" | wc -l
size of disk
AIX
# lspv hdisk0 | grep "TOTAL PPs" | awk -F"(" '{print $2}' | awk '{print $1}'
Solaris
# bps=`prtvtoc /dev/dsk/c0t0d0s0 | grep "bytes/sector" | awk '{print $2}'`
# sectors=`prtvtoc /dev/dsk/c0t0d0s0 | grep -v "*" | grep "^ *2" | awk '{print $5}'`
# bc -l << !
> scale=0
> $sectors * $bps / 1024 / 1024
> !
HP-UX
# hwpath=`ioscan -fknC disk | grep disk | grep -v "CD-ROM" | grep -v "DVD-ROM" | head -1`
# name=`ioscan -fkn -H $hwpath | grep "/rdsk/" | awk '{print $2}'`
# value=`diskinfo $name | awk '/size:/ {print $2}'`
# expr $value / 1024
check the AIX hadware bit
#bootinfo -y
check the AIX kernel bit
#bootinfo -K
information of system on AIX
#prtconf | head
AIX, Solaris, HP-UX
# uname -s
the installed operating system version
AIX
# oslevel
Solaris, HP-UX
# uname -r
model name
AIX
# lsattr -E -l sys0 | awk '/modelname/ {print $2}'
Solaris
# uname -i
HP-UX
# uname -m
CPU information
number of CPU
AIX
# lsdev -Cc processor | wc -l
Solaris
# psrinfo | wc -l
HP-UX
# ioscan -fknC processor | grep processor | wc -l
clock
AIX
# value=`lscfg -vp | grep "PS=" | head -1 | awk -F"PS=" '{print $2}' | awk -F"," '{print $1}'`
# value="0x$value"
# value=`printf "%dn" $value`
# expr $value / 1000000
Solaris
# psrinfo -v `psrinfo | awk '{print $1}' | head -1` | awk '/operates/ {print $6}'
HP-UX
# echo itick_per_user/D | adb -k /stand/vmunix /dev/mem | tail -1 | awk '{print $2}'
memory
number of memory
AIX
# lsdev -C | grep -i memory | wc -l
size of memory
AIX
# lsattr -E -l mem0 -a size | awk '{print $2}'
Solaris
# prtconf | awk '/Memory size/ {print $3}'
HP-UX
# value=`dmesg | grep Physical | grep Kbytes | awk '{print $2}'`
# expr $value / 1024
disk
number of disk
AIX
# lsdev -Cc disk | wc -l
Solaris
# format <<-! > /tmp/format.dat
> 0
> q
> !
# cat /tmp/format.dat | grep cyl | wc -l
HP-UX
# ioscan -fknC disk | grep disk | grep -v "CD-ROM" | grep -v "DVD-ROM" | wc -l
size of disk
AIX
# lspv hdisk0 | grep "TOTAL PPs" | awk -F"(" '{print $2}' | awk '{print $1}'
Solaris
# bps=`prtvtoc /dev/dsk/c0t0d0s0 | grep "bytes/sector" | awk '{print $2}'`
# sectors=`prtvtoc /dev/dsk/c0t0d0s0 | grep -v "*" | grep "^ *2" | awk '{print $5}'`
# bc -l << !
> scale=0
> $sectors * $bps / 1024 / 1024
> !
HP-UX
# hwpath=`ioscan -fknC disk | grep disk | grep -v "CD-ROM" | grep -v "DVD-ROM" | head -1`
# name=`ioscan -fkn -H $hwpath | grep "/rdsk/" | awk '{print $2}'`
# value=`diskinfo $name | awk '/size:/ {print $2}'`
# expr $value / 1024
check the AIX hadware bit
#bootinfo -y
check the AIX kernel bit
#bootinfo -K
information of system on AIX
#prtconf | head
피드 구독하기:
글 (Atom)