4/30/2020

VS Code Extension

1. VS Code 기본기능사용법  

VS Code의 기능소개 및 각 Tool 기능 
특히 단축키 부분
  https://ahyuo79.blogspot.com/2020/02/visual-studio-code.html

우선 VS Code 기반으로 설치해서 진행하면 Code 관리 및 문서작성도 쉽게 관리가 되어서 편리하다.
요즘 느끼는것은 Eclipse보다 좀 더 편하다고 생각되는데, 다만 VS Code가 node.js 기반이라 그런지 잘 죽는 경향이 있다. 

VS Code는 MS에 개발했지만, Linux에서도 잘돌아가며 나의 경우, 거의 Linux에서 많이 사용한다. 

1.1 VS Code Version Control 

  • 좌측 Source Control 메뉴
좌측메뉴의 Source Control 메뉴 선택후 Git 관련 명령어로 관리하며, SOURCE CONTROL:GIT 에서 아래 명령들을 실행
  1. CHANGES  창 아래에 아직 git add가 되지 않은 부분  (Local Repository)
  2. STAGED CHANGES  git add 후 Local의 Stage에 반영 ( Local Repository)
  3. 우측 상단 "..." 선택 후  "commit all "  ( Local Repository)
  4. 우측 상단  "..."  선택 후 push or sync 진행 (Remote Repository)



VS Code Version Control(Git)
  https://code.visualstudio.com/docs/editor/versioncontrol


1.2 VS Code Task 관리방법 

Task라고 해서 이름이 좀 익숙치 않을 것인데, 사용용도는 내가 만들고자하는 Script를 바로 쉽게 관리하는 기능이라고 생각하면 되겠다. 

  • Terminal -> Run Task 기능 
내가 자주 사용하는 기능으로 Macro라고 생각하면 되겠으며, Task 기반으로 본인이 하고 싶은 것을 만들면 된다. 
예를들면, 어떤 것을 Build 하고 싶다면 관련 Task를 만들어 간단하게 실행이 가능하다. 
Manual을 보면 주로 Build 관련내용이며, 연결하는 방법들이다. 
하지만, 현재 나의 경우는 Linux에서 각 Shell Script 실행용으로 사용중이며, 편하다 
만약 사용하게되면, .vscode 내부에 tasks.json을 별도로 만들어 사용되어지며, 이는 보관을 해야한다. 


  • Task 설정방법 
Terminal -> Configure Task 
직접 .vscode 안에 tasks.json을 만들어서 넣으면 됨 


  • 설정한 Task 실행 
Terminal -> Run Task 

  • tasks.json 의 예제 1 
shell script로 구성으로 Window 와 Linux 같이 호환용 
.vscode/tasks.json // e.g. window and linux
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Run tests",
      "type": "shell",
      "command": "./scripts/test.sh",        
      "windows": {
        "command": ".\\scripts\\test.cmd"
      },
      "group": "test",
      "presentation": {
        "reveal": "always",
        "panel": "new"
      }
    }
  ]
}  

  • tasks.json 예제2
Shell Script 용도로 Window or Linux에서 아래와 같이 실행하면된다.

.vscode/tasks.json // e.g. 두개의 Task 
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "echo0",
      "type": "shell",
      "command": "echo hello",        
    },
    {
      "label": "echo1",
      "type": "shell",
      "command": "echo hello",        
    }    
  ]
}  

세부설정방법 


1.3 VS Code Extension 

현재 주로 사용중인 VS Code Extension 과 각 기능 소개

  1. Remote Development
  2. C/C++ InteliSense
  3. Setting Sync
  4. Embedded Linux Kernel Dev
  5. bitbake 
  6. udev-rules
  7. TODO Parser
  8. Todo Tree
  9. kconfig


Intellisense의 기능사용법
  https://code.visualstudio.com/docs/editor/intellisense

VSC Essential ( Package 합)
  https://marketplace.visualstudio.com/items?itemName=Gydunhn.vsc-essentials



2. Remote Development 기능 및 설치 

VS Code에서 가장 많이 사용할 기능이며, 기본 사용방법을 알아두도록하자.
SSH를 기반으로 외부 Server에 접속하여 쉽게 개발을 하도록 돕고 있으며,  Remote Server에도 VS Code의 PlugIns 들을 설치진행하여 다양한 기능을 사용가능.

아래 기능은 주로 Window에 VS Code를 설치하고,  Remote Linux Server에 연결하여 직접 개발하는 방식으로 사용한다. 

상위그림 참조
  https://code.visualstudio.com/docs/remote/remote-overview


2.1 Remote Development  설치 

Remote Development 의 기능이 아래의 3 기능을 포함
  https://code.visualstudio.com/docs/remote/linux

  Remote SSH
Window에서 SSH기반으로 Remote Linux Server에 연결하여 쉽게 Source 연결 및 관리
  https://code.visualstudio.com/remote-tutorials/ssh/getting-started

  Remote WSL(Windows Subsystem for Linux)
Window 용 WSL에 쉽게 연결하여 WSL내부의 Source 연결 및 관리 
  https://code.visualstudio.com/remote-tutorials/wsl/enable-wsl

  Remote Container
Docker를 다룬다면 당연히 설치하여 진행 
  https://code.visualstudio.com/remote-tutorials/containers/getting-started





2.2 Window 10 의 WSL 설치 

Window 7에서 Virtual Box 기반으로 Ubuntu 매번 설치를 진행하여 진행하였지만,  Window 10으로 오면서  MS의 WSL기반의 Linux 로 설치진행
그리고, Remote로 WSL를 연결 사실 Remote라기 보다는 Local이 맞겠다. 

  • Window 10 WSL (Window Subsystem for Linux) 설치  
Window 10 Ubuntu 18.04 LTS 설치
  https://wiki.ubuntu.com/WSL
  https://www.microsoft.com/ko-kr/p/ubuntu-1804-lts/9n9tngvndl3q?rtc=1&activetab=pivot:overviewtab

설치후 실행시 문제발생 


PowerShell을 관리자모드 (마우스우측버튼)실행
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 


상위와 같이 설정하면 PC 재부팅후 실행하면 동작되어짐 

WSL 관련설명 및 설치방법 
  https://docs.microsoft.com/en-us/windows/wsl/about
  https://docs.microsoft.com/ko-kr/windows/wsl/install-win10?redirectedfrom=MSDN

Ubuntu 설치 후 아래와 같이 update 와 upgrade 진행

$ sudo apt update
$ sudo apt upgrade -y





3. Remote Development 사용법

상위에서 설치한 Remote Development를 Window에서 Remote Linux Server or Window 내부의 WSL에 연결하여 소스 및 관리를 해보도록하자.


3.1 VS Code의 Remote Explorer  

Remote Extension을 설치를 했으니, 직접 Remote로 연결하여 Explorer기반으로 소스를 연결및 관리를 진행해보도록 하자. 

  1. 좌측메뉴Remote Explorer 메뉴선택  
  2. Remote Explorer  에서 아래와 같이 선택 
    1. SSH Targets 
    2. WSL Targets 
    3. Containers 





3.2 SSH Target 선택 (Linux Server)

Remote Server에 SSH가 지원이 되면, SSH 기반으로 SCP와 SSH기반으로 Xwindow 도 관련하여 볼수가 있다. 
그러므로 SSH는 기본으로 설정하고 설치를 진행하고 사용해야한다. 

  • 둘 중 하나를 선택 해서 추가 
  1. +  Add New : 처음 설정시  
  2. * Configure : 두번째 설정시 부터 





ssh jhlee@192.168.1.200  -A    //-A Forward 기능 




상위 아이콘 Configuration
or
Remote-SSH: Open Configuration File  





상위 Config를 세부설정확인
  https://code.visualstudio.com/docs/remote/ssh

  • SSH Targets  설정완료 



접속 후 아래 메뉴를 클릭하면 Remote SSH 설정가능 (Remote SSH :  Setting)





기본설정은 완료되었으며, 각 Project 설정은  좌측 Explorer 창에서 새로 시작


3.3  WSL Targets 설정 


Add Distro 를 하면 WSL를 설치가 가능하지만 이미 설치를 진행했기때문에 생략

  • WSL Targets  (Window 10 내부)
Connect To WSL 선택


처음 WSL 접속 할 경우 자동으로 WSL실행하기 때문에 연결 시간이  좀  걸린다.
이 후는 SSH Server 와 거의 유사한 것 같다.

좌측아래의 이 부분을 선택하면 관련설정을 동일하게 볼수 있음



3.4  Containers 설정 

Linux Laptop의 경우 Docker를 이미 많이 사용 중이지만 VS Code의 Container를 이용하여 사용해보기로 했지만, 현재 비추천하며 필요하다면 사용
나중에 괜찮아 질거라고 본다. 

Container 사용방법 및 System Requirement 확인
  https://code.visualstudio.com/docs/remote/containers

  • Sysytem Requirement 확인
Window에서는 Desktop Docker가 필요하며 이를 이용해야한다.

Desktop Docker 설치진행
  https://www.docker.com/products/docker-desktop



New Container 선택


Linux에서 VS Code를 사용할 경우 아래와 같이 쉽게 Docker를 잡을 수 있지만, 차리리 Docker를 설치해서 관리하는게 편한 것 같다.




Docker를 별도로 설치해서 관리하는 게 더 편함



3.5 Remote 구성 후 Open Folder 구성방법

Open Folder 기반으로 프로젝트 구성가능
  1. 첫번째 일 경우,  좌측의 Explorer 메뉴선택 후 Open Folder로  Open Folder
  2. 두번째 일 경우,  이미 존재하므로  File-> Open Folder

각 정보는 Remote Exploer로 자동저장됨



접속 후 좌측메뉴에서 Explorer 선택 후 Open Folder 선택 후 본인이 원하는 Project로 이동
그 기준으로 Project 정보 .vscode가 생성됨





.vscode-server/      // VS Code의 PlugIn Program  과 저장정보 
├── bin
│   └── a5d1cc28bb5da32ec67e86cc50f84c67cc690321
├── data
│   ├── logs
│   ├── Machine
│   ├── machineid
│   └── User
└── extensions
    ├── austin.code-gnu-global-0.2.2
    ├── ms-python.python-2020.5.86806
    ├── ms-vscode.cpptools-0.28.3
    ├── spadin.remote-x11-1.3.4
    └── spadin.remote-x11-ssh-1.3.4

.vscode:  // launch.json 파일


 .vscode 와 .vscode-server  부분에 VS Code 관련부분을 Download하여 설치 진행
만약 문제가 생긴다면, 이 부분을 삭제 후 다시 진행



4. VS Code의 유용한 Extensioon 및 Tools 소개 


VS Code의 Extension을 설치하여 기능을 좀 더 확장하고 이외의 Window Tool or Linux Tool을 사용하여 확장하여 사용해보도록하자. 


4.1 Remote X Window 관련 Tools 소개  

SSH 기반으로 Window에서 X Window로 연결하고 Remote로 보고자 할 경우 사용한다.
구지 SSH가 아니더라도 Remote X window를 제공해준다. 

  • Remote X11
X Sever를 접속할 수 있는 Tool 이지만 불안전한 존재로 아래의 Tool 과 같이 사용한다고 하며, X11 Forwarding은 아래의 Remote X11 (SSH) 필요
  1. VcXsrv  (이것만으로도 xterm을 이용하여 X Forwarding 가능)
  2. Cygwin/X
  3. Xming
  4. X410

  • Remote X11 (SSH)
SSH를 이용하여 X Forwarding 하는 Tool이여 상위 VcXsrv와 거의 동일할 것 같다.
X Shell에서 X Manager를 생각을 하면되겠으며, Linux에서는 SSH에 옵션 -x를 추가하면 쉽게 동작가능하다.
  https://marketplace.visualstudio.com/items?itemName=spadin.remote-x11-ssh

사실현재 Remote X11 과 확장인 Remote X11 (SSH)의 이용은 좀 생각해봐야겠으며, vcXsrv로만으로 충분히 X11 Forwarding이 가능하므로,
이는 좀 더 업그레이드 된 후 다시 사용해보도록 하자.

만약 SSH를 이용한 X11 Forwarding 간단한 TEST 하고싶은면 eog *.png Linux 명령으로 그림을 보면된다.
혹은 간단한 Python을 작성을 하여도 상관없다.


4.2 VS Code의 Extension(소스분석) 

Remote 접속일 경우, Local 이외에도 Remote 부분에도 별도설치를 진행을 해줘야 제대로 동작가능

  • InteliSense
Ecplise의 Index or ctags 처럼 함수와 변수를 쉽게 분석하고, 위치를 찾아주며 다양한 기능을 제공하고 있다.
현재 사용중인 것은 C/C++ 와 Python Package
  https://code.visualstudio.com/docs/editor/intellisense
  https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools

  • Embdedded Linux Kernel Dev
Kernel 의 Device Tree 를 비롯하여, Kernel Config
  https://marketplace.visualstudio.com/items?itemName=microhobby.linuxkerneldev

기타확장
  https://marketplace.visualstudio.com/items?itemName=EugenWiens.bitbake


4.3  VS Code 현재 설정을 Gist로 저장 

요즘 편하게 사용하는 기능인데, VS Code의 환경설정을 Github의 Gist에 저장하는 방법이다.

  • Setting Sync 
회사동료에서 알게된 기능으로 VS Code의 환경설정을 Github의 Gist에 저장이 가능
Github의 계정과 저장할 Gist를 별도로 생성해야함
  https://code.visualstudio.com/docs/editor/settings-sync
  https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync


4/25/2020

GPS/GNSS Device 관련내용

1. GPS/GNSS 의 구조 

일반적인 GPS는 Serial 통신으로 설정이 되어있으며, Chip에따라 속도변경도 가능하다.
또한 Serial Protocol인 NMEA를 이용하여 GPS의 정보를 Parsing해서 관련정보를 얻는다.

GPS의 Chipset 
  https://wiki.openstreetmap.org/wiki/GPS_Chipset

GPS와 GNSS 차이
  https://www.semiconductorstore.com/blog/2015/What-is-the-Difference-Between-GNSS-and-GPS/1550/


1.1 GPS의 PPS역할 

GPS의 Serial은 1Hz를 맞추어 Serial로 개별 Commad를 Update하지만, Serial에 대한 Latency가 존재하므로
실제로 정밀하게 시간을 맞추지 못한다.


  • PPS의 역할 및 동작 
GPS는 PPS라는 외부 Pin이 존재하며, PPS Pin의 1Hz에 맞추어 Serial의 NMEA정보는 보낸다.
하지만 PPS Pin 기준으로 1Hz마다 Serial의 Data를 전송하더라도 Latency는 존재하며, 이를  맞추기 위해서 PPS Pin에 맞추어 시간보정가능하다.

1 Pulse 다양하게 설정 될 수 있다고 함 
  https://en.wikipedia.org/wiki/Pulse-per-second_signal

1 Pulse 100ms 언급
  http://zone.ni.com/reference/en-XX/help/373629D-01/nisynclv/ppstimeprotocol/
  https://www.frontiersin.org/articles/10.3389/fbuil.2018.00082/full

GPS의 Serial 과 PPS를 이용한 NTP Server
  https://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html
  https://vanheusden.com/time/rpi_gpio_ntp/

GPS의 PPS 부분 Time Sync
  https://onlinelibrary.wiley.com/doi/pdf/10.4218/etrij.08.0106.0306


  • PPS 이용한 시간보정방법 (Latency 문제)
예를들면, 070844.389 , 7시 08분 44.389 초를 Serial를 통해 받으면 Serial Latency가 존재하므로 이 시간으로 바로 설정하면
시간이 정확하지 않지만, 다음은 분명 070845.389로 받을 것이므로, 다음 PPS 신호에 맞추어서 이 시간으로 설정하면 정확한 시간으로 설정 될 것 같다.


  • NTP의 시간보정방법
NTP Server의 시간이 정확하다는 가정하에 NTP Client는 NTP Server와 통신을 한 후 각 Time offset를 이용하여 구하는데, 의외로 재미있지만,
Network의 상황이 불안정해서 정확한 Time offset은 구하기 힘들다면 어떻게 되는지가 궁금하다.
  https://en.wikipedia.org/wiki/Network_Time_Protocol


1.2 GPS의 Antenna 

GPS에 따라 LNA의 존재 여부에 따라 각 Antenna 연결부분이 달라지며, 각 HW 부분을 확인하자.

LNA (AMP)
  https://en.wikipedia.org/wiki/Low-noise_amplifier

  • GPS의 Antenna Type
  1. Passive Antenna: Antenna에 내부에 LNA가 없음
  2. Active Antenna:  Antenna에 내부에 LNA가 있음   
Passive 와 Active Antenna 차이 
  https://techship.com/faq/difference-active-and-passive-antenna/


1.3  GPS/GNSS Serial 정보 

  • GPS/GNSS Serial Protocol 
  1. NMEA기반으로 Serial 정보
  2. Ublox Protocol
상위와 같이 두 가지로 제공을 해주는 것으로 보이며, 주로 NMEA를 기반으로 많이 사용하는 것 같다.


2. NMEA의 기본구조 

GPS의 Serial 부분에서 기본 시간정보좌표정보를 얻을 수 있으며, 별도의 PPS Pin 연결부분을 이용하여 정확히 1Hz마다 정보를 Update를 한다
Baudrate는 default 9600bps이며, 변경도 가능하다고 하다고 하지만, 변경의 의미는 크게 없을 것 같다.

기본구조 거의 동일하며, Preamble "$" 시작하여  Checksum(*2bytes) + <CR><LF>으로 종료되어진다.

  • Preamble 이후 
다음과 같이 시작이 되어지므로, 실제 분석을 하려고 하며, 이 뒤의 개별 Command를 가지고 봐야한다.
  1. GP,GN,GL : GPS + GLONASS
  2. GP,GL : GPS only
  3. GP,GN,GL : GLONASS only 

NMEA 관련내용 (ASCII Code구성)
이 부분 Manual을 자세히 읽어보면 대충 어떻게 동작하는지 쉽게 이해한다.
  https://www.gpsinformation.org/dale/nmea.htm

NMEA 의 Checksum 의 구조 
  https://nmeachecksum.eqth.net/

NMEA Command 
  https://www.rhydolabz.com/documents/25/NMEA-CommandManual_%28FTX-HW-13002%29.pdf


2.1 NMEA의 PMTK 


PMTK 설정
  https://www.sparkfun.com/datasheets/GPS/Modules/PMTK_Protocol.pdf
  https://www.rhydolabz.com/wiki/?p=16770

Satelite Search 할 경우 각 Chip마다 다를 수 있으며, 관련부분은 PMTK Command를 보면될 것 같으며, 이외에도
다양한 Command로 GPS Chip을 Control 가능한 것 같다.

세부부분은 각각의 GPS Chip의 Datasheet를 확인하자

  • 위성 Search 기능 
GLONASS satellites only
GPS satellites only
GLONASS and GPS satellites
BDS satellites only
..

$PMTK313,1*2E<CR><LF>  //Enable to search a SBAS satellite or not

2.2 NMEA 의 기본분석 

아래의 Command들 중심으로 각 검색을 하면, 각 1Hz 단위로 Update가 진행되며, 시간정보는 GPS내부에 RTC가 별도로 존재하기 때문에,
연결이 되지 않아도 시간정보를 정확하게 줄 수 있는 것으로 보인다.

  • NMEA 의 RMC로 시간과 날짜 와 좌표분석
GPS의 NMEA의 시간정보와 위치정보를 동시에 얻을 수 있으며, 안테나 문제로 연결이 안될 경우 시간정보라도 확인가능

RMC 의 시간정보 와 날짜정보 와 위치정보  
NMEA sentence format: $xxRMC,time,status,lat,NS,long,EW,spd,cog,date,mv,mvEW,posMode*cs <CR><LF>
Valid fix: $GPRMC,083559.34,A,4717.11437,N,00833.91522,E,0.004,77.52,091202,,,A*00
No fix: $GPRMC,,V,,,,,,,,,,N*00

각 Argument는 ","로 구분되며, 1Hz 주기로 Update 됨 

1st Argument (Time 분석): 083559.34
-  08시 35분 59.34초  UTC  (Local Time: Seoul +9)

2nd Argument (동작여부): A or V
-  Status A=active or V=Void.

3st/4st Argument (Latitude): 4717.11437,N
-  위도 Latitude 47 deg 17.11437' N

5st/6st Argument (Longitude): 00833.91522,E
-  경도 Longitude 008 deg 33.91522' E

9st Argument (Date 분석): 091202
-  9월 12일 2002년 


  • RMC 정보 간단히 확인
$ cat /dev/ttyxx | grep RMC   //GPS Serial 3Hz 단위 문제있음
//No fix 의 예로 상위 V로 쉽게 파악 가능하며, 1Hz 단위로 동작해야한다 
$GPRMC,070050.799,V,,,,,0.00,0.00,060180,,,N*47 // 07 시 00분 50.799초 UTC  
$GPRMC,070053.799,V,,,,,0.00,0.00,060180,,,N*44
$GPRMC,070056.799,V,,,,,0.00,0.00,060180,,,N*41
$GPRMC,070059.799,V,,,,,0.00,0.00,060180,,,N*4E
$GPRMC,070102.799,V,,,,,0.00,0.00,060180,,,N*41

$ cat /dev/ttyxx | grep RMC   //GPS Serial 1Hz 단위 문제없음
$GPRMC,064147.087,V,,,,,0.00,0.00,260620,,,N,V*38 // 06 시 41분 47.087초 UTC 이와 PPS와 연동하여 정확한 시간보정 
$GPRMC,064148.087,V,,,,,0.00,0.00,260620,,,N,V*37
$GPRMC,064149.087,V,,,,,0.00,0.00,260620,,,N,V*36
$GPRMC,064150.087,V,,,,,0.00,0.00,260620,,,N,V*3E
$GPRMC,064151.087,V,,,,,0.00,0.00,260620,,,N,V*3F
$GPRMC,064152.087,V,,,,,0.00,0.00,260620,,,N,V*3C
$GPRMC,064153.087,V,,,,,0.00,0.00,260620,,,N,V*3D
$GPRMC,064154.087,V,,,,,0.00,0.00,260620,,,N,V*3A

//상위는 baud rate를 별도로 설정을 안했으며, minicom에서 재 테스트 진행 
$ minicom -s   // 다 설정진행   Ctrl+A , Z 종료 
$ minicom -D /dev/ttyxxx    // Baudrate 만 설정 


RMC 분석
  https://www.gpsinformation.org/dale/nmea.htm#RMC

  • NMEA 의 GGA로 시간과 좌표분석 
위성을 제대로 못 찾는다면, 시간이라도 확인

GGA 의 좌표정보
NMEA sentence format: $xxGGA,time,lat,NS,long,EW,quality,numSV,HDOP,alt,M,sep,M,diffAge,diffStation*cs<CR><LF>
Valid fix: $GPGGA,092725.00,4717.11399,N,00833.91590,E,1,08,1.01,499.6,M,48.0,M,,*5B

각 Argument는 ","로 구분되며, 1Hz 주기로 Update 됨 

1st Argument (Time 분석): 092725.00
-  09시 27분 25.00초  UTC  (Local Time: Seoul +9)

2nd/3st Argument (Latitude): 4717.11399,N
-  위도 Latitude 47 deg 17.11399' N

4st/5st Argument (Longitude): 00833.91590,E
-  경도 Longitude 008 deg 33.91590' E

9st/10st Argument (Altitude): 499.6,M
-  높이/고도 Altitude  499.6 Meter above mean sea level

11st/12st Argument (일반적으로 이 정보까지는 필요없을 것 같음): 48.0,M
-  해상높이  48.0 Height of geoid (mean sea level) above WGS84



  • CGA 정보 간단히 확인
$ cat /dev/ttyxx | grep GGA   //GPS Serial 
//만약 동작하지 않는다면,아래와 같이 동작 다만 1Hz단위인지 확인 
$GPGGA,061713.087,,,,,0,0,,,M,,M,,*45 // 06 시 17분 13.087초 
$GPGGA,061714.087,,,,,0,0,,,M,,M,,*42
$GPGGA,061715.087,,,,,0,0,,,M,,M,,*43
$GPGGA,061716.087,,,,,0,0,,,M,,M,,*40
$GPGGA,061717.087,,,,,0,0,,,M,,M,,*41

GGA 분석
  https://www.gpsinformation.org/dale/nmea.htm#GGA


3. Ublox Protocol (참조)

NMEA이외에도 Ublox의 Protocol도 존재하는 것으로 보임

  https://www.sparkfun.com/datasheets/GPS/Modules/u-blox5_Protocol_Specifications(GPS.G5-X-07036).pdf
  https://gpsd.gitlab.io/gpsd/ubxtool.html


4. GPS 관련소스 및 Parsing 부분

Ublox 와 NMEA기반의 Parser가 다르며, 각 정보의 구조가 다르다.

GPS Parsing 관련소스  
  https://github.com/JeonghunLee/lora_gateway/blob/master/libloragw/src/loragw_gps.c
  https://github.com/JeonghunLee/lora_gateway/blob/master/libloragw/inc/loragw_gps.h
  https://github.com/JeonghunLee/lora_gateway/blob/master/libloragw/tst/test_loragw_gps.c

4/22/2020

Yocto User Config 의 Profiling and Tracing

1. Yocto 의 Profile 기능 추가 및 사용

Yocto 기반으로 Profile 기능과 Trace Debug기능을 추가하여 사용하는 방법을 알아보기 위해서 아래와 같이 설정변경 후,
이를 기반으로 Profile 과 Tracing 사용을 해본다.

Yocto에서 Profile 과 Tracing은 소스를 세부적으로 분석하는 Debug 기술이자, 성능측정도 가능하므로 중요한 기술이다. 
이를 제대로 사용하려면 각 IDE Tool 도 알아두어야 한다
대부분 Ecplise 기반으로 제공되어지며, 각 Chip 제조사 Application들도 보면 기반을 다 Ecplise 기반으로 되어있다. 


TI CCS (TI사 제공) 이외 각 제조사 IDE 참조 


1.1 Yocto 의 기본문법 및 User Config 이해 

Yocto의 기본적인 이해


Yocto Recipe 작성방법 (반드시 확인 및 이해)

Yocto User Configuration 수정방법
  https://ahyuo79.blogspot.com/2020/02/yocto-user-configuration.html

기본 Yocto Recipe 및 Kernel Recipe 수정방법
  https://ahyuo79.blogspot.com/2020/02/yocto-recipe.html

Yocto sysLog 구성 
  https://ahyuo79.blogspot.com/2020/04/yocto-syslogd.html


1.2  Yocto User Configuration 설정변경 

  • Yocto 의 User Configuration 수정 
$ cat conf/local.conf  //일반적인 설정

## Yocto Version에따라 설정변경될 수 있음 아래 Manual 참조
## 일반적인 EXTRA_IMAGE_FEATURES 설정으로 debug 기본정보포함 (기본 /sys/kernel/debug는 동작됨)
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"

별도로 추가하여 설정
## Profile 과 Tracing 을 위해 별도로 추가되는 명령들 
## IMAGE의 Profile Tool을 추가 
EXTRA_IMAGE_FEATURES += "tools-profile"

## Package들에 Debug 정보를 추가 (bitbake를 이용하여 xxx-dbg Manual로 해도됨)
EXTRA_IMAGE_FEATURES += "dbg-pkgs"

## Yocto는 default로 strip을 하여 debug정보 및 삭제하므로 이를 방지 
INHIBIT_PACKAGE_STRIP = "1"

##  *-dbg packages 만들 때 Bin 와 Debug 정보를 어떻게 분리할지를 결정 (bin 에 .debug 생성) 
PACKAGE_DEBUG_SPLIT_STYLE = 'debug-file-directory'

** EXTRA_IMAGE_FEATURES 는 항상 Yocto Version에 따라 반드시 참조 

gdb 와 같이 사용하고자 하면 아래와 같이 설정 
EXTRA_IMAGE_FEATURES += "dbg-pkgs"
EXTRA_IMAGE_FEATURES += "tools-debug"

Yocto에서 deb 방식으로 package 관리할 경우 (apt-get)
  https://imxdev.gitlab.io/tutorial/How_to_apt-get_to_the_Yocto_Project_image/
 
EXTRA_IMAGE_FEATURES 
  https://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#ref-features-image


1.3 Yocto 의 Kernel Config 수정 

  • WORKDIR 에서 현재 Kernel Config 확인
Yocto의 Build space에서 직접 빌드된 Kernel Source의 Config 확인

$ vi ./tmp/work/imx6sxsabresd-poky-linux-gnueabi/linux-imx/4.19.35-r0/build/.config  //직접 찾아서 확인 
CONFIG_BUILD_LTTNG       //확인했으나 없음
CONFIG_FUNCTION_TRACER   //확인했으나 없음 

$ vi ../sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-kernel/linux/linux-imx_4.19.35.bbappend // Kernel Recipe가 문제가 있음 
# 부분 막음 
do_preconfigure_append()   

  https://en.wikipedia.org/wiki/Ftrace


  • Kernel 의 CONFIG 설정변경 

$ bitbake linux-imx  -c configme    // patch 후 *cfg를 적용을 한다고하는데, 동작안됨
$ bitbake linux-imx  -c menuconfig    // 설정변경
//각 메뉴 선택 후 HELP에서 CONFIG 확인가능

//이미 설정되어있음 
> Kernel hacking > Compile-time checks and compiler options > Debug Filesystem (CONFIG_DEBUG_FS)

//새로설정 
> Kernel hacking > Tracers                                            // (CONFIG_FTRACE)
> Kernel hacking > Tracers > Kernel Function Tracer                  // (CONFIG_FUNCTION_TRACER)
> Kernel hacking > Tracers > Kernel Function Graph Tracer            // (CONFIG_FUNCTION_GRAPH_TRACER)
> Kernel hacking > Tracers > Interrupts-off Latency Tracer           // (CONFIG_IRQSOFF_TRACER)
> Kernel hacking > Tracers > Preemption-off Latency Tracer           // (CONFIG_PREEMPT_TRACER)
> Kernel hacking > Tracers > Scheduling Latency Tracer               // (CONFIG_SCHED_TRACER)
> Kernel hacking > Tracers > Trace max stack                         // (CONFIG_STACK_TRACER)
> Kernel hacking > Tracers > Support for tracing block IO actions    // (CONFIG_BLK_DEV_IO_TRACE)
> Kernel hacking > Tracers > Kernel function profiler                // (CONFIG_FUNCTION_PROFILER)
CONFIG_DYNAMIC_FTRACE="y"                                              // 찾지못함 (상위 설정시 자동설정됨)
CONFIG_FTRACE_MCOUNT_RECORD="y"                                        // 찾지못함 (상위 설정시 자동설정됨)


//추후 별도로 추가 
> Kernel hacking > Tracers > Trace syscalls                          // (CONFIG_FTRACE_SYSCALLS) 


fragment가 생성되었으나 이전 .config 의 나의 설정과 다름 (주의)
추후 필요한 것만 직접 적용하여 넣도록하자

$ bitbake linux-imx  -c diffconfig    //*.cfg 생성 후 이를 Kernel Recipe에 추가 
....
......../fragment.cfg

$ cat fragment.cfg  // 상위와 다르게 나옴 자세히 보면 선택한 것도 미선택으로 됨 
CONFIG_TRACEPOINTS=y
CONFIG_UPROBES=y
# CONFIG_NET_DROP_MONITOR is not set
# CONFIG_ATH6KL_TRACING is not set
# CONFIG_MXC_GPU_VIV is not set
CONFIG_BINARY_PRINTF=y
# CONFIG_DEBUG_PAGE_REF is not set
CONFIG_TRACE_IRQFLAGS=y
CONFIG_STACKTRACE=y
CONFIG_NOP_TRACER=y
CONFIG_TRACER_MAX_TRACE=y
CONFIG_TRACE_CLOCK=y
CONFIG_RING_BUFFER=y
CONFIG_EVENT_TRACING=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_RING_BUFFER_ALLOW_SWAP=y
CONFIG_PREEMPTIRQ_TRACEPOINTS=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
# CONFIG_FUNCTION_GRAPH_TRACER is not set
CONFIG_TRACE_PREEMPT_TOGGLE=y
# CONFIG_PREEMPTIRQ_EVENTS is not set
CONFIG_IRQSOFF_TRACER=y
CONFIG_PREEMPT_TRACER=y
CONFIG_SCHED_TRACER=y
# CONFIG_HWLAT_TRACER is not set
# CONFIG_FTRACE_SYSCALLS is not set
CONFIG_TRACER_SNAPSHOT=y
CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y
CONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
# CONFIG_PROFILE_ALL_BRANCHES is not set
CONFIG_STACK_TRACER=y
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_UPROBE_EVENTS=y
CONFIG_PROBE_EVENTS=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_FUNCTION_PROFILER=y
CONFIG_FTRACE_MCOUNT_RECORD=y
# CONFIG_FTRACE_STARTUP_TEST is not set
# CONFIG_TRACEPOINT_BENCHMARK is not set
# CONFIG_RING_BUFFER_BENCHMARK is not set
# CONFIG_RING_BUFFER_STARTUP_TEST is not set
# CONFIG_PREEMPTIRQ_DELAY_TEST is not set
# CONFIG_TRACE_EVAL_MAP_FILE is not set
CONFIG_TRACING_EVENTS_GPIO=y

$ cp ./build/tmp/work/imx6sxsabresd-poky-linux-gnueabi/linux-imx/4.19.35-r0/fragment.cfg ../sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-kernel/linux/files/kernel_ftrace.cfg
//적용 Kernel Recipe 수정 

ftrace 의 Kernel config 설정
  https://stackoverflow.com/questions/41238386/how-to-enable-or-configure-ftrace-module
  https://docs.google.com/presentation/d/13zIFUTTdChr7JNpZnb1K56aUsv_E1cOWausjQpsqcGc/htmlpresent
  https://docs.windriver.com/bundle/Wind_River_Linux_Tutorial_Dynamic_Kernel_Debugging_with_ftrace_and_kprobes_LTS_1/page/zjd1552591139310.html

  • Kernel 만 다시빌드 및 배포

$ bitbake linux-imx  -c compile -f    // -f force로 강제로 빌드 후 .config 설정확인 
$ bitbake linux-imx  -c deploy        // 이를 적용 

$ bitbake linux-imx  -c clean        // 전체삭제 
$ bitbake linux-imx          // 전체동작 (오동작) 
$ bitbake linux-imx  -c configure         // 전체동작 (오동작) 


  https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#var-KBUILD_DEFCONFIG
  https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#kernel-related-tasks

  • bitbake로 image 생성
$ bitbake core-image-base 


Yocto Profile manual
Zeus(3.0)
  https://yoctoproject.org/docs/3.0/profile-manual/profile-manual.html
Warrior(2.7)
  https://yoctoproject.org/docs/2.7/profile-manual/profile-manual.html
Fido(1.8)
  https://yoctoproject.org/docs/1.8/profile-manual/profile-manual.html


1.4  Yocto 설정 변경 시 문제사항 

  • 처음 발생하는 문제
Parition을 고정 크기를 했을 경우, Debug 정보가 들어가기 때문에 나의 경우는 약 4배 좀 더 용량이 더 커져서 문제발생
이 문제는 아래의 WIC 부분 참조

  • 두번째 발생하는 문제
빌드가 잘 된 후 아래와 같이 Image를 적용 후 Booting 하며 문제발생
아래문제도 역시 /var/log 와 kernel size 문제를 제거후 해결됨
.......
         Starting Flush Journal to Persistent Storage...
systemd-journald[164]: Received request to flush runtime journal from PID 1
[  OK  ] Started Flush Journal to Persistent Storage.
[    **] A start job is running for dev-mmcblk3p5.device (24s / 1min 30s)random: crng init done
random: 7 urandom warning(s) missed due to ratelimiting
[ TIME ] Timed out waiting for device dev-mmcblk3p5.device.

  https://www.linode.com/community/questions/17915/why-did-my-server-miss-urandom-warnings-due-to-rate-limiting


Yocto 의 WIC Partition (해결방법)
  1. Partition Size도 가변사이즈로 변경(고정사이즈일 경우) 
  2. Partition 도 삭제했다면 sources에서도 fstab도 같이 수정 
  3. /var/log 부분기능삭제
  https://ahyuo79.blogspot.com/2020/02/yocto-partition.html


2. Yocto의 Profile 및 Trace 확인 및 사용


  • 현재 설정된 기본기능확인 (EXTRA_IMAGE_FEATURES 확인)

$ cat /etc/fstab    // /sys/debug/kernel 별도로 없으며, 상위 debug-tweaks 참조  

$ ls /sys/kernel/debug  // 상위 (EXTRA_IMAGE_FEATURES ?= "debug-tweaks") 적용 부터 동작 
2100000.caam/       extfrag/            pm_genpd/
bdi/                fault_around_bytes  pm_qos/
block/              gpio                pwm
ci_hdrc.0/          hid/                regmap/
ci_hdrc.1/          iio/                regulator/
clear_warn_once     memblock/           sleep_time
clk/                mmc2/               suspend_stats
device_component/   mmc3/               ubi/
devices_deferred    mtd/                ubifs/
dma_buf/            opp/                usb/
dri/                pinctrl/            wakeup_sources

$ cat /sys/kernel/debug/gpio  // GPIO Debug   (sysfs도 이용하지만, device tree에서 직접 모듈로 연결가능) 
....
 gpio-112 (                    |peri_3v3            ) out hi  // sys file이 아닌 device tree에서 gpio 연결 
 ...
 gpio-114 (                    |sysfs               ) out lo         
 ...
 gpio-160 (                    |sysfs               ) out hi  // sys file에서 export 한 다음 direction 설정 후 값 설정
 gpio-161 (                    |sysfs               ) out hi
 gpio-170 (                    |spi_imx             ) out hi

// PinCtrl 관련설정값을 쉽게 확인 (device tree의 설정값과 비교) 
$ cat /sys/kernel/debug/pinctrl/pinctrl-handles 

// PinCtrl 관련설정값을 세부적으로 확인 (device tree의 설정값과 비교) 
$ cat /sys/kernel/debug/pinctrl/pinctrl-maps 

// USB 정보 lsusb 
$ cat /sys/kernel/debug/usb/devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh= 1
B:  Alloc=  0/800 us ( 0%), #Int=  1, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 4.19
S:  Manufacturer=Linux 4.19.35-1.1.0+g0f9917c ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=ci_hdrc.1
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms 
......

// PMIC Regulator 정보 
$ ls /sys/kernel/debug/regulator/   
0-0008-COIN
0-0008-SW1AB
0-0008-SW2
0-0008-SW3A
0-0008-SW3B
0-0008-SWBST
0-0008-VGEN1
0-0008-VGEN2
0-0008-VGEN3
0-0008-VGEN4
0-0008-VGEN5
0-0008-VGEN6
0-0008-VREFDDR
0-0008-VSNVS
.......


$ perf  // EXTRA_IMAGE_FEATURES 추가설정 후 존재확인

$ lttng           // lttng          확인
$ lttng-crash     // lttng-crash    확인
$ lttng-relayd    // lttng-relayd   확인
$ lttng-sessiond  // lttng-sessiond 확인

$ babeltrace      // babeltrace 확인
$ babeltrace-log  // babeltrace-log

$ blktrace  //blktrace  존재확인  (Block Device Trace) 
$ blkparse  //blkparse  존재확인   
$ iowatcher  //blktrace  visual tool   

$ dtrace  //dtrace  

$ ls /sys/kernel/debug/tracing  // 미존재하면 Kernel Config 수정 필요 
README                      set_ftrace_filter
available_events            set_ftrace_notrace
available_filter_functions  set_ftrace_pid
available_tracers           snapshot
buffer_size_kb              stack_max_size
buffer_total_size_kb        stack_trace
current_tracer              stack_trace_filter
dyn_ftrace_total_info       timestamp_mode
enabled_functions           trace
events                      trace_clock
free_buffer                 trace_marker
function_profile_enabled    trace_marker_raw
instances                   trace_options
options                     trace_pipe
per_cpu                     trace_stat
printk_formats              tracing_cpumask
saved_cmdlines              tracing_max_latency
saved_cmdlines_size         tracing_on
saved_tgids                 tracing_thresh
set_event                   uprobe_events
set_event_pid               uprobe_profile


2.1 Ftrace의 기본동작 확인 


$ mount -t debugfs nodev /sys/kernel/debug

$ echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
$ echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
$ echo 1 > /sys/kernel/debug/tracing/events/syscalls/enable

## Start Recording 
$ echo 1 > /sys/kernel/debug/tracing/tracing_on

$ cat /sys/kernel/debug/tracing/trace > myFtraceFile.txt


$ cat myFtraceFile.txt  | head -n 20
# tracer: nop
#
# entries-in-buffer/entries-written: 6606/6606   #P:1
#
#                              _-----=> irqs-off
#                             / _----=> need-resched
#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |
          <idle>-0     [000] dns4  2163.718052: sched_wakeup: comm=rcu_preempt pid=10 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.718080: sched_wakeup: comm=rcu_sched pid=11 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.728019: sched_wakeup: comm=rcu_preempt pid=10 prio=120 target_cpu=000
          <idle>-0     [000] dnH5  2163.728046: sched_wakeup: comm=kworker/0:0 pid=342 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.728068: sched_wakeup: comm=rcu_sched pid=11 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.738009: sched_wakeup: comm=rcu_preempt pid=10 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.738035: sched_wakeup: comm=rcu_sched pid=11 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.758001: sched_wakeup: comm=kworker/0:0 pid=342 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.768017: sched_wakeup: comm=rcu_preempt pid=10 prio=120 target_cpu=000



  https://archive.eclipse.org/tracecompass.incubator/doc/org.eclipse.tracecompass.incubator.ftrace.doc.user/User-Guide.html
  https://archive.eclipse.org/tracecompass/doc/stable/org.eclipse.tracecompass.doc.user/Trace-Compass-Main-Features.html
  https://archive.eclipse.org/tracecompass.incubator/doc/org.eclipse.tracecompass.incubator.kernel.doc.user/User-Guide.html


2.2 LTTng 사용방법

아래와 같이 Ecplise를 이용하여 LTTng와 함께 쉽게 디버깅가능  

  • LTTng Command 사용법 및 Trace Compass or Ecplise에서 분석

$ lttng create mySession  // Trace Compass or Ecplise 의 LTTng의 Control의 SSH로 접속가능 

$ lttng enable-event sched_switch -k   // Trace Compass의 Control의 Provider의 Kernel에서도 설정가능 

$ lttng start // Trace Compass의 Control의 Session의 mySession에서 Start 가능 

$ lttng stop // Trace Compass의 Control의 Session의 mySession에서 Stop 가능 

$ lttng view // Consol에서 정보보기 

$ lttng destroy mySession  // 본인이 필요 없다면 삭제 , 분석을 한다면 미삭제 

$ tar cvzf lttngtest.tar.gz lttng-traces   // 이안에 상위에서 만든 각각의 Session들이 존재 



  • Ecplise 에서 LTTng 분석 
  1. LTTng->Control에서는 SSH로 Target에 연결하여 Control로 가능 
  2. lttng create Session만 진행 후 모든 것을 Remote로 진행가능 
  3. 상위에서 저장된 lttngtest.tar.gz 정보를 Trace Project에서 import하여 분석가능도 가능 


관련참조자료 
  https://www.nxp.com/docs/en/application-note/AN5172.pdf


3. EXTRA_IMAGE_FEATURE의 확장 설정 

User Config의 local config 부분에 확장추가 
$ cat conf/local.conf
## Yocto Profile Manual 부분의 참고 (미테스트)
## Profile Tool (perf, systemtap, and LTTng ) 설치  (Warrior 사용가능)
EXTRA_IMAGE_FEATURES += "perf"

## Debugging Tool 설치 ( strace and gdb)  (Warrior 사용가능)
EXTRA_IMAGE_FEATURES += "tools-debug"


  https://wiki.yoctoproject.org/wiki/Tracing_and_Profiling#General_Setup
  https://wiki.yoctoproject.org/wiki/Tracing_and_Profiling#Collecting_and_viewing_a_trace_in_Eclipse



  • IMAGE_FEATURE  기능의 변화
사용되는 Yocto의 Version에 따라 IMAGE FEATURE의 기능이 다르므로 주의

Zeus(3.0)
  https://www.yoctoproject.org/docs/3.0/ref-manual/ref-manual.html#ref-features-image
Warrior(2.7)
  https://www.yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#ref-features-image
Fido(1.8)
  https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#ref-features-image


Yocto SDK Manual
  https://www.yoctoproject.org/docs/2.7/sdk-manual/sdk-manual.html


Intel Vtune
  https://software.intel.com/content/www/us/en/develop/documentation/vtune-help/top/set-up-analysis-target/embedded-linux-targets/configure-yocto-project-with-linux-target-package.html
  https://software.intel.com/content/www/us/en/develop/documentation/vtune-help/top.html

4/20/2020

firewall 설정 및 Service 등록

1. firewall 기본이해  

Linux의 firewall 기능은 기본적으로 iptables 와 firewalld가 존재하며, 기존부터 사용하던 것이 iptables 이라고 한다.
기존의 RTOS를 제외하고 Linux의 경우 firewall 기능을 거의 사용해본적이 없어 관련내용을 새롭게 알게되었다.

  • Linux에서 지원되는 Firewall Package
  1. firewalld:  GUI Interface를 제공하며, Kernel Netffilter 부분이용
  2. iptables: GUI Interface를 미제공하며, Kernel Netfilter 부분이용

iptables은 쉽게 command 형식으로 동작가능하며, firewalld는 iptables과 기능이 비슷한 nftables 기반으로 동작되어진다고 한다.
세부적으로 잘 모르겠지만, 간단히 비교하자면, firewalld는 편이성을 목적을 둔 것 같으며, iptables은 이전부터 사용하던 command 방식인것 같다.

Firewalld 관련사항
  https://en.wikipedia.org/wiki/Firewalld

1.1 Netfilter 의 기능 

firewalld를 사용하던 iptables을 사용하던 Kernel Netfilter 설정은 필수이며 이부분은 어쩔수 없다.
두 기능을 제대로 사용하고자 한다면 Kernel의 설정은 필수이지만, iptables을 사용하는지 nftables을 사용하는지에 따라 Kernel 설정은 달라지는 것 같다.

Netfilter 관련사항
  https://en.wikipedia.org/wiki/Netfilter

Firewalld 사용하는 nftables 기능
  https://wiki.gentoo.org/wiki/Nftables

Netfilter 관련 Project 정보
  https://netfilter.org/

1.2 Kernel 의 Netfilter 설정

현재 nftables 대신에 iptables을 사용할 것이며, 가급적 필요없는 기능은 빼도록 하자.
Kernel 옵션과 iptables의 설명서의 세부옵션을 자세히 보면 설정은 이해가 대충간다.
nftables 관련부분은 설정하지 않았지만, 유사할 것이라고 생각이 든다.

  • nftables의 kernel 기본설정 
[*] Networking support  --->
    Networking options  --->
        [*] Network packet filtering framework (Netfilter)  --->
            Core Netfilter Configuration  --->
                 Netfilter nf_tables support
                   Netfilter nf_tables conntrack module
                   Netfilter nf_tables counter module
                   Netfilter nf_tables log module
                   Netfilter nf_tables limit module
                   Netfilter nf_tables masquerade support
                   Netfilter nf_tables nat module
            IP: Netfilter Configuration  --->
                 IPv4 nf_tables support
                   IPv4 nf_tables route chain support
                 IPv4 packet rejection
                 IPv4 NAT
                   IPv4 nf_tables nat chain support
                   IPv4 masquerade support
                   IPv4 masquerading support for nf_tables

  https://wiki.gentoo.org/wiki/Nftables
  https://wiki.nftables.org/wiki-nftables/index.php/Building_and_installing_nftables_from_sources

NAT 설정시 상위 Kernel 설정필수

  • iptables kernel 기본설정 
[*] Networking support  --->                                          [CONFIG_NET]
      Networking Options  --->
        [*] Network packet filtering framework (Netfilter) --->       [CONFIG_NETFILTER]
          [*] Advanced netfilter configuration                        [CONFIG_NETFILTER_ADVANCED]   // iptables의 세부옵션까지 설정가능 (현재 불필요)
          Core Netfilter Configuration --->
            <*/M> Netfilter connection tracking support               [CONFIG_NF_CONNTRACK]  // iptables의 옵션의 conntrack 기능 설정 
            <*/M> Netfilter Xtables support (required for ip_tables)  [CONFIG_NETFILTER_XTABLES]
            <*/M> LOG target support                                  [CONFIG_NETFILTER_XT_TARGET_LOG]  // iptables의 기능 중 LOG로 남길수 있는 기능 
          IP: Netfilter Configuration --->
            <*/M> IP tables support (required for filtering/masq/NAT) [CONFIG_IP_NF_IPTABLES]

설정관련사항 및 Download
  http://www.linuxfromscratch.org/blfs/view/svn/postlfs/iptables.html


  • iptables의 client (현재 이 옵션에 맞춰 설정)
[*] Networking support  --->
    Networking options  --->
        ...
        [*] TCP/IP networking
        [ ]   IP: multicasting
        [ ]   IP: advanced router
        [ ]   IP: kernel level autoconfiguration
        < >   IP: tunneling
        < >   IP: GRE demultiplexer
        [ ]   IP: TCP syncookie support
        < >   Virtual (secure) IP: tunneling
        < >   IP: AH transformation
        < >   IP: ESP transformation
        < >   IP: IPComp transformation
        <*>   IP: IPsec transport mode
        <*>   IP: IPsec tunnel mode
        < >   IP: IPsec BEET mode
        < >   Large Receive Offload (ipv4/tcp)
        <*>   INET: socket monitoring interface
        < >     UDP: socket monitoring interface
        [ ]   TCP: advanced congestion control  ----
        [ ]   TCP: MD5 Signature Option support (RFC2385)
        <*>   The IPv6 protocol  --->
        [ ] Security Marking
        [ ] Timestamping in PHY devices
        [*] Network packet filtering framework (Netfilter)  --->
            --- Network packet filtering framework (Netfilter)
            [ ]   Network packet filtering debugging
            [ ]   Advanced netfilter configuration
                  Core Netfilter Configuration  --->
                       Netfilter LOG over NFNETLINK interface
                      <*> Netfilter connection tracking support
                      [ ]   Supply CT list in procfs (OBSOLETE)
                      < >   FTP protocol support
                      < >   IRC protocol support
                      < >   NetBIOS name service protocol support
                      < >   SIP protocol support
                      < >   Connection tracking netlink interface
                      < > Netfilter nf_tables support
                      -*- Netfilter Xtables support (required for ip_tables)
                            *** Xtables combined modules ***
                      < >   nfmark target and match support
                            *** Xtables targets ***
                      < >   LOG target support
                      < >   "NFLOG" target support
                      < >   "TCPMSS" target support
                            *** Xtables matches ***
                      <*>   "conntrack" connection tracking match support   // iptable 의 conntrack option 기능사용
                      < >   IPsec "policy" match support
                      < >   "state" match support
            < >   IP set support  ----
            < >   IP virtual server support  ----
                  IP: Netfilter Configuration  --->
                      <*> IPv4 connection tracking support (required for NAT)
                      <*> IP tables support (required for filtering/masq/NAT)
                      <*>   Packet filtering
                      <*>     REJECT target support
                      < >   ULOG target support (obsolete)
                      < >   IPv4 NAT
                      < >   Packet mangling
                      < >   raw table support (required for NOTRACK/TRACE)
                  IPv6: Netfilter Configuration  --->
                      <*> IPv6 connection tracking support
                      <*> IP6 tables support (required for filtering)
                      < >   "ipv6header" IPv6 Extension Headers Match
                      <*>   Packet filtering
                      <*>     REJECT target support
                      < >   Packet mangling
                      < >   raw table support (required for TRACE)


  • iptables의 router 기준옵션
[*] Networking support  --->
    Networking options  --->
        [*] TCP/IP networking
        [*]   IP: multicasting
        [*]   IP: advanced router
        ...
        [*]   IP: ARP daemon support
        [*]   IP: TCP syncookie support
        <m>   IP: AH transformation
        <m>   IP: ESP transformation
        <m>   IP: IPComp transformation
        <m>   IP: IPsec transport mode
        <m>   IP: IPsec tunnel mode
        <m>   IP: IPsec BEET mode
        <*>   Large Receive Offload (ipv4/tcp)
        <*>   INET: socket monitoring interface
        <m>     UDP: socket monitoring interface
        [ ]   TCP: advanced congestion control  --->
        ...
           The IPv6 protocol  ---&gt;
        ...
        [*] Network packet filtering framework (Netfilter)  --->
            [*]   Advanced netfilter configuration      // 좀 더 많은 iptable 옵션설정가능 
            Core Netfilter Configuration  --->
                <m>   "addrtype" address type match support  // iptable 명령어의 세부옵션
                <m>   "comment" match support                // iptable 명령어의 세부옵션
                <m>   "hl" hoplimit/TTL match support        // iptable 명령어의 세부옵션
                <m>   "limit" match support                  // iptable 명령어의 세부옵션
                <m>   "multiport" Multiple port match support // iptable 명령어의 세부옵션
                <m>   "recent" match support                  // iptable 명령어의 세부옵션

상위설정관련내용
  https://wiki.gentoo.org/wiki/Iptables


2. iptables 와 ip6tables설정 

ipv4 는 iptables 이며, ipv6는 당연히 ip6tables로 쉽게 설정가능하다.

  • iptables의 기본사용법
iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target          
iptables [-t table] -E old-chain-name new-chain-name

  https://linux.die.net/man/8/iptables
  https://linux.die.net/man/8/ip6tables

  • chain 
  1. INPUT: Host로 들어오는 방향관리
  2. OUTPUT: Host에서 나가는 방향관리
  3. FORWARD: Host에서 Forward해주는 부분관리 
  4. User-defined: -N Command를 이용하여 새로운 Chain 생성가능 

  • target
  1. ACCEPT : Packet의 허용
  2. DROP : Packet을 버림
  3. User-define Chain: 
  4. LOG  ( KERNCONFIG의 상위 LOG설정필요), syslog에 설정 

  • table  (미사용)
  1. filter  (KERNEL CONFIG 의 CONFIG_IP_NF_FILTER  설정필요) 
  2. nat     (KERNEL CONFIG 의 CONFIG_IP_NF_NAT   설정필요)    (option)
  3. mangle  (KERNEL CONFIG 의 CONFIG_IP_NF_MANGLE 설정필요)   (option)
  4. raw     (KERNEL CONFIG 의 CONFIG_IP_NF_RAW 설정필요)   (option)

iptable 기본사용법
  https://brownbears.tistory.com/151
  https://linux.die.net/man/8/iptables


2.1 iptable 기본 사용법 

  • iptable 현재 설정상태 확인
policy가 모두 ACCEPT로 되어있어, 모든 Connection 허락하며 별도로 설정된 설정이 없음

$ iptables -L     // 기본 설정확인 확인  Chain은 기본으로 3개 
or
$ iptables -L  -n  

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

$ iptables -nvL --line-numbers  //기본설정확인 및 세부사항확인 
Chain INPUT (policy ACCEPT 3 packets, 96 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination


  • iptable policy 설정 
기본 정책은 모든 INPUT/ OUTPUT/FORWARD를 전부 막고, ACCEPT 해줄 것을 이후에 별도로 설정하면 됨

$ iptables -P INPUT   DROP
$ iptables -P FORWARD DROP
$ iptables -P OUTPUT  DROP

기본 정책은 모든 INPUT/ FORWARD만 만 막고 OUTPUT은 허용

$ iptables -P INPUT   DROP
$ iptables -P FORWARD DROP
$ iptables -P OUTPUT  ACCEPT 

모두 허용

$ iptables -P INPUT   ACCEPT 
$ iptables -P FORWARD ACCEPT 
$ iptables -P OUTPUT  ACCEPT 


  • local device 허용
$ iptables -A INPUT  -i lo -j ACCEPT
$ iptables -A OUTPUT -o lo -j ACCEPT


  • NAT의 기능 
iptable을 이용하여 NAT기능도 사용가능하며, 상위 커널설정은 반드시 필요 


기본으로 Kernel 에서 Netfilter 부분설정 
# 상위그림 처럼 막음 Disabled by default!  
$  echo "1" > /proc/sys/net/ipv4/ip_forward


$ iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE     // eth1 NAT 설정 

NAT 및 포트포워딩 관련세부사항 아래 참조
  https://www.karlrupp.net/en/computer/nat_tutorial
  http://www.netfilter.org/projects/iptables/index.html

  • Incoming/outcoming 허용
policy를 drop으로 되어있을 경우 아래와 같이 Server의 특정 Port를 연결을 해주어 동작하도록 한다.
보통 Server는 Listeing port 와 communication port가 다르므로 관련부분을 설정

$ iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$ iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

iptables 일반적인 command
  https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands


iptables 사용법 참조
  https://linux.die.net/man/8/iptables
  https://www.thegeekstuff.com/2011/03/iptables-inbound-and-outbound-rules/
  https://idchowto.com/?p=38658
  https://ko.wikipedia.org/wiki/Iptables
  https://wiki.archlinux.org/index.php/Iptables
  https://linuxstory1.tistory.com/entry/iptables-%EA%B8%B0%EB%B3%B8-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%B0%8F-%EC%98%B5%EC%85%98-%EB%AA%85%EB%A0%B9%EC%96%B4
  https://pydole.tistory.com/entry/iptables-%EC%B0%A8%EB%8B%A8-%EB%A1%9C%EA%B7%B8-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-1-%EB%A1%9C%EA%B7%B8-%EB%82%A8%EA%B8%B0%EA%B8%B0


2.2 iptable 용 systemd service 설정 

  • iptable 설정 script 
service 를 위해서 사용할 iptable용 Shell Script 작성 

$ cat /usr/bin/firewall.sh
#!/bin/bash
# Configure iptables firewall

# Limit PATH
PATH="/sbin:/usr/sbin:/bin:/usr/bin"

firewall_start() {

  # interface lo (loopback)
  # Accept everything on loopback
  iptables -A INPUT  -i lo -j ACCEPT
  iptables -A OUTPUT -o lo -j ACCEPT

  #
  # default setting 
  #
  iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

  #
  # ping 
  #
  iptables -A INPUT -p icmp -j ACCEPT
  iptables -A OUTPUT -p icmp -j ACCEPT

  #
  # SSH Server TCP Destination Port 22 (dport)
  # 
  iptables -A INPUT  -p tcp --dport 22 -j ACCEPT  

  #
  # SSH Client TCP Destination Port 22 
  # 
  iptables -A OUTPUT -p tcp --dport 22  -j ACCEPT

  #
  # Default Policy 
  #
  iptables -P INPUT   DROP
  iptables -P FORWARD DROP
  iptables -P OUTPUT  ACCEPT
  #iptables -P OUTPUT  DROP
}

firewall_stop() {
  # iptable flush setting
  iptables -F
  # iptable delete all of chains
  iptables -X
  # iptable default policy setting 
  iptables -P INPUT   ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -P OUTPUT  ACCEPT
}

# execute action
case "$1" in
  start|restart)
    echo "Start firewall, your setting"
    firewall_stop
    firewall_start
    ;;
  stop)
    echo "Stop firewall, default setting"
    firewall_stop
    ;;
esac


  • systemd service file 설정

$ vi /lib/systemd/system/firewall.service
or 
$ vi /etc/systemd/system/firewall.service     // etc로 추천 

[Unit]
Description=iptables firewall service
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/firewall.sh start
RemainAfterExit=true
ExecStop=/usr/bin/firewall.sh stop
StandardOutput=journal

## multi-user.target 
[Install]
WantedBy=multi-user.target

$ systemctl status firewall.service

$ systemctl enable firewall.service     // enable 시 아래의 주소로 link 생성되며 동작 

$ ls /etc/systemd/system/multi-user.target.wants/firewall.service  // 상위 install 

$ systemctl start firewall.service  
or
$ init 6  // reboot

iptables의 shellscript 관련예제
    https://blog.sleeplessbeastie.eu/2018/10/01/how-to-make-iptables-configuration-persistent-using-systemd/

4/05/2020

Yocto 에서 syslogd/logrotate 와 Package 중복사용

1. syslogd 와 logrotate 관련 사항 

syslogd 관련이해
Yocto에 추가하기 전에 syslog를 먼저 이해하도록하자 


Yocto Recipe 작성방법 


Yocto에서 syslogd를 사용할 경우 일반적으로 busybox에 포함된 package로 많이 사용할 것이며, 그 기준으로 설명한다.

기본적으로 syslogd 와 logrotate 는 busybox에서 제공해주지만, 완벽한 기능이 아니라서 별도로 각가 설치를 해주면 된다. 

  • logrotate package 지원
busybox에서도 logrotate를 지원해주지만, logrotate package를 설치하는 것이 더 좋다 

IMAGE_INSTALL += "logrotate" 

  • rsyslogd or syslog-ng package 지원 
busybox의 syslogd가 기본지원이지만 확장하고자 하면 설정하며, ubuntu가 rsyslogd 사용하여 나중에 이것으로 사용
IMAGE_INSTALL += "rsyslog" 

1.1. busybox의 사용할 경우 한계


busybox의 syslogd의 경우 좀 특별하게 설정이 되며, 설정에 따라 rotate의 기능이 기본제공이 되며 아래와 같이 동작된다.
예를들면, 200K 기준으로 2개의 Message들을 보관하고 2개로 Rotate를 진행하는데, 이 부분은 아래의 소스를 참조
  1. /var/log/messages    (latest)
  2. /var/log/messages.0  (200k까지 보관)

busybox 소스에서 200K로 1번의 rotate가 가능하며, 이부분은 소스에서 직접수정가능

이 busybox의 rotate 기능은  logrotate기능과는 너무 부족하므로 , logrotate를 별도로 사용할 경우 사용중지하는 것이 맞을 것 같다. 

/var/log/messages.0 관련내용 
  https://www.unix.com/unix-for-dummies-questions-and-answers/183205-why-there-var-adm-messages-0-messages-1-messages-2-messages-3-a.html


  • busybox-syslogd 와 rotate 기능 소스분석 
busybox의 syslogd 소스를 분석을 해보면 아래와 같이 200K 저장되는 Logrotate기능이 내부에 별도로 존재한다.
busybox 말고 별도의 Logrotate Package를 사용하고자 하면 CONFIG_FEATURE_ROTATE_LOGFILE 부분을 막자

.........
//config:config SYSLOGD
//config:	bool "syslogd (13 kb)"
//config:	default y
//config:	help
//config:	The syslogd utility is used to record logs of all the
//config:	significant events that occur on a system. Every
//config:	message that is logged records the date and time of the
//config:	event, and will generally also record the name of the
//config:	application that generated the message. When used in
//config:	conjunction with klogd, messages from the Linux kernel
//config:	can also be recorded. This is terribly useful,
//config:	especially for finding what happened when something goes
//config:	wrong. And something almost always will go wrong if
//config:	you wait long enough....
//config:config FEATURE_ROTATE_LOGFILE
//config:	bool "Rotate message files"
//config:	default y
//config:	depends on SYSLOGD
//config:	help
//config:	This enables syslogd to rotate the message files
//config:	on his own. No need to use an external rotate script.
.........
typedef struct logFile_t {
	const char *path;
	int fd;
	time_t last_log_time;
#if ENABLE_FEATURE_ROTATE_LOGFILE
	unsigned size;
	uint8_t isRegular;
#endif
} logFile_t;
.....

#if ENABLE_FEATURE_ROTATE_LOGFILE      // LOG 사이즈 200K 확인 
 .logFileSize = 200 * 1024,
 .logFileRotate = 1,
#endif

......

ENABLE_FEATURE_ROTATE_LOGFILE 관련소스확인
  https://git.busybox.net/busybox/tree/sysklogd/syslogd.c

  • Yocto 의 Busybox 관련 Recipe 분석

$ find . -name busybox*bb*  // Yocto의 busybox recipe 모두 확인하며, 중복되면 Version 높은것만 확인  
./meta-fsl-bsp-release/imx/meta-bsp/recipes-core/busybox/busybox_%.bbappend  // 3. 최종 bbappend 확인  
./poky/meta/recipes-core/busybox/busybox_1.30.1.bb        // 1. Main busybox recipe 
./poky/meta/recipes-core/busybox/busybox-inittab_1.30.1.bb       // SysVinit 일 경우 /etc/inittab 사용, 미사용
./poky/meta-skeleton/recipes-core/busybox/busybox_%.bbappend
./poky/meta-poky/recipes-core/busybox/busybox_%.bbappend  // 2. Main busybox recipe의 bbappend 반드시 확인  

// 1.Main busybox recipe 기반으로 분석 및 관련 cfg 와 patch 확인
$ cat ./poky/meta/recipes-core/busybox/busybox_1.30.1.bb  
require busybox.inc

SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \
           file://busybox-udhcpc-no_deconfig.patch \
           file://find-touchscreen.sh \
           file://busybox-cron \
           file://busybox-httpd \
           file://busybox-udhcpd \
           file://default.script \
           file://simple.script \
           file://hwclock.sh \
           file://mount.busybox \
           file://syslog \
           file://syslog-startup.conf \
           file://syslog.conf \
           file://busybox-syslog.default \
           file://mdev \
           file://mdev.conf \
           file://mdev-mount.sh \
           file://umount.busybox \
           file://defconfig \
           file://busybox-syslog.service.in \
           file://busybox-klogd.service.in \
           file://fail_on_no_media.patch \
           file://run-ptest \
           file://inetd.conf \
           file://inetd \
           file://login-utilities.cfg \
           file://recognize_connmand.patch \
           file://busybox-cross-menuconfig.patch \
           file://0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch \
           file://mount-via-label.cfg \
           file://sha1sum.cfg \
           file://sha256sum.cfg \
           file://getopts.cfg \
           file://resize.cfg \
           ${@["", "file://init.cfg"][(d.getVar('VIRTUAL-RUNTIME_init_manager') == 'busybox')]} \
           ${@["", "file://mdev.cfg"][(d.getVar('VIRTUAL-RUNTIME_dev_manager') == 'busybox-mdev')]} \
           file://syslog.cfg \
           file://inittab \
           file://rcS \
           file://rcK \
           file://makefile-libbb-race.patch \
           file://0001-testsuite-check-uudecode-before-using-it.patch \
           file://0001-testsuite-use-www.example.org-for-wget-test-cases.patch \
           file://0001-du-l-works-fix-to-use-145-instead-of-144.patch \
           file://0001-dc.tests-fix-two-test-case-to-also-depend-on-DC_BIG.patch \
"
SRC_URI_append_libc-musl = " file://musl.cfg "

SRC_URI[tarball.md5sum] = "4f72fc6abd736d5f4741fc4a2485547a"
SRC_URI[tarball.sha256sum] = "3d1d04a4dbd34048f4794815a5c48ebb9eb53c5277e09ffffc060323b95dfbdc"

$ cat ./poky/meta-poky/recipes-core/busybox/busybox_%.bbappend // 2. Main busybox recipe의 bbappend 반드시 확인  
FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
///BPN 은 일반적으로 PN Package Name 의 Version 이라고 하는데 다만 prefix 와 suffix가 제거된상태 

$ ls ./poky/meta-poky/recipes-core/busybox/  // bbappend 에 적용되는 busybox directory 확인  
busybox  busybox_%.bbappend

// 3. 최종 bbappend 과 관련파일 반드시 확인  
$ cat ./meta-fsl-bsp-release/imx/meta-bsp/recipes-core/busybox/busybox_%.bbappend 

# look for files in the layer first
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

SRC_URI += "file://ftpget.cfg"

// Yocto의 경우 다른 *.cfg / *.patch 
$ ls ./poky/meta/recipes-core/busybox/busybox/


1.2. busybox의 logrotate 제거 

  • Busybox의 Config 설정변경 (Yocto)
기본 config에서 CONFIG_FEATURE_ROTATE_LOGFILE 설정제거(*.cfg 이용)
이미 IMAGE_INSTALL에 logrotate 추가했다면 상위 CONFIG를 제거

$ cat ./poky/meta-poky/recipes-core/busybox/busybox/poky-tiny/defconfig  // 기본 busybox Config
...
#
# System Logging Utilities
#
CONFIG_SYSLOGD=y
CONFIG_FEATURE_ROTATE_LOGFILE=y
CONFIG_FEATURE_REMOTE_LOG=y
CONFIG_FEATURE_SYSLOGD_DUP=y
CONFIG_FEATURE_SYSLOGD_CFG=y
CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
CONFIG_FEATURE_IPC_SYSLOG=y
CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16
CONFIG_LOGREAD=y
CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
CONFIG_KLOGD=y
CONFIG_FEATURE_KLOGD_KLOGCTL=y
CONFIG_LOGGER=y

// Recipe의 *.cfg의 추가 config가 존재한다면, 이 값에 따라 변경 (주의)
$ cat ./poky/meta/recipes-core/busybox/busybox/syslog.cfg 
CONFIG_SYSLOGD=y
# CONFIG_FEATURE_ROTATE_LOGFILE is not set
CONFIG_FEATURE_REMOTE_LOG=y
CONFIG_FEATURE_SYSLOGD_DUP=y
CONFIG_FEATURE_SYSLOGD_CFG=y
CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
CONFIG_FEATURE_IPC_SYSLOG=y
CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=64
CONFIG_LOGREAD=y
CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
CONFIG_FEATURE_KMSG_SYSLOG=y 

설정참고
  https://stackoverflow.com/questions/41868231/how-to-setup-syslog-in-yocto

  • syslog.conf 관련설정 부분 확인

$ find . -name syslog.conf
$ cat ./poky/meta/recipes-core/busybox/files/syslog.conf     // 이곳에서 /etc/syslog.conf 수정하면 적용됨
$ cat ./poky/meta/recipes-extended/sysklogd/files/syslog.conf  // /etc/syslog.conf 확장이라고 추정 

// sysVinit 일 경우, systemd만 사용할 경우는 제외(추후 확인)
$ cat ./poky/meta/recipes-core/busybox/files/syslog-startup.conf   
# This configuration file is used by the busybox syslog init script,
# /etc/init.d/syslog[.busybox] to set syslog configuration at start time.

DESTINATION=file  # log destinations (buffer file remote)
LOGFILE=/var/log/messages # where to log (file)
REMOTE=loghost:514  # where to log (syslog remote)
REDUCE=no   # reduce-size logging
DROPDUPLICATES=no  # whether to drop duplicate log entries
#ROTATESIZE=0   # rotate log if grown beyond X [kByte]
#ROTATEGENS=3   # keep X generations of rotated logs
BUFFERSIZE=64   # size of circular buffer [kByte]
FOREGROUND=no   # run in foreground (don't use!)
#LOGLEVEL=5   # local log level (between 1 and 8)


yocto 사용시 busybox syslogd 설정
  https://stackoverrun.com/ko/q/11519947


2. busybox 이외 Package 사용시 문제사항


Linux에서 필요한 기본 Util들을 다루며, Embedded에서는 대부분 BusyBox를 사용하지만, 좀 더 나은 binary를 사용하고자 하면, 
util-linux 와 각 Package들이 겹치고 다른 Package들과 겹치는 문제가 자주 생긴다. 


2.1 util-linux 와 busybox package 중복될 경우 

Yocto 내부에서 Package가 중복이 될 때 사용하는 class로 update-alternatives.class를 사용하며, 이 부분을 이해하자.

  • util-linux 의 Package List
Util Linux의 Package 관련사항 
  https://en.wikipedia.org/wiki/Util-linux


  • util-linux Package 추가 (중요)
대부분 Yocto에서 core-Image-base로 build 할 경우 util-linux를 미사용을 하는데, busybox대신 혹은 같이 사용할 경우 반드시 추가

IMAGE_INSTALL += "util-linux"


  • update-alternatives 관련사항
util-linux을 보면 동일한 프로그램이 여러 Package에서 중복 설치가 발생할 수 있으므로, 각각의 중복이 될 경우 대체(ALTERNATIVE)를 사용하여, 이를 해결하도록 한다.  

특히 busybox 와 binutils 와 util-linux 부분이 될 것 같으며, 이런 Package가 설치가 되어 중복이 되는 것을 피하기 위해서 이 class를 사용한다.
피하는 방법은 rename 방식으로 이를 link를 만들어 사용하는 것이므로 기본 사용법은 알아두자.
   
  ALTERNATIVE : 중복이 될 경우 대체가 될 command들을 기술 
  ALTERNATIVE_LINK_NAME: 중복이 되면 실제 위치들을 각 기술 
  ALTERNATIVE_PRIORITY: 중복이 되면, 이값을 각 기술하여 설치 우선순위 결정  
  ALTERNATIVE_TARGET: 기본으로 ALTERNATIVE_LINK_NAME값과 동일하며, 링크생성

Warrior(2.7)
Fido(1.8)



2.2 util-linux recipe 소스 분석 (intel)

먼저 IMAGE_INSTALL 에 util_linux가 추가되어있어야 동작가능하며,  busybox 설치되어있는 경우, 각 설정을 ALTERNATIVE로 설정  

  • util-linux 기본분석 (Intel Yocto)
  1. SRC_URI를 이용하여 util-linux 소스 download
  2. PACKAGES 에 사용하고자하는 util-linux-xxx PACKAGE들을 추가 
  3. FILE_util-linux-xxxx 사용할 PACKAGE들의 저장장소 설정 
  4. ALTERNATIVE_PRIORITY 전체 대체될 Package들 우선순위 busybox 조율 
  5. ALTERNATIVE_${PN} 안에 대체가 될 Package 들 기술
  6. ALTERNATIVE_util-linux-hwclock 상위와 동일하지만, PN 직접기술 
  7. ALTERNATIVE_LINK_NAME busybox 의 것들을 기술
  8. ALTERNATIVE_TARGET  default link를 생성하여 실제 사용결정   
Intel의 Yocto는 busybox 와 겹치는 경우 util-linux 실제 설정 


2.3 util-linux recipe 소스 분석 (poky)

먼저 IMAGE_INSTALL 에 util_linux가 추가되어있어야 동작하며, 기본소스를 보면 대체적으로, 이미 busybox 설치될 경우 util-linux로 대체됨 

  • Poky에서 util-linux 부분 분석
  1. SRC_URI를 이용하여 BP 즉 Base Recipe 이름과 동일하게 Download
  2. PACKAGES =+ "${PN}-swaponoff"  , 이 util-linux-swaponoff는 나중에 추가
  3. PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'pylibmount', '${PN}-pylibmount', '', d)}"  는 util-linux-pylibmount  미리 추가 
  4. PACKAGE_PREPROCESS_FUNCS =+ "util_linux_binpackages "   python 함수 사용
  5. PACKAGESPLITFUNCS =+ "util_linux_libpackages"  python 함수 사용
  6. python 함수를 분석을 해봐도 PACKAGE는 두개만 사용함 

  • util_linux_binpackages 의 pkg_hook 함수 분석
  1. PACKAGE들을 읽어서 RRECOMMENDS_ 추가 (PACKAGE의 종속성문제)
  2. ALTERNATIVE_PN 가 존재하면 return 종료
  3. ALTERNATIVE_LINK_NAME 이 module 과 동일하면 ALTERNATIVE_PN 설정
    
  • util_linux_binpackages (말그대로 util-linux package 관리)
이상한 것은 PACKAGES do_split_packages로 구분관리하는것이 조금 이상하지만, 일단 이해만 하도록하자. 
.....
// 아래부터 시작되며, PACKAGES 대신 직접 함수로 Package 관리 
    bindirs = sorted(list(set(d.expand("${base_sbindir} ${base_bindir} ${sbindir} ${bindir}").split())))
    for dir in bindirs:
        do_split_packages(d, root=dir,
                          file_regex=r'(.*)', output_pattern='${PN}-%s',
                          description='${PN} %s',
                          hook=pkg_hook, extra_depends='')
    .......

  1. do_split_packages 함수 이용하여 PACKAGE관리하며, 매번 pkg_hook 호출 
  2. 중략
  3. 결론적으로 ALTERNATIVE를 비롯하여 FILE을 자동관리


추가시 busybox 대신 util-linux 용 package가 변경됨