요약

1. $dmesg | grep eth0으로 renamed 된 것 확인

2. $sudo vi /etc/default/grub

3. GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 biosdevname=0" 로 수정

4. $sudo update-grub

5. $sudo reboot


ifconfig를 입력하였는데 lo밖에 출력이 안된다?


우선 dmesg를 입력해보자.

$dmesg | grep eth0


출력 결과 enxxx, p5p1 등 이상한 이름이 출력되며 마지막에 renamed eth0을 확인할 수 있다.

위의 이상한 이름이란 predictable network interface names 이라는데 난 기존 방식의 eth0을 사용하고 싶었다.


또한 ifconfig -a 를 입력하면 위의 이상한 이름과 함께 ip, mac 등을 확인할 수 있다.

출력이 안된다면 네트워크 드라이버가 올라가지 않을 수 있기 때문에 insmod를 해야한다.


방법은 간단하다.

다른 페이지에서 찾아보니 rules를 바꾸거나 하는 방법들이 있었는데 16.04를 설치한 나에게는 적용되지 않았다.


eth0의 이름을 사용하지 않을 경우에는 vi /etc/network/interfaces에서 기존 방식의 

auto eth0

iface eth0 inet dhcp

에서 eth0이름을 해당 이름으로 변경하면 된다.


eth0으로 바꾸고 싶으면?


$sudo vi /etc/default/grub


GRUB_CMDLINE_LINUX_DEFAULT="" 을

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 biosdevname=0" 로 수정해주면 된다.


$sudo update-grub

$sudo reboot

라즈베리파이 프로젝트를 진행하다 서로 다른 이미지를 구운 usb를 비교할 일이 생겼다.

기본적으로 라즈베리파이를 구운 이미지의 usb를 윈도우로 연결시에는

fat32와 ext4로 구분이 되어 fat32밖에 보이지 않는다. (리눅스에서 usb연결시 전부 보임)


1. beyond compare 다운로드

http://www.scootersoftware.com/download.php

리눅스 32bit, 64bit에 따라 다운로드 하면 된다.

현재 pc는 우분투이기 때문에 debian 파일을 다운로드 하였다.



2. package 설치

- sudo dpkg -i <파일 이름.deb>

redhat  계열의 rpm은

- rpm -ivh <파일이름.rpm>


3. 프로그램 실행

- 설치된 파일은 /usr/lib/beyondcompare 에 설치된다.

- 쉘에서 ./BCompare 또는 폴더로 들어가서 BCompare를 더블클릭하면 실행된다.
    -> 더블클릭 시 실행안됨. 
       $cd /usr/lib/beyondcompare

  $./BCompare



실행되면 밑의 그림과 같이 프로그램이 실행되며

폴더, 텍스트 등의 비교가 가능하다 ^^




부팅 시 rc.local파일에 문자를 삽입하는 일이 생겼다.

echo를 이용하여 삽입하였지만 exit 0 즉 맨 마지막 줄에 명령어가 삽입이 되어 실행이 되지 않았다.


찾던 도중 awk와 sed를 이용하여 특정라인에 추가를 하였지만 이는 추가한 내용을 출력한 것이지 갱신이 되는 것은 아니었다.


ex) awk ' {if (NR == <22:특정 열>) { print "명령어 해당 부분" ; print $0 } else { print $0 } }' <InputFile>

ex) sed -e '<22:특정 열> i\ <명령어>' <InputFile>


그러나 awk나 sed는 찾기, 출력, 치환 등 많이 사용되기 때문에 스크립트를 펄의 능력과 거의 비슷한 수준으로 끌어올릴 수 있음.


위의 방법은 InputFile에 문자열들을 읽고 22라인, 즉 설정한 특정 열에 내가 넣고 싶은 명령어를 넣고 출력하는 것 밖에 하지 못했다. 물론 >> 를 통해 덧붙이는 방법이나, > 덮어쓰기를 할 순 있었으나 별도의 파일을 만들거나, 또는 밑에 내용들이 계속 덧붙이는 더러운 파일이 생성되었다.


결론.

특정라인에 곧바로 추가하기

perl -p -i -e '$.==<22:특정열> and print "<명령어>"' <InputFile>

간혹 라즈베리파이를 사용하다가 무선랜을 잡아야 할 경우가 있다.

물론 startx를 이용하여 GUI모드로 잡는 방법이 편하지만

이번 포스팅에서는 텍스트모드에서 설정을 하고자 한다.


$lsusb        //USB 장치 목록 확인 

  //무선랜 드라이브가 보이면 연결은 된 상태


$iwlist wlan0 scan    //적용할 SSID  이름을 확인하여야 된다.

$su                 //root권한 획득 필요 (raspberry에서는 그냥 sudo su만 해줘도 super모드로 바뀜)

#wpa_passphrase "SSID_NAME" SSID_PASSWORD >> /etc/wpa_supplicant/wpa_supplicant.conf


#vi /etc/network/interfaces    //네트워크 설정


auto lo


iface lo inet loopback

iface eth0 inet dhcp


allow-hotplug wlan0

auto wlan0

iface wlan0 inet manual

wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp


#/etc/init.d/networking restart


위에서 했는데 적용이 안된다면


#vi /etc/wpa_supplicant/wpa_supplicant.conf


ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev //이부분 추가

update_config=1 //이부분 추가


network={

        ssid="AndroidHotspotxxxx"

        #psk="123456789"

        psk=14775ae036b8204a42cb0e9d6fb7d88f29ff7f4a078c8e29f53e29d5243ce4b9

}


위의 내용은 사용자의 SSID와 Password에 따라 달라진다.


위 내용 적용 후 reboot 하거나 네트워크 재시작하면 된다.

프로젝트를 하다 라즈베리파이 wheezy version중에 3.18.11을 써야 될 일이 생겼다.


github.com/raspberrypi - linux에 들어가본 결과 3.18.11은 없었다. 

홈페이지를 방문하면 최신 커널소스와 3.18의 경우에는 

1.rpi-3.18.y-rebase

2.rpi-3.18.y 

두 개를 받을 수 있는데 rebase의 경우 3.18.9, rpi-3.18.y의 경우에는 3.18.16이다.

실제로 raspbian wheezy이미지를 받으면 3.18.11이지만 해당 커널 소스를 받을 수가 없었다.


그래서 찾아본 결과 branch를 이용한 방법을 알게되었다.


1. branch  받기

$git clone --depth 500 -b rpi-3.18.y https://github.com/raspberrypi/linux linux-3.18

-> 위의 500의 경우 숫자가 크면 클수록 깊어지지만 시간이 오래걸릴 것임

   뒤의 linux-3.18은 생성되는 폴더명이기 때문에 바꿔도 무관



2. commit id 얻기

라즈베리파이의 sd카드를 리눅스 hostpc에 연결한 후 하는 것이 가장 좋다.

$sudo mount /dev/sdb1 mnt/fat32

$sudo mount /dev/sdb2 mnt/ext4

(위의 명령어를 왜 입력하는지 모르는 분들은 http://kkn1220.tistory.com/14 를 보고 오시는 걸 추천드립니다.)


$FIRMWARE_HASH=$(zgrep "* firmware as of" mnt/ext4/usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz | head -1 | awk '{ print $5 }')

  

# get git hash for this kernel

    $KERNEL_HASH=$(wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/git_hash -O -)

 

3. checkout

$git checkout $KERNEL_HASH

-> hash값 뜨면서 -b 새로운 브런치 어쩌구 나온다.

$git checkout -b $KERNEL_HASH

-> hash값으로 checkout되었다고 메시지 뜸


4. 소스빌드

$make ARCH=arm CROSS_COMPILE=<tools path>/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- bcm2709_defconfig


$make ARCH=arm CROSS_COMPILE=<tools path>/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- zImage modules dtbs


(tools path의 경우 크로스컴파일용 툴체인으로 역시 http://kkn1220.tistory.com/14 참고)


5. 모듈 설치

$sudo make ARCH=arm CROSS_COMPILE=<tools path>/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install


6. 커널이미지 생성

최신 git clone으로 github linux를 받으면 mkknlimg가 있으나 해당 버전에서는 존재하지가 않는다.

https://github.com/raspberrypi/linux/blob/rpi-3.18.y/scripts/mkknlimg에 들어가서 코드를 복사한다.

혹은 밑의 더보기를 눌러 해당 내용을 복사한다.

해당 스크립트를 linux-3.18/scripts 내에 생성한다.

예)vi linux-3.18/scripts/mkknlimg 에서 해당 스크립트 복사

주의* sudo chmod로 실행권한 줘야됨

예)$sudo chmod 755 linux-3.18/scripts/mkknlimg



$sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/kernel7.img 


7. umount

$sudo umount mnt/fat32

$sudo umount mnt/ext4


8. 확인


기존의 4.0.8-v7에서



3.18.11-v7로 바뀐 것을 확인할 수가 있다.




참고: http://www.noobslab.com/2015/10/how-to-mirror-your-android-device-in.html


기존에는 윈도우 환경에서 Mobizen을 사용하였지만 우분투환경에서는 exe 실행파일을 사용할 수 없다.

그래서 Wine을 이용하여 실행하려 하였지만 실행이 되지 않았다.

그래서 찾아본결과 adb를 이용한 seven-square를 통해 미러링을 할 수 있는 것을 확인하였다.


테스트환경

1. vmware workstation 11

2. ubuntu 14.04

(Available for Ubuntu 15.04 Vivid/15.10 Wily/14.04 Trusty/12.04 Precise/Linux Mint 17.x/13/other related Ubuntu derivatives)


설치

1. 관련 패키지 설치

sudo apt-get install android-tools-adb qt4-qmake libqt4-dev libqtcore4 libqtgui4


2. 설치파일 다운로드

wget https://github.com/yangh/sevensquare/archive/master.zip


3. 설치파일 압축해제

unzip master.zip


4. 컴파일

$ cd sevensquare-master

$ make

$ sudo make install


5. 실행

$ seven-square & (&는 background 실행, foreground실행은 &안붙이면된다)


단말이 붙지 않았기 때문에 usb로 단말을 연결시킨다.

$adb shell 로 단말 연결되는지 확인


단말을 찾을 수 없다고 에러메시지가 나올경우에는

1. 개발자 옵션이 활성화 되어있는지

2. 장치드라이버가 올바로 설치되어 있는지

3. 위에 두 개가 되었을지라도 지문 등록이 되어야 하기 때문에 단말 홈상태에서 usb 연결 시 이 컴퓨터에는 항상 이용하시겠습니까? 를 체크하였는지 확인해야함



최종적으로 단말이 붙는 것을 확인할 수 있다.



미러링은 되는데 성능은 그닥 좋지는 않은 것 같다..



지난 시간 리눅스 환경에서 dkms mkdeb을 통한 리눅스 커널 파일을 deb파일로 생성해보았다.

(http://kkn1220.tistory.com/51 참고)

이번에는 라즈베리파이용으로 커널모듈을 deb패키지로 하고자 한다.

(라즈베리파이2 크로스컴파일에 대한 내용은 http://kkn1220.tistory.com/14 를 참고하면됩니다.)


실습환경: vmware11 ubuntu-mate 14.04

타겟단말: 라즈베리파이2

타겟단말 커널버전: 4.0.9-v7+


지난 시간 /usr/src/hello-0.1 에는 리눅스 버전으로 사용하였기 때문에

이번에는 /usr/src/hello-0.2 로 생성한다.


c소스


Makefile 소스 (아래의 내용이 이해가 안가시면 http://kkn1220.tistory.com/14를 참고하시면 됩니다.)


dkms.conf 소스



준비는 끝났다.


이전 강좌와 방식이 똑같다.


1. dkms add

$sudo dkms add -m hello -v 0.2



2. dkms build

$sudo dkms build -m hello -v 0.2



3. dkms install

$sudo dkms install -m hello -v 0.2

(이미 설치하여서 그런건데 할 때 이상없음)


modinfo를 통한 모듈 확인



4. dkms mkdeb

$sudo dkms mkdeb -m hello -v 0.2


deb파일 생성 확인


scp를 통한 타겟 단말에 deb파일 전달

$scp <deb 파일> pi@192.168.0.xx:<path>


raspberry2 단말에서 전송 확인


원래는 repository에 등록하여 apt-get update 및 install을 통해 확인하려고 했으나 

시간 제약 상 dpkg를 이용하여 설치


$sudo dpkg -i hello-dkms_0.2_all.deb


raspberrypi2 단말에서 lsmod를 통하여 모듈이 올라온것을 확인.

만약 안올라올 경우 init에서 모듈이 부팅될 때 자동으로 올라오도록 설정하면됨.



지난시간과 이번시간에는 dkms mkdeb를 통하여 모듈을 deb파일로 패키징하는 것을 해보았습니다.

리눅스 host에서와 타겟 단말의 크로스 컴파일까지 같이 해보았습니다.

다음 번에는 repository 구조에 대해 포스팅하고자 합니다.


프로젝트를 진행하다 리눅스 커널모듈을 deb파일로 만들 일이 생겼다.

한참을 찾아보다 dkms(dynamic kernel module support) makedeb기능을 알게되었다.


참고: https://wiki.kubuntu.org/Kernel/Dev/DKMSPackaging


1. dkms 설치

$sudo apt-get install dkms


2. Prepare source

커널 모듈 소스를 준비해야하는데 적어도 C file과 Makefile이 포함되어야 한다.


C소스


Makefile소스


위의 두 파일은 /usr/src/<module>-<module-version>에 넣자.

본 예제에서는 /usr/src/hello-0.1 로 생성하였다.


*주의: make: Nothing to be done for `all'. 일경우에는 vi Makefile에서 all: 밑에 명시된 부분을 tab으로 했는

지 띄어쓰기로 했는지 확인할것. tab으로 해야함(clean도 마찬가지)




3. dkms.conf 파일 생성

dkms.conf파일을 생성할 것인데 이 역시 동일 폴더 즉 /usr/src/hello-0.1폴더 내에 생성


패키지 이름과 패키지 버전은 정보를 필요로 하는데 폴더네임의 정보와 동일하게 한다.

폴더이름이 hello-0.1이기 때문에 패키지네임은 hello, 버전은 0.1이 된다.


- clean은 폴더를 clean up하는 명령어로 빌드 전 실행시킨다. make clean을 하면 쏵 지워짐

- make[0]은 커널 객체를 빌드하기 위한 첫번째 커맨드

- dest-module-location은 설치될 때 커널 object를 놓기 위한 장소를 설정

예를들어, /lib/modules/$kernelver/updates 일 때 /updates/dkms에 overrade됨

이것은 결국 /lib/modules/$kernelver/updates/dkms에 놓이는 것을 의미함

비록 이러한 정보들은 overrade될지라도 이것은 여전히 필요한 필드이다.

- autoinstall에서 yes는 부팅될 때 커널 object가 설치되고 빌드를 시도하는 것을 의미하고 이것은 만약 커널에 설치가 되어있을때 리빌트나 리인스톨을 하지 않는다


위의 내용까지 한 결과는 위의 화면과 같다.

dkms를 하기까지 준비과정은 끝났다.


4. dkms add

$sudo dkms add -m hello -v 0.1



dkms add를 하게 되면 /var/lib/dkms/hello/0.1의 폴더가 생성된다.



아직 빌드를 하지 않았기 때문에 build폴더에서 ls를 할 경우 출력되지 않는다.


5. dmks build

$sudo dkms build -m hello -v 0.1 



위의 명령어를 입력하면 위의 화면처럼 completed 된것을 확인할 수 있고 build 폴더에서 ls를 할 경우 파일들이 생성


또한 0.1하위로 uname-r 의 폴더가 생성되고 밑에는 hello.ko 커널 모듈이 생성되는 것을 확인할 수 있음




6. dkms install

$sudo dkms install -m hello -v 0.1


또한 모듈 트리를 확인할 수 있다.


모듈 확인!



모듈을 삭제하고 싶으면

$sudo dkms remove -m hello -v 0.1 --all


다른 버전의 커널을 하고 싶으면!?

$sudo dkms build -m hello -v 0.1 -k 2.6.31-14-generic




7. dkms mkdeb

뭐 위에껀 중요하지 않고 이제 mkdeb을 통해 deb패키지를 만들어보자

$sudo dkms mkdeb -m hello -v 0.1


오류가 발생하였다. 이는 debhelper를 설치하지 않았기 때문이다.

$sudo apt-get install debhelper


debhelper를 설치한 후 다시 

$sudo dkms mkdeb -m hello -v 0.1    를 입력해보자.


mkdeb completed 된 것을 확인할 수 있다.


이 deb파일은 /var/lib/dkms/hello/0.1/deb에 위치한다.


deb파일 상세 확인

$lesspipe hello-dkms_0.1_all.deb



다음번에는 같은 방식으로 raspberry파일로 크로스컴파일을 할 것이다.

실습환경: vmware 11 ubuntu-mate 14.04


우분투 repository에는 간혹 원하는 패키지들이 존재하지 않을 경우가 있다.

이를 위해 personal repository를 만들어보고자 한다.


참고: https://help.ubuntu.com/community/Repositories/Personal (뭐 사실 동일)

단계

1. Install dpkg-dev

2. Put the packages in a directory

3. Create a script that will scan the packages and create a file apt-get update can read

4. Add a line to your sources.list pointing at your repository


단계를 실시하기전에 apt-get 명령어 정리 참고


1. Install dpkg-dev

$sudo apt-get install dpkg-dev


2. The Directory

패키지를 유지하고 싶은 곳에 디렉토리를 생성. 본 예제에서는 /usr/local/mydebs 경로 사용

$sudo mkdir -p /usr/local/mydebs        //-p는 하위디렉토리까지 생성할 때 쓰인다.

아래의 사진은 /usr/local/mydebs 내에 샘플 deb패키지를 넣음

(http://kkn1220.tistory.com/51 위의 샘플 deb 만드는 방법(커널모듈을 deb파일로 생성함))


3. The script update-mydebs

update-mydebs 스크립트 만들기


위의 매뉴얼을 살펴보면 update-mydebs 스크립트 파일을 ~/bin에 저장하라고 권고

(만약 존재하지 않을 경우 만들라고 까지..... 근데 뭐 사실 그닥 중요하진 않은듯)

-매뉴얼-

Cut and paste the above into gedit, and save it as update-mydebs in ~/bin. 

(the tilde '~' means your home directory. If ~/bin does not exist, create it: Ubuntu will put that directory in your PATH. 

It's a good place to put personal scripts). 


굳이 ~/bin에 넣을 필요를 못느껴서 desktop에 스크립트 파일 생성


다음으로 스크립트를 실행하기 위해서는 권한을 줘야됨

$chmod u+x ~/bin/update-mydebs

(위의 명령은 change mode로 실행권한인 x를 주는 것을 뜻합니다. chmod 764와 같음)

위 명령을 실행하면 아래와 같이 user권한에 rwx로 바꾸는 것을 확인할 수 있다.



위의 스크립트 동작원리

-> dpkg-scanpackages는 생성폴더인 mydebs안에 모든 패키지들을 보고 apt-get update가 읽을 수 있도록 압축하고 쓰여진다.(Packages.gz 파일로)

$./update-mydebs        //스크립트 실행

위의 명령을 실행하면 아래의 사진과 같이 Packages.gz 생성 확인할 수 있다.



$gunzip Packages.gz

$vi Packages    //패키지 확인하기 위해서




이를 웹에 등록하여 apt-get install하는 것도 할 예정





환경: vmware 11 ubuntu-mate


원래는 테스트용으로 진행하려고 20GB밖에 공간을 할당하였는데 어쩌다보니 계속 진행하게 되어 150GB로 확장한 화면입니다.

노란색 부분을 더블클릭해줍니다.



노란색 Expand부분이 비활성 되어있는것을 확인할 수 있습니다. 이는 스냅샷이 저장되어 있을 경우에 공간늘리는 것이 안된다고 합니다.



스냅샷을 백업하실분들은 내문서에 virtual machine에서 백업을 하시고 스냅샷을 지워줍니다.


스냅샷을 지운결과 Expand가 활성화 되는것을 확인할 수 있습니다.


확장하고 싶은 공간을 입력하고 Expand버튼을 눌러줍니다. 저는 이미 20에서 150으로 늘렸기때문에 10만 더 확장하였습니다.


Expand버튼을 누르면 아래의 화면과 같이 성공적으로 확장됨을 확인할 수 있습니다.




이제 우분투를 실행합니다.

gparted를 설치하여 공간을 확장하고자 합니다.


$sudo apt-get install gparted        //gparted 설치

$sudo gparted                     //gparted 실행



gparted를 실행하면 아래와 같이 unallocated 부분을 확인할 수 있습니다. 저는 어제 혹시모를 것을 대비하여 전체 공간을 할당하지 않았기 때문에 조금 전 추가한 10GB와 나머지공간 18GB로 인해 28GB가 할당되지 않은 것을 확인할 수 있습니다.



여기에서 저는 /dev/sda3 ext4로 추가하는 것이 아닌 sda1의 공간을 늘리고자 합니다.

(개인적으로 여기저기 드라이브가 생기는것을 좋아하지 않아서...)


만약 sda3으로 확장하고 싶으신분들은 unallocated 우측마우스클릭해서 new누르시고


edit탭에서 apply all operations 누르시면 됩니다.



그러면 위의 화면처럼 sda3에 할당되고 재부팅하면 자동 마운트 될 수 있고 안되시는분들은 마운트 시켜주면 됩니다.


저는 sda1에 할당을 하고자 합니다. sda1에 할당을 하려면 


    우측마우스 클릭하여 resize를 누르면 되는데

아래의 화면과 같이 resize 버튼이 비활성화 되어있습니다.

이는 sda2와 sda5 등과 같이 sda1과 unallocated 사이에 파티션이 있어서 그렇습니다.

linux-swap partition을 swapoff 하고 파티션을 삭제해야합니다. 또한 해당 extended 파티션도 삭제해야하는데

데이터가 있을 시 backup 하기시 바랍니다.



위의 화면은 삭제 후의 모습입니다.


공간을 늘리고 싶은만큼 확장한 후 resize버튼을 눌러줍니다.


size가 바뀐것을 확인할 수 있습니다.



이제 아까 지웠던 swap파티션과 extended 파티션을 추가해야합니다.


unallocated 우측마우스 클릭 후 new를 하고 create as에 extended partition을 하고 add를 눌러줍니다.



마찬가지로 우측마우스 클릭 후 논리파티션, 파일시스템은 linux swap으로 맞춰주시고 add를 눌러줍니다.



생성된 모습입니다.


위에서 말씀드린 edit탭에 apply all operations 누르시면 됩니다.

아래는 성공한 후의 모습입니다. 



변경 전 용량


변경 후 용량


위의 두 화면에서 볼 수 있듯이 디스크가 확장된 것을 확인할 수 있습니다.


감사합니다.

+ Recent posts