awk '{print substr(값, 시작위치, 잘라낼문자갯수)}' [FileName]



Posted by cyj4369
,

LVM에서 VG구성했던 USB없이 VG삭제하는 방법

vgreduce --force --removemissing [vg이름]

'Embedded Lab > linux, x86' 카테고리의 다른 글

[쉘 스크립트에서 숫자연산]  (0) 2013.01.31
[awk에서 substr쓰기]  (0) 2013.01.31
[apt-get 자세한 사용법]  (0) 2013.01.29
[리눅스 RAM 확인하기]  (0) 2013.01.09
[ioctl시 CPU관점에서 커널 lock]  (0) 2013.01.08
Posted by cyj4369
,

yum = apt-get
rpm = dpkg

소스리스트 업데이트                   : apt-get update
설치된 패키지 업데이트               : apt-get upgrade

패키지 설치                               :  apt-get install <package name>

패키지 제거                               :  apt-get --purge remove <package name>
패키지 검색                               :  apt-cache search <package name>
패키지 정보보기                         : apt-cache show <package name>
의존성 파일들 강제로 설치해두기  : apt-get -f install 

패키지 삭제와 설정지우기           : apt-get --purge autoremove

의존성 검사 수행하며 패키지 업데이트                 :apt-get -s dist-upgrade
 

deb 파일 설치                            : dpkg -i <file name.deb>
패키지 제거                               : dpkg -P <package name>
설치된 패키지 리스트                  : dpkg -l
설치된 패키지에 포함된 파일 보기 : dpkg -L <package name>
deb파일 포함된 파일들 보기         : dpkg -c <file name.deb>
deb파일의 정보보기                    : dpkg -I <file name.deb>
파일의 패키지명 알아내기            : dpkg -S <file name>
 

istall 로 설치된 
/var/cache/apt/archives/ 비우기

apt-get clean

apt-get autoclean


강제삭제
dpkg --force-all -r 패키지명
 
강제설치
dpkg --force-architecture -i 패키지명

시스템 아키텍쳐 확인(32비트,64비트)
dpkg --print-architecture 

apt-get 설치중 
apt-get install -f 에러가 난다면 그대로 쳐주자

apt-get install -f 

 
패키지검색
aptitude search 패키지명 

패키지를 재설치 하게될때는
apt-get install 명령어로 받은 deb 파일의 저장 위치
 /var/cache/apt/archives/ 에 .deb 패키지파일로 저장되어있으니
해당경로로 이동하여 dpkg -i 패키지로 재설치 해주자 

http://ftp.de.debian.org/debian/pool/main/  에서 패키지를 다운받을수도 있다.
 


아래와같이 하위프로세스가 시그널에 의해서 죽었다는 메세지가 뜨면 강제로 재설치해주자

dpkg: error processing /var/cache/apt/archives/gpgv_1.4.10-4_i386.deb (--unpack):

trying to overwrite '/usr/bin/gpgv', which is also in package gnupg 1.4.1-1.sarge3

dpkg-deb: subprocess paste killed by signal (Broken pipe)

Errors were encountered while processing:

 /var/cache/apt/archives/gpgv_1.4.10-4_i386.deb

E: Sub-process /usr/bin/dpkg returned an error code (1)

# dpkg -i --force-overwrite gpgv_1.4.10-4_i386.deb 


설치중에 libapt-pkg4.10 관련되서 에러가 뜨면 

Reading package lists... Done

Building dependency tree       

Reading state information... Done

You might want to run `apt-get -f install' to correct these:

The following packages have unmet dependencies:

  apt-utils: Depends: libapt-pkg4.10

  libapt-pkg-perl: Depends: libapt-pkg4.10

E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution)

아래 주소에서 패키지 다운받고 설치해주자

# wget http://ftp.br.debian.org/debian/pool/main/a/apt/apt_0.8.10.3+squeeze1_i386.deb 

# dpkg -i apt_0.8.10.3+squeeze1_i386.deb 




출처 : http://cdral.tistory.com/778

Posted by cyj4369
,

1. lshw 를 사용하여 하드웨어 상세 정보 확인(링크 참조)

- lshw 는 rpm 패키지를 별도로 설치해야됨

참고글 : http://jonnychoe.egloos.com/5549359

2. dmidecode 
- 설치할 필요없음
- dmidecode 명령은 서버 하드웨어, 바이오스 정보를 system DMI 테이블에서 읽어온다.
시스템의 현재 configuration 상태뿐만 아니라 최대 지원가능한 설정 정보까지도 불러온다.
예를 들어, 시스템의 현재 RAM 정보와 최대 확장가능한 RAM 정보까지도 확인할 수 있다.

dmidecode 의 output 형태는 다음과 같다.
Record Header: Handle {record id}, DMI type {dmi type id}, {record size} bytes
Record Value: {multi line record value}
  • record id: Unique identifier for every record in the DMI table.
  • dmi type id: Type of the record. i.e BIOS, Memory etc.,
  • record size: Size of the record in the DMI table.
  • multi line record values: Multi line record value for that specific DMI type.

dmidecode 명령의 output 예 :

# dmidecode | head -15

# dmidecode 2.9
SMBIOS 2.3 present.
56 structures occupying 1977 bytes.
Table at 0x000FB320.

Handle 0xDA00, DMI type 218, 11 bytes
OEM-specific Type
        Header and Data:
                DA 0B 00 DA B0 00 17 03 08 28 00

Handle 0x0000, DMI type 0, 20 bytes
BIOS Information
        Vendor: Dell Computer Corporation
        Version: A07
        Release Date: 01/13/2004

DMI 테이블의 레코드 갯수를 보기위해서는 

# dmidecode | grep ^Handle | wc -l
56

(or)

# dmidecode | grep structures
56 structures occupying 1977 bytes.

DMI Types

시스템의 CPU 정보를 보기위해서는 type id 4 옵션을 dmidecode 명령과 함께 준다.

# dmidecode -t 4
# dmidecode 2.9
SMBIOS 2.3 present.

Handle 0x0400, DMI type 4, 35 bytes
Processor Information
        Socket Designation: Processor 1
        Type: Central Processor
        Family: Xeon
        Manufacturer: Intel
        ID: 29 0F 00 00 FF FB EB BF
        Signature: Type 0, Family 15, Model 2, Stepping 9
        Flags:
                FPU (Floating-point unit on-chip)
                VME (Virtual mode extension)
                DE (Debugging extension)
                PSE (Page size extension)
                TSC (Time stamp counter)
                MSR (Model specific registers)

DMI type 은 아래와 같다.

Type   Information
       ----------------------------------------
          0   BIOS
          1   System
          2   Base Board
          3   Chassis
          4   Processor
          5   Memory Controller
          6   Memory Module
          7   Cache
          8   Port Connector
          9   System Slots
         10   On Board Devices
         11   OEM Strings
         12   System Configuration Options
         13   BIOS Language
         14   Group Associations
         15   System Event Log
         16   Physical Memory Array
         17   Memory Device
         18   32-bit Memory Error
         19   Memory Array Mapped Address
         20   Memory Device Mapped Address
         21   Built-in Pointing Device
         22   Portable Battery
         23   System Reset
         24   Hardware Security
         25   System Power Controls
         26   Voltage Probe
         27   Cooling Device
         28   Temperature Probe
         29   Electrical Current Probe
         30   Out-of-band Remote Access
         31   Boot Integrity Services
         32   System Boot
         33   64-bit Memory Error
         34   Management Device
         35   Management Device Component
         36   Management Device Threshold Data
         37   Memory Channel
         38   IPMI Device
         39   Power Supply

또한, type id 를 입력하는 대신에 키워드를 사용할 수도 있다.

다음은 사용가능한 키워드이다.

       Keyword     Types
       ------------------------------
       bios        0, 13
       system      1, 12, 15, 23, 32
       baseboard   2, 10
       chassis     3
       processor   4
       memory      5, 6, 16, 17
       cache       7
       connector   8
       slot        9

type id 2 와 10 에 대한 정보를 보기 위해 키워드 baseboard 를 사용한 예

# dmidecode -t baseboard
# dmidecode 2.9
SMBIOS 2.3 present.

Handle 0x0200, DMI type 2, 9 bytes
Base Board Information
        Manufacturer: Dell Computer Corporation
        Product Name: 123456
        Version: A05
        Serial Number: ..CN123456789098.

Handle 0x0A00, DMI type 10, 14 bytes
On Board Device 1 Information
        Type: SCSI Controller
        Status: Enabled
        Description: LSI Logic 53C1030 Ultra 320 SCSI
On Board Device 2 Information
        Type: SCSI Controller
        Status: Enabled
        Description: LSI Logic 53C1030 Ultra 320 SCSI
On Board Device 3 Information
        Type: Video
        Status: Enabled
        Description: ATI Rage XL PCI Video
On Board Device 4 Information
        Type: Ethernet
        Status: Enabled
        Description: Broadcom Gigabit Ethernet 1
On Board Device 5 Information
        Type: Ethernet
        Status: Enabled
        Description: Broadcom Gigabit Ethernet 2


dmicode 를 사용하여 RAM(Physical Memory) 에 대한 정보 확인하기

시스템에서 지원가능한 최대 RAM 크기는 얼마인가? 
아래 예는 최대 RAM 크기가 8GB 임을 보여준다.

# dmidecode -t 16
# dmidecode 2.9
SMBIOS 2.3 present.

Handle 0x1000, DMI type 16, 15 bytes
Physical Memory Array
        Location: System Board Or Motherboard
        Use: System Memory
        Error Correction Type: Multi-bit ECC
        Maximum Capacity: 8 GB
        Error Information Handle: Not Provided
        Number Of Devices: 4

메모리를 얼마나 확장할 수 있는지 를 확인하기 위해 /proc/meminfo 명령을 사용하여 현재 메모리 총량을 확인할 수 있다.

# grep MemTotal /proc/meminfo
MemTotal:      1034644 kB

위 예는 현재 시스템이 1 GB 메모리를 가지고 있음을 확인할 수 있지만, 이것이 1GB 1개인지, 512MB 2개인지, 256MB 4개인지는 알 수가 없다.

dmidecode 명령을 사용하여 memory 슬롯에서 각각 사용되고 있는 RAM  크기를 알 수 있다.

아래 예는 memory slot  이 4개이며, 현재 슬롯 1,2 에 512 MB RAM 이 각각 장착되어 있음을 확인할 수 있다.

# dmidecode -t 17
# dmidecode 2.9
SMBIOS 2.3 present.

Handle 0x1100, DMI type 17, 23 bytes
Memory Device
        Array Handle: 0x1000
        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 64 bits
        Size: 512 MB  [Note: Slot1 has 512 MB RAM]
        Form Factor: DIMM
        Set: 1
        Locator: DIMM_1A
        Bank Locator: Not Specified
        Type: DDR
        Type Detail: Synchronous
        Speed: 266 MHz (3.8 ns)

Handle 0x1101, DMI type 17, 23 bytes
Memory Device
        Array Handle: 0x1000
        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 64 bits
        Size: 512 MB [Note: Slot2 has 512 MB RAM]
        Form Factor: DIMM
        Set: 1
        Locator: DIMM_1B
        Bank Locator: Not Specified
        Type: DDR
        Type Detail: Synchronous
        Speed: 266 MHz (3.8 ns)

Handle 0x1102, DMI type 17, 23 bytes
Memory Device
        Array Handle: 0x1000
        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 64 bits
        Size: No Module Installed [Note: Slot3 is empty]
        Form Factor: DIMM
        Set: 2
        Locator: DIMM_2A
        Bank Locator: Not Specified
        Type: DDR
        Type Detail: Synchronous
        Speed: 266 MHz (3.8 ns)

Handle 0x1103, DMI type 17, 23 bytes
Memory Device
        Array Handle: 0x1000

        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 64 bits
        Size: No Module Installed [Note: Slot4 is empty]
        Form Factor: DIMM
        Set: 2
        Locator: DIMM_2B
        Bank Locator: Not Specified
        Type: DDR
        Type Detail: Synchronous
        Speed: 266 MHz (3.8 ns)


BIOS information 확인하기

# dmidecode -t bios
# dmidecode 2.9
SMBIOS 2.3 present.

Handle 0x0000, DMI type 0, 20 bytes
BIOS Information
        Vendor: Dell Computer Corporation
        Version: A07
        Release Date: 01/13/2004
        Address: 0xF0000
        Runtime Size: 64 kB
        ROM Size: 4096 kB
        Characteristics:
                ISA is supported
                PCI is supported
                PNP is supported
                BIOS is upgradeable
                BIOS shadowing is allowed
                ESCD support is available
                Boot from CD is supported
                Selectable boot is supported
                EDD is supported
                Japanese floppy for Toshiba 1.2 MB is supported (int 13h)
                5.25"/360 KB floppy services are supported (int 13h)
                5.25"/1.2 MB floppy services are supported (int 13h)
                3.5"/720 KB floppy services are supported (int 13h)
                8042 keyboard services are supported (int 9h)
                Serial services are supported (int 14h)
                CGA/mono video services are supported (int 10h)
                ACPI is supported
                USB legacy is supported
                LS-120 boot is supported
                BIOS boot specification is supported
                Function key-initiated network boot is supported

Handle 0x0D00, DMI type 13, 22 bytes
BIOS Language Information
        Installable Languages: 1
                en|US|iso8859-1
        Currently Installed Language: en|US|iso8859-1


장비의 Manufacturer, Model 과 Serial number 확인하기

# dmidecode -t system
# dmidecode 2.9
SMBIOS 2.3 present.

Handle 0x0100, DMI type 1, 25 bytes
System Information
        Manufacturer: Dell Computer Corporation
        Product Name: PowerEdge 1750
        Version: Not Specified
        Serial Number: 1234567
        UUID: 4123454C-4123-1123-8123-12345603431
        Wake-up Type: Power Switch

Handle 0x0C00, DMI type 12, 5 bytes
System Configuration Options
        Option 1: NVRAM_CLR:  Clear user settable NVRAM areas and set defaults
        Option 2: PASSWD:  Close to enable password

Handle 0x2000, DMI type 32, 11 bytes
System Boot Information
        Status: No errors detected


Posted by cyj4369
,

제공 : 한빛 네트워크
저자 : 한동훈 

Linux Scalability Effort 
http://sourceforge.net/project/showfiles.php?group_id=8875 
: 락은 동기화를 위해 필요하지만 수행 성능에 큰 저하를 가져온다. 

적절히 무시할 수 있는 센스 
http://minjang.egloos.com/1094167 
: 위의 블로그에도 써 있는 것처럼 무시할 수 있다면 무시하는 것이 더 좋다. 

위 소스포지 사이트는 리눅스 커널의 수행성능을 끌어올리기 위해 커널에서 사용되는 다양한 잠금(lock)을 제거하는 패치로 이뤄져 있다. 커널 2.2와 2.4를 대상으로 하고 있는 커널 패치이다. 위 프로젝트는 현재 중단되었으며, 프로젝트의 내용들은 대부분 커널 2.6에 포함되었다. 어떤 식으로 커널의 잠금을 제거하거나 성능 향상을 이뤄냈는지 살펴보기엔 귀중한 소스이다. 중단된 프로젝트라해도 오픈된 채로 남겨두면 누군가에겐 도움이 된다. 특히, 커널을 공부하는 입장에서는...(실제로, 소스포지에는 RTLinux 패치도 여전히 남아있다. 리얼타임 패치의 대부분은 커널에 사용된 잠금 구조를 제거하는 것으로 이뤄져있다. RTLinux 패치의 일부분이었던 O(1) 스케줄러는 현재 커널 2.6에 포함되어 있다) 

커널의 잠금을 제거하고, 수행성능을 최적화하기 위한 시도는 커널 2.4에서 2.6으로 넘어가는 동안에도 이뤄졌다. 

커널 2.4에서는 빅 커널 락(Big Kernel Lock, BKL)이 있다. 커널 2.4는 CPU가 커널 영역에서 실행하기 위해 BKL을 획득하는 구조였다. 즉, CPU0이 BKL을 획득하고 커널 영역에서 실행중이라면 다른 CPU들은 커널 영역에 진입할 수 없었다. CPU0가 커널 영역에서 실행되는 동안에는 CPU1은 사용자 프로세스를 실행하던가, 사용자 프로세스도 다 실행해버려서 다른 프로세스로 전환하기 커널 영역에 진입해야 한다면 CPU0이 커널 영역에서 볼일 다 볼 때까지 손가락 빨고 있어야하는 구조인 것이다. 물론, 커널 영역에서의 실행은 대부분 매우 짧지만 커널 영역 선점을 위해 CPU들이 경쟁하는 경우엔 비효율적인 구조였다. 장점은 잠금 메커니즘이 매우 단순하게 구현되기 때문에 커널 개발자 입장에서 매우 편하다는 것이다. 하지만, CPU 개수가 늘어나면 늘어날수록 커널 영역 진입을 위한 경쟁은 심화될 수 밖에 없었다. 따라서, 커널 2.6부터는 CPU0이 커널 영역에서 실행되고 있더라도 CPU1이 CPU0의 커널영역 제어권을 뺏어올 수 있게 되었다. 이를 커널 선점(Kernel Preemption)이라 부른다. 

커널 2.6에서는 BKL의 상당부분을 제거하고, 세마포어(semaphore, 원어로는 세머퍼라 읽는다), 스핀락(spinlock)을 이용하는 구조로 전환하였다. 이는 BKL에 비하면 커널 선점을 허용하면서 잠금을 관리하는 데 들어가는 비용이 낮다. 커널 2.6은 BKL을 완전히 제거하지는 못했다. 그저, 상당부분을 제거했을 뿐이다. 

[참고] 커널 선점을 허용하기 위한 잠금 메커니즘은 매우 복잡하며, 이로 인해 시스템에 있는 버그를 발견하는 것이 더 어렵게 되었다며, 커널 선점을 사용하지 않게 커널을 설정할 것을 권하며 논쟁이 되었던 적도 있다. 

Linux: Debating The Merits Of Kernel Preemption 
http://kerneltrap.org/node/3966 
또한, 잠금을 아예 하지 않으면서 동기화를 이루기 위한 구조로 RCU(Read-Copy-Update) 구조를 도입했다. 

CPU0이 A라는 데이터를 접근하고 있고, CPU1이 A를 접근해서 데이터를 수정해버리면 RCU에서는 A'을 생성한다. 이때는 시스템에 A와 A'이 동시에 존재하게 된다. 이때 CPU2가 A를 접근하게 되면 RCU에 등록된 연결리스트를 타고 A'에 접근하게 된다. 시간이 경과해서 CPU0이 A라는 데이터를 더 이상 접근하지 않게 되면 RCU에서는 A를 완전히 제거하게 된다. 

A라는 구조체에는 참조 카운팅을 관리하는 멤버도 갖지 않는다. 이 말은 내가 A 구조체의 참조 카운팅을 관리하기 위한 루틴을 작성하지 않아도 되는 것을 의미하고, A 구조체의 잠금을 관리하기 위한 루틴을 작성하지 않아도 되는 것을 의미한다. A라는 자료의 동기화는 오직 RCU에 의존해서 수행된다. 

A와 A'이 동시에 존재하는 상황에서 A를 제거하는 시점은 시스템 내의 모든 CPU들이 프로세스 전환이 발생하거나 대기(idle) 상태가 되는 경우가 일정 횟수 이상 발생하면 A를 참조하지 않는다는 것을 알 수 있다. 물론, 이때도 A'은 여전히 참조하고 있는 것이다. 이렇게 되면 시스템은 모두 업데이트된 A'을 참조하게 되고, 데이터 무결성을 보장할 수 있게 된다. 

말은 쉽지만 복잡하다. 구현이 시작되고, 커널의 메인라인에 포함되기까지 거의 2년이 걸린 것으로 알고 있다. (거의 2년으로 알고 있음. 그만큼 구현하기 어렵고, 테스트하기 어렵다는 의미가 아닐까. 지금은 만들어져서 널리 쓰이고 있으므로 커널 개발자들은 RCU 관련 API들을 가져다 쓰기만 하면 된다) 

[참고] RCU는 여러번 수정하는 것도 허용한다. 이때는 A가 A', A'이 A'', A''이 A'''으로 변경되는 구조이며, 앞에서 얘기한 특정한 조건이 만족되면 리스트를 따라 A, A', A''을 시스템에서 제거하고, 모든 수정이 반영된 A'''만 남게 된다. 
RCU는 현재 커널 전반에서 널리 쓰이고 있으며, RCU로 대체할 수 있다면 RCU로 모두 대체하고 있는 중이다. RCU가 쓰이는 곳으로는 IP 라우팅, 가상 파일 시스템에서의 덴트리 등이다. 

그러나, 사람들은 여전히 이것에 만족하지 않으며, 보다 많은 커널 잠금을 제거해서 최대한의 성능을 내려고 하고 있다. 

많은 사람들이 최적의 성능을 위해 끊임없이 머리를 짜내서 만들어 놓고도 지칠 줄 모르는지 그 위에 더 나은 성능을 내기 위해 노력하고 있다. 

커널 2.4 -> 2.6의 큰 변화에 대해서는 다음의 발표자료가 참고가 된다.(2004. 1월 자료) 

Linux 2.6 Performance in the Corporate Data Center 
ftp://www6.software.ibm.com/software/developer/library/os-ltc-kernel/2.6-datacenter.pdf 

커널에서 동기화를 위한 프로그래밍은 상당히 어려웠고, 커널 개발자들은 동기화 메커니즘을 테스트하기 위한 다양한 코드를 만들어왔다. 그리고, 이러한 코드들을 모아서 Kernel Lock Validator라 이름 붙였고, 커널 2.6.17 이후부터 포함되었다 

관심있는 분들이라면 아래 사이트의 내용을 참고하면 좋을 것이다. 

The kernel lock validator 
http://lwn.net/Articles/185666/ 

KLV를 들여다보면 락 메커니즘을 테스트하기 위한 코드를 어떻게 작성해야 하는지 이해할 수 있지 않을까.











커널 2.6.36에서는 file_operations 에서 ioctl 이 제거되었고
대신에 unlocked_ioctl 과 compat_ioctl 이 사용되게 되었다.

unlocked_ioctl 과 compat_ioctl 은 2.6.11 에서 처음 추가되었는데 그 이유는 BKL 이슈에 대한 것때문이다.
BKL 은 Big Kernel Lock 의 약자인데 커널에서 락을 이용하지 않게 하려는 시도가 꾸준히 있어왔다.

그 이유는 커널에서 특히 SMP 구조에서 락에 들어가는 비용이 너무 많기 때문이며, 효율적으로 사용하기 위해서다.
그런 이유로 도입된 것이 RCU(read copy update) 이다.

어쨋든 ioctl 이 호출되면 커널 락이 수행되고 자동적으로 SMP 구조에서는 비효율을 가져오고 있었다.
그래서 사용되는 것이 unlocked_ioctl 이다.

쉽게 얘기해서 모든 CPU에 대해서 lock 을 걸던것을 개별적인 lock 을 걸수 있게끔 바꾼것이다.

Posted by cyj4369
,

* more 명령어.

 

$ more [-dlfpcsu] [-숫자] [+/ 패턴] [+ 행번호] [파일명]

[사용 예]

h : more 상태애서 사용할 수 있는 키 도움말 확인.
스페이스 바 : 다음페이지 이동하기.
엔터 : 현재행에서 다음 줄로 이동하기.
q : more 명령어 종료하기.
f : 다음페이지로 이동하기
b : 이전페이지로 이동하기.
= : 현재위치에서 행번호 표시하기
/문자열 : 지정한 문자열 검색
n : /문자열로 검색한 문자열을 순서대로 계속찾기
!쉘명령어 : more 명령어 상태에서 쉘 명령어 실행하기
v : more 명령어로 열려있는 파일의 현재 위치에서 vi 실행하기


* wc

특정 파일의 바이트 수, 단어 수, 행수를 카운트 하는 명령어

wc [옵션][파일]

-L 지정한 파일 내에서 가장 긴 행의 길이를 출력한다.
l지정한 파일의 행 수만을 출력한다.
m 지정한 파일의 문자수만을 출력한다.
c지정한 파일의 바이트수만을 출력한다.
w지정한 수의 단어 수만을 출력한다.


------쉘 명령 후 출력 결과의 라인 세기------

다음과 같이 하면된다.

#pvdisplay |grep UUID |wc -l

Posted by cyj4369
,

흔한 함정에 빠졌다..

리눅스 커널에서 C라이브러리를 사용하려고 했다. 바로 stdlib.h ...

아래는 웹서핑으로 발견한 글,..



얼마전 커널에서 동작하는 간단한 프로그램을 만들었다.
컴파일 하는데..앵.. 왠걸.. 엄청난 애러가 났다.

kernel/syscall_interpret/auditex_string.c:1:20: error: stdlib.h: No such file or directory

결론부터 말하면 kernel 에서는 stdlib 들을 사용할 수 없다.
standard library 는 glibc 에 연동되어서 돌아가는데, kernel 에서는 이를 이용할 수 없기 때문이다.
따라서 kernel 쪽에서는 이를 대비한 간단한 lib들을 따로 재공 하고 있는데 그 위치는 컴파일 환경마다 다르겠지만 보통 다음과 같다.

linux-버전명\lib



출처 http://decdream.tistory.com/63




해결방법은 아래와 같다

execute a shell command from kernel

Submitted by maat
on December 18, 2005 - 1:24am

hi,
i am trying to run a shell command from kernel with the function do_execve, but i get always the error "no a file or directory". follow is the code.
############# code #####################
char *cmd[]={//set the command to be use
/*"sh",*/
"-c",
"ls /",
NULL
};

char *env[]={ //set the environment
"HOME=/",
"PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/sawacom/bin",
"SHELL=/bin/bash",
"TERM=xterm",
NULL
};

struct pt_regs *regs;

int a= do_execve("sh", cmd, env, regs); //execute the shell command

printk("<1>##### a=%d #####\n",a);
################# end code ########################
perhaps someone can tell me what i am doing wrong.

thanks

tried with full path?

strcmp
on
December 18, 2005 - 3:06am

Like execve() in user space do_execve() may want the absolute path of the file to execute (execlp is not a syscall..). In your case "/bin/sh" instead of "sh". In fact, what the error "no a file or directory" says is exactly "you passed the wrong file name"...

Posted by cyj4369
,

아래 과정이 자동으로 수행되어야 함.

-보드에서 lvm2설치 불가 문제 발생시 apt-get을 업데이트 해본다.
#apt-get update

-device mapper가 없어서 LVM이 안되는 경우

menuconfig에서 Device Driver ->  Multiple devices driver support에서 필요한 모듈을 포함하는 것으로 설정


-설치해야 할 것들
#apt-get install lvm2 ntfsprogs

1)LVM NTFS 포맷, LVM 생성 및 마운트
USB를 꼽고 생성된 장치파일(예... /dev/sda, sdb, sdc)의 파티션(예... /dev/sda1, sdb1, sdc1)을 Linux LVM으로 포맷
#fdisk /dev/sda
d 명령으로 파티션 삭제, n 명령으로 파티션 생성, t 명령으로 포맷(Linux LVM 키워드는 8e)

PV생성
#pvcreate /dev/sda1
#pvcreate /dev/sdb1
#pvcreate /dev/sdc1
생성확인 : #pvdisplay

VG로 묶음(예... 이름 : vg_test) (참고...한 개의 USB로도 VG 생성 가능)
#vgcreate vg_test /dev/sda1 /dev/sdb1
또는 확장으로도 가능
#vgextend vg_test /dev/sdc1
생성확인 : #vgdisplay

LV생성(예... 이름 : lv_test, VG용량 : 15.68G) (참고...LV용량은 VG용량을 벗어날 수 없음)
#lvcreate -L 15G -n lv_test vg_test
생성확인 : #lvdisplay

NTFS로 포맷
#mkfs.ntfs /dev/vg_test/lv_test

포맷한 파일시스템 마운트(예... 경로 : /media/test)
#mount -t ntfs /dev/vg_test/lv_test /media/test
마운트 확인 : #df


2) LVM 확장
새로운 USB의 Linux LVM포맷 및 PV생성
#fdisk /dev/sdd
#pvcreate /dev/sdd1

VG확장
#vgextend vg_test /dev/sdd1
확장 확인 : #vgdisplay

LV 확장
#lvresize --size +4G /dev/vg_test/lv_test
확장 확인 : #lvdisplay

파일시스템에 확장된 용량 적용
언마운트

#umount /media/test

NTFS 체크

#ntfsck /dev/test_vg/test_vg1

NTFS 리사이즈

#ntfsresize /dev/test_vg/test_vg1


다시 마운트 시키고 용량 확인

#mount -t ntfs /dev/vg_test/lv_test /media/test

#df

Posted by cyj4369
,

보통 command line 명령어를 프로그램 상에서 실행 시키려고 할때는 보통

 pid = fork();

 switch(pid)
 {
  case -1:
   return -1;

  case 0:   /* child process */
   execlp();

   break;

  }

 do
 {
  child_pid = waitpid(pid, (int *)0, WNOHANG);
  usleep(10000); // 10ms delay
 }while( child_pid == 0 );

이런 코드를 사용하여 처리 하곤 한다.

그런데 이런방법으로는 '>'를 사용해야하는 명령어가 처리가 되지 않는다는것을 알았다.

이를테면 ls -al > ls.txt 라는 명령어는 실행이 되지 않는다는 것이다.

 

그래서 다른 방법이 없을까 찾아본 결과 system() 이라는 함수를 발견하게 되었다.

 

밑에글 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/3/system

1.1. 사용법

#include <stdlib.h>

int system(const char *string);
		


1.2. 설명

system() 함수는 /bin/sh -c string를 호출하여 string에 지정된 명령어를 실행하고, 명령어가 끝난후 반환한다. 명령어가 실행동안, SIGCHLD는 블럭되며, SIGINT, SIGQUIT는 무시된다. system() 함수는 기본적으로 fork()와 execve()의 조합응용이다.


1.3. 반환값

만약 /bin/sh를 실행시키기 위한 execve()의 호출이 실패했다면 127이 리턴되며, 다른 에러가 있다면 -1, 그렇지 않다면 명령어의 리턴코드가 반환된다.

string값이 NULL이고, system()이 shell을 이용할 수 있다면 0이 아닌 값을 그렇지 않다면 0을 반환한다.

system()은 다른 wait()상태의 다른 자식에게 영향을 주지 않는다.


1.4. 예제

#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    int i = 0;
	int retval;
    retval = system("ls -al");
    printf("Exit Status %d\n", retval);
}
		

 

Posted by cyj4369
,

유저레벨에서 커널에 있는 API 를 동작시키는 인터페이스는 시스템 콜로써 항상 사용되는 것이다.

하지만 커널 레벨에서 사용자 공간의 어플리케이션을 실행하는 것은 그다지 알려져 있지 않다.


하지만 가만히 생각해 보면 핫플러그인과 같이 USB 가 꼽히면 자동으로 마운트되는 것을 우리는 알고 있다.

과연 어플리케이션에서 주기적으로 USB 꼽힌 것을 체크해서 마운트 하는 것일까?

그렇지 않다.

커널 레벨에서 USB가 인식되면 종류에 따라 마운트를 시켜주는 함수가 실행되게 된다.

혹은 모듈이 필요하면 모듈까지도 로딩을 시켜준다.

이런 인터페이스가 가능한 커널 함수를 소개한다.


그 인터페이시의 이름은 usermodehelper API 이다.

그 API를 한번 살펴보면 

usermod 헬퍼 API 핵심함수

call_usermodehelper_setup 사용자 지역 호출을 위한 핸들러 준비

call_usermodehelper_setkeys 헬퍼의 세션 키 설정

call_usermodehelper_setcleanup 헬퍼의 정리 함수 설정

call_usermodehelper_stdinpipe 헬퍼의 stdin 파이프 작성

call_usermodehelper_exec 사용자 지역 호출 호출


이정도로 구성되어 있다.


자료구조를 살펴보면 

kernel/kmod.c#L117 

 117struct subprocess_info {

 118        struct work_struct work;

 119        struct completion *complete;

 120        char *path;

 121        char **argv;

 122        char **envp;

 123        struct key *ring;

 124        enum umh_wait wait;

 125        int retval;

 126        struct file *stdin;

 127        void (*cleanup)(char **argv, char **envp);

 128};

의외로 아주 간단한 구조를 갖고 있다.


이제 사용자 모드 헬퍼 API 의 내부구조를 살펴보자.



kernel_execve 를 사용하여 커널 공간 커널모듈 로더로 사용하는 구현을 한다.

kernel_execve 는 부팅시 init 프로세스를 시작하는데 사용되는 함수이며 사용자 모드 헬퍼 API는 사용하지 않는다.





#include <linux/kmod.h> 추가 -->  call_usermodehelper() 함수 사용가능!!

 

< call_usermodehelper : 커널에서 유저레벨 응용프로그램 실행하게 해줌!! >


static int umh_test( void )
{
 char *argv[] = { "/usr/bin/logger", "help!", NULL };
 static char *envp[] = {
"HOME=/",
"TERM=linux",
"PATH=/sbin:/bin:/usr/sbin:/usr/bin", NULL };ㅓㅓ

 return call_usermodehelper( argv[0], argv, envp, UMH_WAIT_PROC );
}
마치 사용자 프로그램에서 main 프로그램의 변형을 보는 것 같다.
위의 에제를 실행함에 있어 빠진 것들이 있다.
일반적으로 사용자 환경에서 실행될때 shell 에서 해주는 역할들이 없기 때문에
signal 처리, 세션 키 링 설정, stdio 파이프 설치등 모든 설정을 envp 에 일일이 해주어야 한다는 것이다.
위의 예제가 logger 가 아니라 printf("hello world\n"); 를 실행하는 예제라면
"hello world" 라는 문구를 볼수 없다.  왜냐하면 stdio pipe 를 연결하지 않았기 때문이다.
logger 는 /var/log/messages 안에서 내용을 살펴보면 실행 여부를 확인할수 있다.

Posted by cyj4369
,