반응형

리눅스 커널 버젼 3.13 이후로는 최초 빌드시에 아래와 같은 오류가 발생합니다.

 

scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: No such file or directory
compilation terminated.

 

이 문제는 openssl 관련된 라이브러리가 없어서 생기는 에러로서 그 이전에는 자체 커널 소스에 있는 API를 사용하다가 3.13 이후에는 외부의 libssl 라이브러리를 사용하게 됩니다.

 

이는 보안관련된 이슈가 생기면서 발생한 이슈라고 합니다. 특히 4.13 버젼이후로는 TLS도 지원한다고 하니 보다 보안이 강력한 kernel을 사용하고 싶다면 4.13버젼을 사용하는 것도 좋을 거 같습니다.

 

 apt-get install libssl-dev

 

이렇게 사용하게 되면 위에 발생한 오류를 해결할 수 있다는 점 확인해 주시기 바랍니다.

※ 크립토 API (Crypto API)는 리눅스 커널에서 사용하는 암호 프레임워크이며, IPsec과 dm-crypt와 같은 암호화된 데이터를 다루는 부분에서 사용한다. 리눅스 커널 버전 2.5.45에서 최초로 도입되었으며 자주 사용되는 블록 암호와 해시 함수를 포함하기 위해 확장되고 있다

 

반응형
반응형

설치하기

 

파이썬의 아나콘다는 Continuum Analytics라는 곳에서 만든 파이썬 배포판으로, 445개 정도의 파이썬 패키지를 포함하고 있습니다. 또한 상업용으로도 무료로 사용할 수 있으므로 회사 내에서도 사용할 수 있다는 장점이 있습니다.

 

먼저 아나콘다 배포판을 설치하기 위해 다음 URL로 이동합니다. 파이썬은 현재 2.7 버전과 3.5 버전이 있는데, 파이썬 3.5를 사용합니다.

 

https://www.continuum.io/downloads

 

파이썬 3.5 버전에도 다시 윈도우 64비트용 설치 파일과 32비트용 설치 파일이 있습니다. 보통은 사용 중인 PC에 64비트 윈도우가 설치돼 있으면 64비트용 설치 파일을 내려받고, 32비트 윈도우가 설치돼 있다면 32비트용 설치 파일을 내려받으면 됩니다.

 

그러나 국내 증권사 API를 정상적으로 사용하려면 반드시 32비트용 설치 파일을 클릭해서 내려받아야 합니다. 특별한 경우가 아니라면 파이썬 3.5 32비트용 설치 파일을 내려받기 바랍니다.

 

들여쓰기

 

파이썬은 다른 프로그래밍 언어와 달리 들여쓰기(indent)에 매우 민감한 언어입니다. 보통 C나C++ 같은 다른 프로그래밍 언어는 '{'와 '}' 같은 기호를 사용해 코드가 수행되는 영역을 표시합니다. 그렇지만 '{'와 '}' 기호는 초보자가 보기에는 조금 어려워 보입니다. 그리고 C나 C++ 같은 프로그래밍 언어는 사실 띄어쓰기가 없이도 코딩할 수 있으므로 코드 자체는 수행되지만 사람들이 코드를 보고 이해하기가 어려울 수 있습니다.

 

"나는아침을먹고학교에갔는데오늘은학교개교기념일이었다."


우리의 모국어인 한국어도 위와 같이 띄어쓰기 없이 붙여서 쓰면 정말 읽기가 어렵죠? 프로그램도 마찬가지입니다. 프로그램을 작성할 때는 작성한 코드에 적당한 띄어쓰기를 해야 가독성이 좋아진답니다(코드들 읽기 쉽다는 뜻입니다).

 

파이썬은 {와 } 기호 없이 들여쓰기로만 영역을 나타내기 때문에 항상 조심해서 들여쓰기해야 합니다. 예를 들어, 파이썬 IDLE에서 한 칸 공백을 주고(키보드의 스페이스 바를 누르면 됩니다) 명령어 코드를 작성하면 정상적으로 수행되지 않습니다.

 

아직은 잘 모르겠지만 '파이썬에서는 띄어쓰기가 정말 중요하다'라는 점을 꼭 기억하기 바랍니다. 사실 저도 파이썬을 처음 배울 때는 언제 띄어쓰기를 하고 언제는 하지 말아야 할지 판단하기가 어려웠는데, 이는 파이썬 문법에 좀 더 익숙해지면 저절로 해결되는 문제입니다.

 

앞으로 파이썬 IDLE에서 프로그래밍할 때 'Indent'라는 단어가 포함된 오류 메시지가 나타나면 띄어쓰기에 문제가 있는지 코드를 확인해보기 바랍니다.

 

 

반응형
반응형

이번에는 리눅스(우분투)환경에서 리눅스 컴파일 하는 방법에 대해서 알아보고자 합니다.

 

1) 커널 소스코드 다운받기

 

리눅스 커널 소스코드는 http://www.kernel.org 사이트에서 다운로드가 가능합니다.

 

 

현재 가장 최신 stable 버젼은 4.14.4인 만큼 해당 버전을 다운받아서 설치 해보도록 하겠습니다.

 

 root@ubuntu:/work# wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.tar.xz
--2017-12-10 15:51:23--  https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.tar.xz
Resolving www.kernel.org (www.kernel.org)... 147.75.110.187, 2604:1380:3000:3500::3
Connecting to www.kernel.org (www.kernel.org)|147.75.110.187|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 100770500 (96M) [application/x-xz]
Saving to: ‘linux-4.14.tar.xz’

linux-4.14.tar.xz      100%[==========================>]  96.10M   244KB/s    in 7m 3s

2017-12-10 15:58:28 (232 KB/s) - ‘linux-4.14.tar.xz’ saved [100770500/100770500]

 

다음과 같이 wget 명령어를 이용해서 커널 소스코드를 다운 받을 수 있습니다.

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.tar.x

명령어를 이용하여 커널소스를 다운을 받고 압축을 해제 합니다.

 

tar xvf linux-4.14.tar.xz

 

2) 리눅스 커널 컴파일을 위한 패키지 설치 

#apt-get install kernel-package
#apt-get install build-essential bin86
#apt-get install libncurses5-dev
 

 

3) 커널 설정파일 가져오기

커널을 컴파일하기 위해서는 관련된 설정파일을 셋팅을 사전에 해야 합니다.

우선 /boot 폴더에 있는 현재 시스템의 config 설정을 가져 옵니다.

물론 처음부터 세팅을 할 수 도 있지만... 그건 너무 무모하고 힘든 작업 일수 있기 때문에 현재 시스템의 설정을 가져와서 목적에 맡게 수정할 것을 권고 해 드립니다.

 

# cp /boot/config-4.4.0-87-generic ./.config

# make menuconfig

 

이렇게 설정을 하게 되면 최종 모든 설정이 끝나게 됩니다.

 

4) 커널 컴파일하기

 

사전에 필수 패키지를 잘 설치했으면 make-kpkg 란 tool이 정상적으로 설치가 되었을 겁니다. make-kpkg는 커널 소스를 컴파일 하고 타겟에 맞게 결과물을 생성합니다.

 

root@ubuntu:/work/linux-4.14# make-kpkg --initrd --revision=1.0 kernel_image kernel_headers
exec make kpkg_version=13.018 -f /usr/share/kernel-package/ruleset/minimal.mk debian DEBIAN_REVISION=1.0  INITRD=YES
====== making target debian/stamp/conf/minimal_debian [new prereqs: ]======
This is kernel package version 13.018.
test -d debian             || mkdir debian
test ! -e stamp-building || rm -f stamp-building
install -p -m 755 /usr/share/kernel-package/rules debian/rules
for file in ChangeLog  Control  Control.bin86 config templates.in rules; do                                      \
            cp -f  /usr/share/kernel-package/$file ./debian/;                               \
        done
cp: cannot stat '/usr/share/kernel-package/ChangeLog': No such file or directory
for dir  in Config docs examples ruleset scripts pkg po;  do                                      \
          cp -af /usr/share/kernel-package/$dir  ./debian/;        

 

5) 커널 설치하기

 

마지막으로

 

dpkg -i *.deb 를 수행 하게 되면 해당 커널이 마치게 됩니다.

반응형
반응형

VIP는 하나의 호스트에 여러 개의 IP주소를 할당하는 기술이다. 이 기술을 이용하면, 하나의 네트워크 인터페이스에 여러 개의 IP 주소를 줄 수 있다. 바깥에서는 마치 하나 이상의 네트워크 인터페이스가 있는 것으로 보일 것이다.

VIP는 흔히 HA나 로드밸런싱을 위해서 널리 사용된다.

 

 

반응형

'인프라 구축 기술' 카테고리의 다른 글

SSD 와 HDD  (0) 2019.09.16
RAID 와 HBA 카드 (2)  (0) 2017.11.13
RAID 와 HBA 카드 (1)  (0) 2017.11.07
메모리의 종류 (UDIMM, RDIMM, RLDIMM, NVDIMM)  (0) 2017.10.23
Xeon(제온) CPU는 ??  (0) 2017.10.21
반응형

시스템 호출 구현

 

<목적 정의 >

→ 이 시스템 콜의 중요 목적을 정의해야 한다. 가장 안좋은 예로는 ioctl() 함수를 들수있다 (이와 관련된 추가 설명은... 나중에)

<가능한 적은 개수의 인자사용, 깔끔하고 간단한 인터페이스>

<시간이 흐름에 따라 함수가 어떻게 바뀔지 예상하는 일...>

<방법을 제공해야지 정책을 제공하면 안된다>

 

매개변수 검사

시스템 호출은 모든 매개변수가 유효하고 적당한지 주의깊게 확인해야 한다.

가장 중요한 확인작업중 하나는 사용자가 제공한 포인터의 유효성을 확인하는 것이다.

  • 포인터는 사용자 공간의 메모리영역을 가르키고 있어야한다.
    →프로세스는 커널을 속이고 직접 커널 공간의 데이터를 읽어서는 안된다.
  • 포인터는 프로세스 주소공간의 메모리 영역을 가르키고 있어야 한다
  • 읽는 경우라면 해당 메모리가 읽기 가능상태, 쓰는 경우라면 메모리가 쓰기 가능상태 실행하는 경우면 실행 가능상태
    → 프로세스가 메모리 접근 제한을 우회하면 안된다.

커널은 필요한 확인 작업을 수행하고 원하는 내용을 사용자 공간으로 가져오는 방법을 2가지 제공한다.

 

1. copy_to_user() : 사용자 주소 공간의 src에 있는 데이터를 복사

→ 매개변수 : 1 - 프로세스 주소공간의 목적지 메모리 주소, 2 - 커널공간의 원본 포인터, 3- 복사할 데이터의 바이트 크기

2. copy_to from() : 커널 공간에 있는 데이터를 사용자 주소 공간으로 복사

 

시스템 호출 컨텍스트

: 시스템 호출을 실행하는 동안 커널은 프로세스 컨텍스트 상태에 있다.

current 포인터는 시스콜을 호출한 프로세스인 현재 태스크릴 지칭

 

프로세스 컨택스트에서 커널은,

 1. 휴면 상태가 될 수 있으며

 2. 완전히 선점이 가능하다.

 

1. 휴면상태가 될 수 있다는 것은 시스템 호출이 커널의 대다수 기능을 사용할 수 있다는 의미

2. 프로세스 컨텍스트가 선점 가능하다는 사실은 사용자 공간고 마찬가지로 다른 작업에 선점 될 수 있다는 의미

 

→ 새로운 작업이 같은 시스템 호출을 실행할 수 있기 때문에 시스템 호출은 재진입이 가능해야 한다.

 

시스템 호출이 끝나고 반환되면 제어 권한은 system_call() 함수로 넘어가고 이 함수는 결국 사용자 공간으로 전환시켜 사용자 프로세스의 실행이 재개된다.

 

시스템 호출 등록의 마지막 단계

  1. 시스템 호출 테이즐의 마지막에 항목을 추가, 시스템 호출을 지원하는 모든 아키텍처에 대해 이 작업을 수행
  2. 지원하는 모든 아키텍처의 시스콜 번호를 <asm/unistd.h> 파일에 정의
  3. 시스콜을 커널 이미지로 컴파일 한다. (Full compile)

시스템 호출의 장/단점 그리고 대안

 

장점

  • 구현이 간단하고 사용이 쉽다
  • 성능이 빠르다

단점

  • 공식적으로 할당된 시스콜 번호가 필요
  • 유연성이 떨어진다. 사용자 프로그램에 영향이 발생
  • 아키텍처별로 별도로 관리해야 한다.
  • 파일시스템에서 접근이 힘들다
  • 주 커널 트리 외부에서 시스템 호출을 관리하기 어렵다

대안

  • 장치노드를 구현하고 read(), write() 함수를 해당 장치에 호출, ioctl() 사용
  • 세마포어 같은 일부 인터페이스는 파일 서술자 형태로 표현 가능
  • sysfs, proc상의 적당한 위치에 파일로 정보를 남긴다.

 

반응형
반응형

시스템 호출 핸들러

 

사용자 공간의 애플리케이션은 직접 커널 코드를 호출할 수 없다

대신 사용자 공간 애플리케이션은 어떻게든 실행하고 싶은 시스템 호출이 있다는 것을 커널에 알려서 시스템을 커널모드로 전환해야 애플리케이션을 대신해 커널공간에서 시스템 호출을 실행할 수 있다.

 

커널에 신호를 보내는 방법으로 소프트웽어 인터럽트라는 방법을 사용한다

→ 예외(exception)가 발생하면 시스템은 커널 모드로 전환 되고 예외 처리기 (exception handler)가 실행된다. 소프트웨어 인터럽트의  경우 시스템 호출 핸들러가 예외 처리기가 된다

 

시스템 호출 핸들러는 그 역할에 걸맞은 이름을 가진 system_call() 한수로 구현되어 있으며 아키텍처별로 따로 구현이되고 x86-64는 entry_64.S 파일에 어셈블리어로 구현되어 있다. 시스템 호출 핸들러가 어떤 방식으로 호출되든, 중요한 사실은 사용자 공간에서 커널로 진입하려면 어떤 방법으로든 예외를 방생 시켜야 한다.

 

매개변수 전달

 

대부분의 시스콜은 시스템 호출 번호와 함께 하나 이상의 매개변수(Parameter)가 필요하다. 어떻게 해서든 예외 발생과정에서 매개변수를 사용자 공간에서 커널로 전달 해야 한다. 가장 쉬운 방법은 시스콜 번호를 전달 하는 것과 같은 방법으로 매개변수를 레지스터에 저장하는 것이다

총 5개의 매게변수를 레지스터에 저장가능하며 여섯개 이상의 인자를 사용하는 경우에는 모든 매개변수가 저장된 사용자 공간의 주소를 가르키는 포인터 값을 하나의 레지스터에 저장한다.

 

 

 

 

반응형

+ Recent posts