현재 최신 meta-ivi 를 파악하고자한다. 

CommonAPI 필요부분


소스코드 링크는 다음과 같다. : https://github.com/GENIVI/meta-ivi



meta-ivi Download

  • 다운로드 및 해당 브랜치로 변경

$ git clone https://github.com/GENIVI/meta-ivi.git

$ cd meta-ivi

$ git log

commit 8efbab9130de3fedd62ef5ac6ad6fe138df610d9 (HEAD -> master, origin/master, origin/HEAD)

Author: Oscar Andreasson <oscar.andreasson@pelagicore.com>

Date:   Fri May 4 11:04:32 2018 +0200


    qemu_2: Remove dependency on libusb

    

    This is a really old dependency append it's causing issues in builds

    relying on the meta-ivi layer. Removing it as it doesn't seem necessary.

    

    Signed-off-by: Oscar Andreasson <oscar.andreasson@pelagicore.com>




14.x 버전 대이다.

  • meta-ivi/meta-ivi/recipes-extended 

     - 해당경로에는 다음과 같은 놈들이 존재한다.

common-api  dlt-daemon  node-health-monitor  node-startup-controller  node-state-manager  persistence-administrator  persistence-client-library  persistence-common-object


여기서 나는 common-api 가 필요하므로 해당 폴더를 파악한다.

 capicxx-core-native_3.1.12.bb

 capicxx-dbus-native_3.1.12.bb

 capicxx-someip-native_3.1.12.bb

 common-api-c++_3.1.12.bb

 common-api-c++-dbus_3.1.12.bb

 common-api-c++-someip_3.1.12.bb


dbus 관련 패치가 존재한다.

 해당파일 : ./recipes-core-ivi/dbus/dbus_%.bbappend


FILESEXTRAPATHS_append := ":${THISDIR}/${PN}"


# add support for GENIVI CommonAPI D-Bus runtime

# - https://genivi-oss.atlassian.net/wiki/display/COMMONAPICPP/CommonAPI-cpp

SRC_URI_append = " \

    file://capi-dbus-add-send-with-reply-set-notify.patch \

    file://capi-dbus-add-support-for-custom-marshalling.patch \

    file://0001-dbus-fix-possible-uninitialized-variable.patch \

    "

SRC_URI_append_qemux86 = " file://build_fix-ubunt1604-qemux86.patch"


dbus 관련하여 어떠한 패치들이 존재하는지 검토해본다.

현재 존재하는 패치는 다음과 같다. 

0001-dbus-fix-possible-uninitialized-variable.patch  

 capi-dbus-add-support-for-custom-marshalling.patch          

 capi-dbus-send-with-reply-and-block-delete-reply-on-error.patch

 build_fix-ubunt1604-qemux86.patch                    

 capi-dbus-block-acquire-io-path-on-send.patch

 capi-dbus-add-send-with-reply-set-notify.patch     

 capi-dbus-correct-dbus-connection-block-pending-call.patch



capi-dbus 패치관련하여 파헤쳐 볼것이다.


 capi-dbus-add-support-for-custom-marshalling.patch   

+add dbus/dbus-message.c

dbus_bool_t

dbus_message_set_signature (DBusMessage *message,

                            const char  *signature)

{

  _dbus_return_val_if_fail (message != NULL, FALSE);

  _dbus_return_val_if_fail (!message->locked, FALSE);

  _dbus_return_val_if_fail (signature == NULL ||

                            _dbus_check_is_valid_signature (signature), FALSE);

  /* can't delete the signature if you have a message body */

  _dbus_return_val_if_fail (_dbus_string_get_length (&message->body) == 0 ||

                            signature != NULL, FALSE);


  return set_or_delete_string_field (message,

                                     DBUS_HEADER_FIELD_SIGNATURE,

                                     DBUS_TYPE_SIGNATURE,

                                     signature);

}




+dbus/dbus-string.h


 #define _dbus_string_get_allocated(s) (((DBusString*)(s))->dummy3 - _DBUS_STRING_ALLOCATION_PADDING)

#ifndef _dbus_string_get_allocated

int           _dbus_string_get_allocated         (const DBusString  *str);

#endif /* !_dbus_string_get_allocated */




'Yocto > GENIVI' 카테고리의 다른 글

[eclipse]Franca IDL 설치  (0) 2018.05.23
CommonAPI 설치  (0) 2018.05.23



우분투 18.04 에 CommonAPI 를 설치하려고 한다.


Franca IDL 툴을 이용하여 생성한 인터페이스 소스를, CommonAPI 를 통해 연결할수 있다. 


CommonAPI 는 dbus 라이브러리와 연관되어 있으며  , 기능을 적용하기 위해서 dbus 라이브러리에 관련 패치들이 추가되어야 한다.



먼저 사용하는 Ubuntu  버전의 dbus 버전 정보를 확인한다.


dpkg -l |grep dbus


 ii  at-spi2-core                               2.28.0-1                            amd64        Assistive Technology Service Provider Interface (dbus core)

ii  dbus                                       1.12.2-1ubuntu1                     amd64        simple interprocess messaging system (daemon and utilities)

ii  dbus-user-session                          1.12.2-1ubuntu1                     amd64        simple interprocess messaging system (systemd --user integration)

ii  dbus-x11                                   1.12.2-1ubuntu1                     amd64        simple interprocess messaging system (X11 deps)

ii  gir1.2-dbusmenu-glib-0.4:amd64             16.04.1+18.04.20171206-0ubuntu1     amd64        typelib file for libdbusmenu-glib4

ii  libdbus-1-3:amd64                          1.12.2-1ubuntu1                     amd64        simple interprocess messaging system (library)

ii  libdbus-1-dev:amd64                        1.12.2-1ubuntu1                     amd64        simple interprocess messaging system (development headers)

ii  libdbus-glib-1-2:amd64                     0.110-2                             amd64        deprecated library for D-Bus IPC

ii  libdbusmenu-glib4:amd64                    16.04.1+18.04.20171206-0ubuntu1     amd64        library for passing menus over DBus

ii  libdbusmenu-gtk3-4:amd64                   16.04.1+18.04.20171206-0ubuntu1     amd64        library for passing menus over DBus - GTK+ version

ii  libdbusmenu-gtk4:amd64                     16.04.1+18.04.20171206-0ubuntu1     amd64        library for passing menus over DBus - GTK+ version

ii  libnet-dbus-perl                           1.1.0-4build2                       amd64        Perl extension for the DBus bindings

ii  libqt5dbus5:amd64                          5.9.5+dfsg-0ubuntu1                 amd64        Qt 5 D-Bus module

ii  python3-dbus                               1.2.6-1                             amd64        simple interprocess messaging system (Python 3 interface)



대충  1.12.2-1ubuntu1을 사용하는 것으로 추측된다.



구글 검색 : 1.12.2-1ubuntu1 dbus

다음 우분투 서버의 패키지 정보가 보여진다.

 https://launchpad.net/ubuntu/+source/dbus/1.12.2-1ubuntu1


dbus_1.12.2.orig.tar.gz2.0 MiB272bb5091770b047c8188b926d5e6038fa4fe6745488b2add96b23e2d9a83d88
dbus_1.12.2-1ubuntu1.debian.tar.xz61.0 KiB7c968a77cc7f8512229f190b51a619cf7b5901db0cf43fcae6c367eff1ede78c


위 두파일을 다운로드한다.


Common API 호출 방식 



CommonAPI C++ Overview



Common API 구조

CommonAPI C++ Overview



Download Source 


  • capicxx-core-runtime

$ git clone https://github.com/GENIVI/capicxx-core-runtime.git

$ cd capicxx-core-runtime/

$ git checkout 3.1.12.4


  • capicxx-dbus-runtime (dbus-patch 파일이 존재한다. src/dbus-patches)

$ git clone https://github.com/GENIVI/capicxx-dbus-runtime.git

$ cd capicxx-dbus-runtime

$ git checkout 3.1.12.4



설치순서 dbus Ubuntu Source Download -> capicxx-dbus-runtime 패치 적용 (dbus) -> dbus 라이브러리 설치이후 관련 라이브러리들을 설치한다.

 dbus 설치 -> dlt-daemon 설치-> capicxx-core-runtime -> capicxx-dbus-runtime 설치순으로 진행


특정 폴더에 dbus_1.12.2.orig.tar.gz , dbus_1.12.2-1ubuntu1.debian.tar.xz 압축을 해제한다.

1. ubuntu 용 패치를 적용한다.


$ cd  debian/patches/ubuntu

$ cp * ../../../dbus-1.12.2/

$ patch -p1 < aa-get-connection-apparmor-security-context.patch

patching file bus/apparmor.c

patching file bus/apparmor.h

patching file bus/driver.c

patching file dbus/dbus-protocol.h


$ patch -p1 < dont-stop-dbus.patch
patching file bus/dbus.service.in
$ rm aa-get-connection-apparmor-security-context.patch dont-stop-dbus.patch


2. capicxx-dbus-runtime 폴더에 존재하는 패치를 적용한다.


capi-dbus-1-pc.patch

capi-dbus-add-send-with-reply-set-notify.patch

capi-dbus-add-support-for-custom-marshalling.patch

capi-dbus-block-acquire-io-path-on-send.patch

capi-dbus-correct-dbus-connection-block-pending-call.patch

capi-dbus-send-with-reply-and-block-delete-reply-on-error.patch


$ cd  capicxx-dbus-runtime/src/dbus-patches

$ cp * /home/kj/GENIVI/CommonAPI/dbus/dbus-1.12.2

$ patch -p1 < capi-dbus-1-pc.patch
patching file dbus-1.pc.in
Hunk #1 succeeded at 19 (offset 1 line).

$ patch -p1 < capi-dbus-add-send-with-reply-set-notify.patch
patching file dbus/dbus-connection.c
Hunk #1 succeeded at 3500 (offset 18 lines).
patching file dbus/dbus-connection.h
Hunk #1 succeeded at 230 (offset 1 line).

$ patch -p1 < capi-dbus-add-support-for-custom-marshalling.patch
patching file dbus/dbus-message.c
Hunk #1 succeeded at 3746 (offset 301 lines).
Hunk #2 succeeded at 5050 (offset 377 lines).
patching file dbus/dbus-message.h
Hunk #1 succeeded at 170 (offset 32 lines).
Hunk #2 succeeded at 302 with fuzz 1 (offset 37 lines).
patching file dbus/dbus-string.c
Hunk #1 succeeded at 744 (offset 14 lines).
patching file dbus/dbus-string.h

$ patch -p1 < capi-dbus-block-acquire-io-path-on-send.patch
patching file dbus/dbus-connection.c

$ patch -p1 < capi-dbus-correct-dbus-connection-block-pending-call.patch
patching file dbus/dbus-connection.c
Hunk #1 succeeded at 2526 (offset 1 line).

$ patch -p1 < capi-dbus-send-with-reply-and-block-delete-reply-on-error.patch
patching file dbus/dbus-connection.c
Hunk #1 succeeded at 3736 (offset 27 lines).
Hunk #2 succeeded at 6527 (offset 84 lines).


3. dbus Library Build


 sudo  mkdir -p /opt/GENIVI

 sudo chmod 777 /opt/GENIVI/

cd /home/kj/GENIVI/CommonAPI/dbus/dbus-1.12.2

$ ./configure --prefix=/opt/GENIVI/


No package 'expat' found

$ sudo apt-get install expat
$ sudo apt-get install libexpat1-dev
다시설치
$ ./configure --prefix=/opt/GENIVI/
$ make -C dbus -j8
$ make -C dbus install
$ make install-pkgconfigDATA
$ export PKG_CONFIG_PATH="/opt/GENIVI/lib/pkgconfig:$PKG_CONFIG_PATH"


configure 결과

  D-Bus 1.12.2

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


prefix:                   /opt/GENIVI

exec_prefix:              ${prefix}

        libdir:                   /opt/GENIVI/lib

        libexecdir:               /opt/GENIVI/libexec

        bindir:                   /opt/GENIVI/bin

        sysconfdir:               /opt/GENIVI/etc

        localstatedir:            /opt/GENIVI/var

        runstatedir:              /opt/GENIVI/var/run

datadir:                  /opt/GENIVI/share

source code location:   .

compiler:   gcc

cflags:           -fno-strict-aliasing -fno-common -Wall -Wextra -Wundef -Wnested-externs -Wwrite-strings -Wpointer-arith -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wno-unused-parameter -Wno-missing-field-initializers -Wdeclaration-after-statement -Wformat=2 -Wold-style-definition -Wcast-align -Wformat-nonliteral -Wformat-security -Wsign-compare -Wstrict-aliasing -Wshadow -Winline -Wpacked -Wmissing-format-attribute -Wmissing-noreturn -Winit-self -Wmissing-include-dirs -Wunused-but-set-variable -Warray-bounds -Wimplicit-function-declaration -Wreturn-type -Wswitch-enum -Wswitch-default -Wchar-subscripts -Wfloat-equal -Wpointer-sign -Wno-deprecated-declarations -Wno-unused-label -Wno-error=unused-parameter -Wno-error=missing-field-initializers -Wno-error=deprecated-declarations -Wno-error=unused-label 

cppflags:   

cxxflags:   -fno-strict-aliasing -Wall -Wextra -Wundef -Wwrite-strings -Wpointer-arith -Wmissing-declarations -Wredundant-decls -Wno-unused-parameter -Wno-missing-field-initializers -Wformat=2 -Wcast-align -Wformat-nonliteral -Wformat-security -Wsign-compare -Wstrict-aliasing -Wshadow -Winline -Wpacked -Wmissing-format-attribute -Wmissing-noreturn -Winit-self -Wmissing-include-dirs -Wunused-but-set-variable -Warray-bounds -Wreturn-type -Wno-overloaded-virtual -Wswitch-enum -Wswitch-default -Wchar-subscripts -Wfloat-equal -Wno-deprecated-declarations -Wno-unused-label -Wno-error=unused-parameter -Wno-error=missing-field-initializers -Wno-error=overloaded-virtual -Wno-error=deprecated-declarations -Wno-error=unused-label 

ldflags:   -Wl,--no-as-needed 

64-bit int:   long

32-bit int:   int

16-bit int:   short

        Doxygen:                  no

        xmlto:                    no

        ducktype:                 no

        yelp-build:               no


        Rebuilding generated files: yes

        gcc coverage profiling:   no

        Building embedded tests:  no

        Building modular tests:   auto

            - with GLib:          yes

        Installing tests:         no

        Building verbose mode:    no

        Building assertions:      no

        Building checks:          yes

        Building bus stats API:   yes

        Building SELinux support: no

        Building AppArmor support: no

        Building inotify support: yes

        Building kqueue support:  no

        Building systemd support: no

        Building X11 code:        yes

        Building Doxygen docs:    no

        Building Ducktype docs:   no

        Building XML docs:        no

        Building launchd support: no

        System bus socket:        /opt/GENIVI/var/run/dbus/system_bus_socket

        System bus address:       unix:path=/opt/GENIVI/var/run/dbus/system_bus_socket

        System bus PID file:      /opt/GENIVI/var/run/dbus/pid

        Session bus listens on:   unix:tmpdir=/tmp

        Session clients connect to: autolaunch:

        pam_console auth dir:     (none)

        Console owner file:       no

        Console owner file path:  

System bus user:          messagebus

Session bus services dir: /opt/GENIVI/share/dbus-1/services

        'make check' socket dir:  /tmp


dlt-daemon 설치

 git clone https://github.com/GENIVI/dlt-daemon.git

 cd dlt-daemon

 git log

commit da6eefe5cac244421c5af413c54e420717e11c9e (HEAD -> master, origin/master, origin/HEAD)

Author: ManikandanChockalingam <manikandan.chockalingam@in.bosch.com>

Date:   Fri May 18 11:17:31 2018 +0530


    IPC: Unix socket added (#43)

    

    * IPC: Unix socket added

mkdir build
cd build/
cmake -DCMAKE_INSTALL_PREFIX=/opt/GENIVI ..
make -j8
make install


오류시 

/usr/bin/x86_64-linux-gnu-ld: cannot find -ldbus-1

$ sudo apt-get install libdbus-1-dev




capicxx-core-runtime 설치


$ cd common-api-runtime

$ mkdir build

$ cd build

$ cmake -D CMAKE_INSTALL_PREFIX=/opt/GENIVI ..

sudo cp -apr dlt/ /usr/include/  <-- dlt include 패스를 잡지못하여 root 경로에 임의로 복사하였음.

$ make

$ make install



capicxx-dbus-runtime 설치


cd  capicxx-dbus-runtime

mkdir build

cd build

sudo apt-get install cmake

$ cmake -D USE_INSTALLED_COMMONAPI=ON -D CMAKE_INSTALL_PREFIX=/opt/GENIVI ..

$ make -j8

$ make install


설치완료 /opt/GENIVI/lib/pkgconfig 해당폴더에 dlt 관련 라이브러리 설정정보가 있다.

automotive-dlt.pc  CommonAPI-DBus.pc  CommonAPI.pc  dbus-1.pc




참고사이트

CommonAPI C++ :  https://genivi.github.io/capicxx-core-tools/


'Yocto > GENIVI' 카테고리의 다른 글

[eclipse]Franca IDL 설치  (0) 2018.05.23
[Yocto] meta-ivi 분석  (0) 2018.05.23

systemd 관련하여 재정리를 시작한다.



요약하면 systemd 는 부팅 중 시작하는 서비스(혹 데몬)들을 관리하는 놈이라고 볼수 있다.


부팅 시점에 정의해논 서비스들을 병렬적으로 실행 할 수 있다. 특정 서비스 동작후에 원하는 서비스가 동작하도록 정의할수 있지만 명확한 타이밍에 동작 가능하도록 하는것은 아직 모르겠다.



우분투 15.04 부터 upstart-job 대신 systemd 를 사용하고 있다. 
이전까지 리눅스는 PID 1번 프로세스가 가장 먼저 실행되어 OS 에 필요한 각종 데몬들을 init 하였다.

이전에는 서비스 실행,중지를 service <service name> start | stop | restart 의 명령으로 제어했으나, systemd 를 사용하는 시스템에서는 systemctl start | stop | restart <unit name> 으로 관리하게 된다.
upstart-job에서는 데몬들을 service라는 네이밍을 붙였고, systemd에서는 unit이라는 이름을 사용한다.
systemd에서는 <unit name>.service이라는 파일을 systemctl enable [<unit name>.service] or [unit name] 명령으로 설치를 할 수 있다.(ini 포맷사용)
systemctl enable [unit name] 명령어를 실행하면 관련 서비스를 /etc/systemd/system/[target]/ 경로에 링크파일을 생성한다.
systemctl disable[unit name] 명령어를 실행하면 링크파일을 삭제한다.

  1. systemd는 최소한의 서비스만을 실행시키고 병렬화해서 실행시키는데 주안점을 두고 있기 때문에 기존에 순차적 방식으로 처리하는 SysV에 비해서 부팅속도가 빠른 편이다.
  2. 부팅 시간을 단축 시킬(즉, 불필요한 프로세스가 있는지 여부부터 오동작으로 인해 시간을 많이 잡아먹는지) 방안에 대해서 생각해 볼 수 있다.


  • systemctl 명령어 

   systemd 와 관련된 명령어를 수행한다.

 $ systemctl == $systemctl list-units // 동일한 명령으로 list-units 들을 보여준다


  • 런레벨은 target 으로 관리
systemd는 기존 init 커맨드와 달리 숫자 기반의 런레벨이 아니라 각 런레벨에 대한 설정 세트를 통해서 런레벨을 변경한다.


SysV Runlevel 

Systemd Target 

Notes 

 0

runlevel0.target, poweroff.target 

시스템을 중지 

 1,s, single

 runlevel1.target, rescue.target

단일 사용자 모드 

 2, 4

runlevel2.target, runlevel4,target, multi-user.target

사용자 정의, 기본 3과 동일 

 3

 runlevel3.target , multi-user.target

다중 사용자, 그래픽 사용하지않음. 사용자는 콘솔이나 네트워크를 통해 다중 접속할 수 있다. 

 5

runlevel5.target, graphical.target 

 다중사용자, 그래픽. 런레벨3에서 그래픽 추가된 서비스를 제공

 6

runlevel6.target, reboot.target 

 재부팅

emvergency 

emergency.target 

Emergency shell 



현재 사용하는 런레벨을 확인한다.

# systemctl get-default

graphical.target



  • 로그관리 (syslog 에서 지정하는 debug, info, err 등) 조회도 가능하다.

       # journalctl -p err >> err


  • 유용한 명령어
    1. systemd-analyze : 부팅에 걸린시간 표시 (tcc8935 없음)
    2. systemd-analyze blame : 부팅시 서비스별 걸린 시간표시 (tcc8935 없음)
    3. journalctl : 부팅을 포함한 전체적인 시스템 로그
    4. journalctl -b : 마지막 부팅 이후 시스템 로그
    5. hostnamectl : 호스트 이름표시
    6. hostnamectl set-hostname [변경이름] : 호스트이름 변경




  • 서비스 파일 등록하는 법
    • 부팅시 서비스가 실행하게 된다.
    • 재부팅시 적용됨
    • /lib/system/systemd 폴더와 /etc/systemd/system 폴더 안에 관련 파일을 확인하고 각 시스템 폴더에 링크파일을 생성해 주는 역할을 한다. 
      $ systemctl enable [serviceName|serviceName.service]
      $ systemctl enable XX 나 systemctl enable XX.service

  • 서비스 파일 해제하는 법
    • 서비스가 등록된 링크파일을 삭제한다.
    • 재부팅시 적용됨
      $ systemctl disable [serviceName|serviceName.service]
      $ systemctl disable XX 나 systemctl disable XX.service
  • 관련 서비스 start
    • 관련된 시스템이 동작하도록 한다.
    • 현재 각 서비스 파일을 보면 Restart=on-failure 로 등록되어 어서 앱이 죽거나 kill 시 자동 restart 되어지고 있다. 재실행하지 않으려면 주석처리 -> #Restart=on-failure
      $ systemctl start XX

  • 관련 서비스 stop
    • 관련된 시스템을 중지시킨다.
    • 서비스가 동작시 해당 어플리케이션 파일을 변경시킬 수 없다. 소스변경이 이루어질시 해당 하는 서비스를 중지시키고 해야함.
      $ systemctl stop XX

참고 


'Linux > Systemd' 카테고리의 다른 글

[SYSTEMD] INSTALL 섹션 옵션  (0) 2016.07.18
[Systemd] Unit .mount 설명  (0) 2016.07.12
journalctl 정의  (0) 2016.07.12
Systemd 내용  (2) 2016.06.15

+ Recent posts