필자가 사용하는 i.MX8에서 급하게 처리해느라 rc-loca.service를 이용하여 부팅이후 사용하고자하는 프로그램이 바로 구동 되도록 하였다. 

     

    예를들면 다음과 같다. 

     

    /etc/rc.local

    #!/bin/bash

    monitor &

    tester

    exit 0

     

    이렇게 되어있을 때 실행파일 monitor는 백그라운드에서 실행되고 포그라운드에서는 tester라는 프로그램이 동작된다. 

    문제는 필요에 의해서 tester를 백그라운드에 둘수가 없는 경우가 발생했다. 이러한 문제는 각각의 애플리케이션을 만든 개발자가 다른경우 발생할 가능성이 높다. 

     

    어쨋든, 이렇게 사용중 전원을 갑자기 차단한경우 다시 실행하면 tester 바이너리가 동작되지 않는 현상이 발생될 수 있다. 또한 이경우 파일 정보를 보면 바이너리 크기가 0으로 되어있는 것을 볼수 있다. 웃긴건 장치나 이런 것들은 Open해서 사용하지만 바이너리 자체를 오픈하지는 않는데 말이다. 

     

    해당 문제는 스크립트에 의해 프로그램이 동작되어 스크립트가 종료하지 못하는 상태에서 발생되므로 실행 바이너리를 보호하면서 별도로 관리데몬을 만들지 않는 편리한 방법을 생각해야 된다. 

     

     

    필자의 예상대로라면 가장 편리한 방법은 tester를 메모리에 올려두고 사용하는 방법이 가장 좋겠다 싶었다. 오래전 임베디드 시스템의 경우 필요에 의해서 리눅스 시스템 전체를 램디스크를 이용했지만, 지금은 그렇게 까지 불편하게 사용할 필요는 없을 것 같고, 물론 상용으로 판매되는 시스템이라면 충분히 고려해야 되는 사항이지만, 현재로서는 고려하고 있지는 않다. 손대면 해야될 일이 많아지니까 말이다. 

     

    그래서 램디스크를 이용하여 문제를 해결하고자 한다. 최근 임베디드 시스템은 emmc를 사용하는 케이스가 많으니 파일이 설사 지워지더라도 재부팅되면 다시 메모리에 탑재되면되고 말이다.

     

    1. 램디스크 생성

    우선 램디스크를 생성하기 위해서 마운트(연결)할 디렉터리를 생성한다.

    $ sudo mkdir /mnt/ramdisk

     

     

    2. 램디스크 마운트 / 언마운트

      16M의 크기를 가진 램디스크를 생성한다.

    $ sudo mount -t tmpfs -o size=16M tmpfs /mnt/ramdisk

     

      만약 램디스크의 사용이 완료되면 재부팅하면 없어지겠지만, 재부팅 하지 않고 램디스크를 삭제하려면 다음과 같이 진행할 수 있다. 

     

    $ sudo rm -rf /mnt/ramdisk/*

    $ sudo umoount /mnt/ramdisk

     

     

    3. 생성확인

    $ df
      Filesystem     1K-blocks    Used Available Use% Mounted on
      /dev/root       14952368 1283864  12889240  10% /
      devtmpfs          694040       0    694040   0% /dev
      tmpfs            1021944       0   1021944   0% /dev/shm
      tmpfs             408780    2624    406156   1% /run
      tmpfs               5120       0      5120   0% /run/lock
      tmpfs              16384      20     16364   1% /mnt/ramdisk    <--- 16 MByte
      tmpfs             204388       0    204388   0% /run/user/0

     

     

    4. 파일 생성과 리부팅

      파일을 하나 터치해주고, 리부팅후 /mnt/ramdisk에 파일이 유지되는지 확인해 보자.  정상적이라면 당연히 파일을 사라져야 한다. 램은 시스템이 초기화 되거나 전원이 차단되었다 다시 인가되면 데이터가 사라지니까 말이다. 

    $ sudo cd /mnt/ramdisk

    $ sudo touch myfile

    $ ls

    drwxrwxrwt 2 root root   60 Jan  4 14:15 .
    drwxr-xr-x 3 root root 4096 Jan  4 11:13 ..
    -rw-r--r-- 1 root root    0 Jan  4 14:15 myfile

     

    램디스크가 맞는지 확인하려면 여기서 리부팅해서 다시 파일 정보를 확인해보자.

    $ sudo cd /mnt/ramdisk

    $ ls

    total 4
    drwxrwxrwt 2 root root   40 Apr 13  2021 .
    drwxr-xr-x 3 root root 4096 Jan  4 11:13 ..

     

     

    5. 자동으로 램디스크 생성

      자동으로 램디스크를 부팅때마다 생성되게 하려면 아래와 같이  /etc/fstab을 수정하여야 한다.

    필자의 i.mx8m의 fstab내용이다.

      /dev/root            /                    auto       defaults              1  1
      tmpfs               /mnt/ramdisk         tmpfs      defaults,size=16M     0  0


    수정후 재부팅하여 df명령을 통해 ramdisk가 마운트 되어있음을 확인한다.

    $ df
      Filesystem     1K-blocks    Used Available Use% Mounted on
      /dev/root       14952368 1283864  12889240  10% /
      devtmpfs          694040       0    694040   0% /dev
      tmpfs            1021944       0   1021944   0% /dev/shm
      tmpfs             408780    2624    406156   1% /run
      tmpfs               5120       0      5120   0% /run/lock
      tmpfs              16384      20     16364   1% /mnt/ramdisk    <--- 16 MByte
      tmpfs             204388       0    204388   0% /run/user/0

     

      또한, 앞으로 계속 사용할 계획이 아니랴면 추가한 /mnt/ramdisk 라인만 삭제하거나 #으로 주석처리한다. 

     

     

    6. 자동실행 스크립트(/etc/rc.local) 수정

     다음과 같이 스크립트 파일을 수정한다. 

      #!/bin/bash

      monitor &

      cp -a tester /mnt/ramdisk  # 램디스크에 복사 

      pushd /mnt/ramdisk           # Bash에서 디렉터리이동

      tester                                 #  바이너리 실행

      popd                                  # 이전경로로 이동

      exit 0                                 # 스크립트 종료

     

     

      이러면  재부팅할 때 tester가 ramdisk에 복사되고 ramdisk의 tester가 실행되면서 급하게 재부팅 되더라도 파일이 손실되지 않도록 간단하게 구현할 수 있다. 

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기