[Verilog] Multi-driven net이 형성되는 이유와 해결 방법 Verilog & FPGA

multi-driven net 또는 multiple-driver net 또는 '버스 충돌' 이라고 하는 듯하다.

multiple output ports 또는 multiple continuous assignment가 한 개의 variable을 drive하는 경우에 발생한다고 한다.

예를 들어보자.

예1) multiple output ports
--------------------------------------
`include "One.v"
`include "Two.v"
`include "Three.v"

module top (
);

wire in1, in2;
wire in3, in4;
wire mid;
wire out;

One _One (
.in1(in1),
.in2(in2),
.out(mid)
);

Two _Two (
.in1(in3),
.in2(in4),
.out(mid)
);

Three _Three (
.in1(mid),
.out(out)
);

endmodule
--------------------------------------

두 개의 모듈(One, Two)의 output wire가 하나의 모듈(Three)의 input port로 들어가는 것을 볼 수 있다.

일반적으로 하나의 output wire가 두 개의 input port로 연결되는 것은 문제 없으나

두 개의 output wire가 하나의 input port로 연결되는 것은 허용되지 않으며, 설령 합성이 되어도 이는 meaningless하다.

왜냐고 묻는다면 조금만 생각해보면 바로 알 수 있다.

아래의 회로 연결을 배운 적 있는가?
아래의 코드도 multi-driven net을 형성하는 예제이다.

예2) multiple continuous assignment
--------------------------------------
reg state = 0;

always @ (posedge read_enable)
begin
state = 1;
end

always @ (posedge write_enable)
begin
state = 0;
end
---------------------------------------

예제 1번과 원리는 같다.


해결 방법이라고 할 것도 없으며, 설계를 바꾸어야 한다.


자세한 내용은 아래의 링크에서 찾아볼 수 있다.





Git 명령어 정리 Git / GitHub

자주 쓸만한 명령어들을 모아두는 곳이며, 계속해서 포스트에 추가해 나갈 예정이다.


현재 디렉토리를 git 디렉토리로 초기화
: git init

현재 디렉토리를 github repository에 연결
: git remote add origin https://github.com/<url>

현재 디렉토리에 연결된 repository 조회
: git remote -v


git 리모트 repository에 연동할 아이디 설정
: git config --global user.name "<id>"

git 리모트 repository에 연동할 이메일 주소 설정
: git config --global user.email "<email address>"


git 파일 모드 변경도 반영하도록 설정
: git config --global core.fileMode true

git 대소문자 구별하도록 설정
: git config --global core.ignorecase false


git 리모트 브랜치 가져오기
: git checkout -t origin/<branch name>

git 리모트 브랜치 삭제하기
: git push origin :<branch name>


git 태그 추가하기
: git tag <tag name>

git 태그 삭제하기 (local)
: git tag -d <tag name>

git 태그 삭제하기 (remote)
: git push origin :<tag name>


git deleted 파일 반영하기
: git rm $(git ls-files --delete)

git created/modified/deleted 파일 모두 반영하기
: git add -A

git 특정 파일 .gitignore에 추가하기
: echo "<file name>" >> .gitignore


git 서브모듈 추가하기
: git submodule add <submodule name>

git 서브모듈 업데이트하기
: git submodule init
: git submodule update

git 서브모듈 삭제하기
: git submodule deinit -f <submodule name>
: rm -rf .git/modules/<submodule name>
: git rm -f <submodule name>



Git Remote에 있는 branch 이름 변경 Git / GitHub

Remote branch의 이름은 직접적으로 변경할 수 없으므로 아래와 같은 방법을 사용한다.


1) Remote에 있는 branch를 Local로 가져온다.
단, 아래의 명령은 remote에서 가져옴과 동시에 checkout 해버리기 때문에, 현재의 branch를 미리 저장해두어야 작업 데이터가 손실되지 않는다.

git checkout -t origin/<newbranch>


2) Local에 있는 branch 이름 변경하기

git branch -m <oldbranch> <newbranch>


3) Remote에 존재하는 oldbranch 삭제하기

git push origin :<oldbranch>
또는
git push origin --delete <oldbranch>


4) newbranch push 하기

git push origin <newbranch>



Git Submodule 디렉토리 텅텅 비었을 때 채우는 방법 Git / GitHub

다른 프로젝트를 submodule로 가지고 있는 프로젝트의 경우에는 일반적인 git clone 명령을 통해 프로젝트를 clone 해오게 되면

submodule 디렉토리 안에 들어갔을 때 왠 프로젝트는 없고 텅텅 비어있는 것을 볼 수 있다.

이 때, 안그래도 평소에 마음이 텅텅 빈 가엾은 한국의 개발자들이라면 누구를 막론하고 굉장한 허탈감과 무기력을 느끼게 되며,

인생의 회한과 자괴감이 가득한 순간 중 하나로 꼽지 않을 수 없다.

이를 보고 어찌 외면하랴, 불쌍한 개발자들의 등을 토닥여 주어야 한다.

다음의 방법을 사용하자.

1. 이미 clone을 해온 후라면, 눈물을 훔친 후 프로젝트 디렉토리 내에서 다음의 명령을 실행한다.

git submodule init
git submodule update

그러면 텅 빈 마음에 사랑이 채워지듯, 텅 빈 submodule 디렉토리에 latest 프로젝트 파일들이 가득 찰 것이다.

2. 예정된 외면을 받기 두려워 아직 clone을 하지 않았다면, 다음의 명령을 실행한다.

git clone --recursive <remote_addr>

그러면 단 한 번도 외면받은 적 없었던 것처럼 최신의 submodule 프로젝트를 마주할 수 있다.

그대여 어깨 피고 살기를 권한다.



C언어 유니코드 파일 입출력 예제(_wfopen, fwscanf, fwprintf) Eclipse C/C++

아래의 코드는 텍스트 파일을 생성하여 유니코드로 입출력하는 예제이다.

test.txt 라는 텍스트 파일을 쓰기 모드로 열어 글자를 쓴 다음

읽기 모드로 다시 열어 쓴 글자를 읽어서 출력한다.

-------------------------------------------------------------------

#include <stdio.h>
#include <locale.h>

int main(void)
{
setlocale(LC_ALL, ".OCP"); // locale 설정
// _wfopen 함수는 인자의 타입이 wchar_t 이므로
// "" 앞에 L을 붙여준다.
FILE *file = _wfopen(L"test.txt", L"wb");

// 해당 파일이 유니코드 파일이란 것을 명시하기 위해
// 파일의 가장 앞에 0xfeff 를 write한다.
wchar_t mark = 0xFEFF;
fwrite(&mark, sizeof(wchar_t), 1, file);


fwprintf(file, L"123 가나다");
fwprintf(file, L"라마바 456\r\n");


wchar_t buf_c = L'가';
fwprintf(file, L"%c", buf_c);


wprintf(L"한 글자 입력 후 엔터: ");
wscanf(L"%c", &buf_c);
fwprintf(file, L"%c", buf_c);

fclose(file);


// rb로 열어서 읽기
file = _wfopen(L"test.txt", L"rb");
wchar_t buf[1024] = { 0, };


size_t ret = fread(buf, sizeof(wchar_t), 1024, file);
wprintf_s(L"Size: %d bytes\r\n", (int)ret); // wprintf를 사용해도 무방
for (size_t i = 0; i < ret; ++i)
{
wprintf_s(L"%c", buf[i]);
}
wprintf_s(L"\r\n");


fclose(file);
return 0;
}

-------------------------------------------------------------------


컴파일 옵션에 -finput-charset=euc-kr 를 추가한 후 빌드한다.


실행 결과:


-------------------------------------------------------------------
한 글자 입력 후 엔터: ㄱ
Size: 19 bytes
123 가나다라마바 456
가ㄱ
-------------------------------------------------------------------




OpenMP 간단 사용법 OpenMP

OpenMP란 공유 메모리 환경에서 CPU 코어 내 병렬적으로 동작하는 프로그램을 작성하기 위한 API이다.

아래의 그림을 먼저 보도록 한다.



위 코드는 병렬 처리 가능한 단순한 무한루프 코드이며, OpenMP를 사용하지 않은 예제이다.

위의 코드를 실행하였을 때 CPU 각 코어의 사용량은 아래와 같다.




만약에 위 코드를 병렬 처리하였다면 각 코어에는 모두 동일한 while문이 할당되었을 거라 짐작할 수 있다.

하지만 CPU 코어 마다의 사용률이 다른 것을 보면 응용프로그램이 모든 코어를 사용하지 않고 있다고 볼 수 있다.

그리고 아래의 예제는 위의 코드를 네 개의 쓰레드로 나누어 병렬로 처리하는 코드로 재구성한 것이다.




omp.h 헤더 파일을 추가하고, 병렬 처리를 위한 openmp 코드를 두 줄 추가하였다. 추가한 두 줄의 코드는 길지 않다.

컴파일러 및 링커 옵션에 -fopenmp 를 추가하였다.

실행 시의 CPU 사용량은 다음과 같다.




프로그램 실행 시 모든 코어의 사용량이 100%인 것을 확인할 수 있다.



라즈베리파이 hdmi 비활성화 방법 Raspberry Pi

hdmi를 사용하지 않고 ssh를 이용해 터미널로만 작업한다면 hdmi를 활성화해둘 필요가 없다.

hdmi를 비활성화하면 약 25~30mA의 전력을 아낄 수 있다고 한다.

비활성화하는 방법은 아래와 같다.

/usr/bin/tvservice -o

부팅 시 자동으로 비활성화하려면 아래의 파일을 연다.

vi /etc/rc.local

여기서 exit 0: 바로 윗 줄에 다음의 줄을 추가한다.

/usr/bin/tvservice -o



외에도 전력을 아끼는 방법이 몇 가지 더 있으며,

자세한 내용은 아래의 링크에서 확인할 수 있다.






라즈베리파이 서버용 환경 설정 방법 Raspberry Pi

라즈베리파이를 서버로 사용하기 위한 나름대로의 환경 설정을 모아두었다.

목차는 다음과 같다.

- 라즈베리파이 무선LAN 연결하는 방법
- 고정IP 할당하는 방법
- ssh 포트 변경하는 방법
- hostname 변경하는 방법
- 새로운 계정 생성 방법
- WOL 설정하는 방법

모든 작업은 root 계정으로 수행할 것을 권장한다.




[라즈베리파이 무선LAN 연결하는 방법]

연결하고자 하는 AP가 scan되는지 확인한다.

iwlist wlan0 scan

scan이 된다면 다음의 명령어를 실행한다.

vi /etc/wpa_supplicant/wpa_supplicant.conf

그리고 아래의 줄을 추가하여야 하는데,

-----------------------------------------------------------------------------
network={
        ssid="공유기SSID"
        psk=fcb6f0569643f1c8022f482806cd756692b7676602cc8b4d755c69068f44430c
}
-----------------------------------------------------------------------------

여기서 psk는 공유기 비밀번호의 passphrase이며, 아래의 명령을 이용하여 구할 수 있다.

wpa_passphrase 공유기SSID 공유기비밀번호

만약 비밀번호에 특수문자가 포함되어 있을 경우, event not found 라는 오류가 발생할 수 있다.

이 경우는 아래와 같이 비밀번호 앞뒤로 작은 따옴표(')를 넣어 사용한다.

wpa_passphrase 공유기SSID '공유기비밀번호'

reboot 후 재연결하여 Wi-fi 연결이 되었는 지 확인한다.

주의할 점은 reboot 후에 라즈베리파이의 IP주소가 변경되었을 수도 있다는 점이다.

이 때는 공유기 관리 페이지로 들어가서 IP주소를 확인하거나

IP스캔 등의 방법을 이용한다.





[고정IP 할당하는 방법]

라즈베리파이에서 LAN을 이용할 경우 Power Off/On 때마다 IP주소가 변경될 수 있다.

이 경우, 변경될 때마다 IP주소가 무엇인지 찾아야 하는 번거로움이 생길 수 있으며,

포트 포워딩을 원하는 경우 IP주소가 변경됨에 따라 포워딩이 제대로 안될 수도 있다.

고정 IP를 할당하는 방법은 다음과 같다.

먼저 ifconfig 를 통하여 네트워크 인터페이스의 이름을 알아낸다.

대개 유선랜은 eth, 무선랜은 wlan0 로 되어있지만, 정확한 이름을 알아낸다.

vi /etc/dhcpcd.conf

파일 맨 끝에 다음의 줄을 알맞게 변경하여 추가한다.

---------------------------------------------------
interface wlan0
static ip_address=IP_ADDRESS
static routers=GATEWAY_ADDRESS
static domain_name_servers=GATEWAY_ADDRESS
---------------------------------------------------

예)
---------------------------------------------------
interface wlan0
static ip_address=192.168.0.200/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
---------------------------------------------------

저장 후 reboot 을 통해 고정IP가 할당됨을 확인할 수 있다.

위의 방법대로 해보았으나, 필자는 고정IP 할당 후 인터넷이 되지 않는 문제점으로 인해

공유기 관리자 페이지에서 DHCP 고정할당하는 방법을 이용했다.

mac주소가 필요하기 때문에 ifconfig를 통해 wlan0의 mac주소를 알아내어 등록한다.

ifconfig





[ssh 포트 변경하는 방법]

ssh의 포트는 기본적으로 22번으로 설정되어 있다.

만약 ssh를 포트 포워딩할 목적이면서 그 PC가 1대라면 기본 포트를 사용하여도 무방하지만,

기본 ssh포트를 사용하는 여러 대의 PC를 포트 포워딩 시키는 것은 포트번호가 중복되므로 불가능하다. (불가능한 것으로 알고 있다.)

새로운 포트를 이용하는 방법은 다음과 같다.

vi /etc/ssh/sshd_config

sshd_config 파일 내에서 #Port 22 라고 되어있는 줄을 찾은 후

그 아래 줄에 Port 원하는포트번호 를 입력한 후 저장한다.

예)
#Port 22        // 기존의 줄은 그대로 두고
Port 8022        // 새로운 줄만 추가한다.

그리고 ssh를 재시작한다.

service sshd restart

재시작 시 세션을 끊길 수도 있으며, 바뀐 포트 번호를 이용해 재접속하면 정상적으로 연결되는 것을 볼 수 있다.





[hostname 변경하는 방법]

hostnamectl set-hostname 호스트네임

예) hostnamectl set-hostname raspbian

호스트네임 부분에 원하는 호스트 네임을 입력한 후 실행하면 원하는 호스트 네임으로 변경되는 것을 볼 수 있다.

하지만 한 군데 더 수정해주어야 한다.

vi /etc/hosts

해당 파일을 열어 기존의 호스트 네임이 기재된 부분을 원하는 호스트 네임으로 변경한 후 저장하면 된다.





[새로운 계정 생성 방법]

groupadd pikamon

useradd pikamon -g pikamon

login pikamon

passwd

위는 pikamon이라는 새로운 계정을 생성하여 새로운 그룹인 pikamon 그룹에 소속시킨 후 패스워드를 설정하는 방법이다.

UID나 expire date 등의 세부 작업을 신경쓰지 않는다면 위와 같이 새 계정을 만들 수 있다.

(만든 후에는 기존 pi 계정은 암호를 어렵게 설정하거나 삭제한다.)

(groupdel pi && userdel pi)





[vim 설정 방법]

아래 주소를 참고하여 설정한다.






[기타 설정]

- ssh root 로그인 거부
vi /etc/ssh/sshd_config
PermitRootLogin no

- package repository 추가
raspbian은 ubuntu와 달리 별도의 repository를 추가할 필요가 없다.
심지어 archive location도 변경할 필요가 없다.
자동으로 모든 repository를 조회하며, 가장 가까운 location의 archive를 이용한다.





[WOL 설정하는 방법]

WOL을 이용하기 위해서는 웹서버와 php가 필요하다.

웹서버와 php의 설치 및 연동 방법은 아래의 페이지에 아주 자세하게 잘 나와있다.


mariadb 설치 부분을 제외한 나머지 부분을 따라하면 되며,

http://IP주소/info.php 접속 시 php 화면이 잘 나오는 것까지 확인할 수 있다.

그러면 아래의 내용을 따라 wakeonlan 을 설정한다.

먼저 wakeonlan 프로그램을 설치한다.

sudo apt-get install wakeonlan

그리고 별도로 웹서버 디렉토리를 변경하지 않았다면 기본 웹서버 디렉토리는 /var/www/html 로 되어있을 것이다.

vi /var/www/html/wol.php

위의 명령을 실행하고 아래의 줄을 추가한 후 저장한다.

-------------------------------------------------------------
<?php
$run = shell_exec("wakeonlan MAC주소");
echo $run;
?>
-------------------------------------------------------------

MAC주소 부분은 WOL을 실행할 디바이스의 랜카드 MAC주소를 기입한다.

다 되었다면 테스트해본다.

init 0 을 통해 디바이스의 전원을 끈 다음 웹브라우저에서 아래의 url을 실행한다.

http://IP주소/wol.php

그러면 디바이스의 전원이 들어오는 것을 확인할 수 있다.

위의 방법은 라즈베리파이를 WOL Server로 하여 다른 PC의 WOL를 실행시키는 방법이며,

라즈베리파이 자체는 WOL를 지원하지 않는다고 한다.

"전원이 꺼지면 CPU가 멈추고 GPU가 저전력 모드로 들어가는데, GPU는 WOL을 지원하지 않기 때문에 NIC가 WOL을 인식하더라도 no response."





OpenCL 윈도우 이클립스 연동 방법 OpenCL

이클립스 C/C++에 MinGW가 연동되어 있다는 가정 하에 작성한다.

연동되어있지 않다면 아래의 링크를 참고하여 연동한다.



인텔용 OpenCL 도구를 설치하지 못하였다면 아래의 내용을 따라 설치한다.

이미 설치하였다면 아래의 이클립스 설정으로 바로 넘어간다.


1. 인텔용 OpenCL 도구 다운로드 및 설치 방법


인텔 플랫폼 추가하는 방법에 대해 설명한다.

인텔 OpenCL용 SDK와 Runtime을 설치하도록 한다.

1. 인텔 OpenCL용 SDK 다운로드 링크는 아래와 같다.


링크로 들어간 후 Available in 에서 WIndows를 선택한다.

약관에 동의 및 정보 작성 후 Submit를 누른다.

다운로드 약관에 체크하면 다운로드 버튼이 나온다. 버튼을 눌러 다운받은 후 설치한다.

2. 윈도우 64비트용 Intel OpenCL Runtime 다운로드 링크는 아래와 같다.


링크를 통해 설치파일을 다운로드받은 후 설치한다.

두 가지 모두 설치 완료 후 시스템을 재시작하고 이클립스를 실행한다.


2. 이클립스 설정 방법


헤더파일과 라이브러리를 각각 설정해주어야 한다.

1. 헤더파일 include 설정

C++ 프로젝트를 생성한 후 프로젝트를 우클릭하여 Properties를 누른다.

C/C++ Build -> Settings -> GCC C++ Compiler -> Includes 항목을 선택한 후 Intel OpenCL SDK include 폴더를 선택한다.

경로는 "C:\intel\OpenCL\sdk\include" 이며, 이와 다를 경우 직접 file system에서 찾는다.

2. 라이브러리 linking 설정

C/C++ Build -> Settings -> GCC C Linker -> Libraries 항목을 선택한다.

Libraries (-l) 우측의 add 버튼을 누른 후 OpenCL 을 입력하여 추가한다.

그 아래의 Library search path (-L) 우측의 add 버튼을 누른 후 Intel OpenCL SDK lib 폴더를 선택한다.

경로는 "C:\intel\OpenCL\sdk\lib" 이며, 이와 다를 경우 직접 file system에서 찾는다.


3. 테스트


예제 코드를 가지고 있다면 OpenCL 예제 파일(아마도 .cpp 파일과 .cl 파일)을 프로젝트에 추가한 후 먼저 빌드한다. (ctrl + B)

빌드에 이상이 없다면 실행한 후 결과를 확인한다. (ctrl + F11)


FPGA에 Memory 추가하기 Verilog & FPGA

CPU를 설계하였다고 가정하면, CPU의 실행을 직접 확인하기 위해서는 PC를 이용해 Instruction을 읽어올 메모리가 필요하다.

다행히 사용자가 직접 Memory를 설계할 필요는 없다.

FPGA 위에서 온보드 RAM을 합성하는 것이 가능하며, vivado에서는 이를 Block Memory라는 이름으로 기능을 지원하고 있다.

Vivado의 Block Diagram에서 Add IP를 누른 후 Block Memory Generator를 검색하여 추가하면 된다.

추가된 BRAM을 더블 클릭하면 Re-customizing이 가능하다.

메모리 타입, ECC 사용 여부, 메모리 width 및 depth 크기 조절 등이 가능하다.


DIGCOM-XA1.0에 Microblaze 포팅하기 Verilog & FPGA

Microblaze 포팅 on DIGCOM-XA1.0


1. Microblaze 포팅 on FPGA

아래는 Xilinx FPGA에 Microblaze를 포팅하는 방법에 대한 공식 문서이다.


Hardware Development 부분을 따라하면 되지만

DIGCOM의 경우 Example Project에서 다루는 Eval Board와는 다르기 때문에

Example Project를 생성하는 것이 아니라 그냥 빈 RTL 프로젝트로 생성해야 한다,

자세한 방법은 아래 페이지 참고.



2. Block Diagram을 열고, Diagram 창에서 add를 누른 후 microblaze를 검색하여 추가한다.

그리고 Run Connection Automation을 누른다.

옵션은 순서대로 32KB - None - None - Debug Only - Enabled - Unchecked - New Clocking Wizard(100MHz) 를 선택한 후 OK를 누른다.

UART가 필요하다면 마찬가지로 add를 누른 후 UART를 검색하여 추가하고 Run Connection Automation을 누른다.

(이외 다른 IP가 또 필요하다면 UART처럼 진행)

필요한 IP를 다 붙였다면 Sources - Design Sources 안에 파일이 하나 있을건데,

그 파일 오른쪽 클릭 후 Create HDL Wrapper 를 누른다. 내 생각엔 block diagram에 해당하는 HDL을 생성하는 부분인 것 같다.


3. Clock 매칭을 해줘야 하는데,

Open Block Diagram을 열어서 clk_wiz_1의 CLK_IN1_D에다가 diff_clock_rtl_0을 입력으로 준다? (이미 되어있으면 스킵)

하튼 clock 작업을 막 해줬었는데, 기억이 안난다. 기존에 붙어있던 clk을 떼어내고 diff_clock_rtl_0을 붙여줬던 기억이 난다.

그리고 Open Elaborated Design을 열어서 핀 할당을 해준다.

먼저 clock부터, diff_clock_rtl_0_clk_p 를 열어보면 Neg Diff Pair가  diff_clock_rtl_0_clk_n으로 이미 지정되어있다.

그래서  diff_clock_rtl_0_clk_p에다가만 DIGCOM의 Oscillator의 핀 번호인 E12를 할당해주면 된다. I/O Std는 TMDS_33으로 한다.

나머지 리셋이나 UART TX/RX는 리셋은 일단은 버튼으로 줬어서 B15, B16 줬었고

UART TX/RX는 입출력 포트 0,1인 R7, R6에 일단 할당했었다.

그리고 합성 및 구현, 비트스트림 생성까지 해주면 된다.


4. .bit 파일이 생성되었으면

아래의 링크를 참고한다.


위의 과정은 UART를 통해 Hello World를 출력하는 과정인데,

UART 케이블도 없고 확장 보드 납땜도 안되어 있어서 확인하기 어려운 탓에

단순히 그냥 빌드가 잘 되는지만 확인하였다.

그리고 잘 되는 것을 확인하였다.


5. GPIO 설정해서 버튼까지 물리려면 아래의 링크 참고





cmake 사용법 Linux

sudo apt install cmake build-essential -y

ls

-------------------
main.c
-------------------

vi CMakeLists.txt

--------------------------------
add_executable(main main.c)
--------------------------------

cmake CMakeLists.txt

make

ls

-------------------
main   main.c
-------------------

./main



cmake 명령은 Makefile 파일이 존재하지 않을 때 최초 1회만 실행한다.

이후에는 make 명령만 실행하여도

Makefile 파일이 CMakeLists.txt 파일을 참조하여 빌드 수정사항을 스스로 수정한 후 실행된다.





Hackintosh Sierra 설치 방법 on VMware Player Hackintosh

Install Hackintosh Sierra on VMware

1. VMware를 설치한다.

2. 아래의 링크에서 Hackintosh Sierra vmdk 파일을 다운로드한다.

3. 아래의 링크에서 unlocker.exe 최신 버전을 다운로드한다.

4. Unlocker 폴더에서 win-install.cmd를 관리자 권한으로 실행한다.

5. VMware에서 Create a New Virtual Machine - Typical - I will install the operating system later 선택한다.

6. Guest operating system에서 Apple Mac OS X - macOS 10.12 선택한다.

7. vm 이름 설정, 디스크 크기는 그대로 두고 Store virtual disk as a single file 선택하고 Finish 한다.

8. 다운받은 vmdk 파일의 이름을 vm의 이름과 같게 바꾼 후 vm이 생성된 폴더로 복사한다.

9. vm이 들어있는 폴더 내 .vmx 파일을 메모장으로 열어 마지막 줄에 다음의 한 줄을 추가한 후 저장한다.
smc.version = "0"

10. VMware 에서 vm 클릭하고 Edit Virtual Machine Setting에 들어간 후 Hard Disk(40GB)를 삭제한다.

11. 그리고 Add 클릭 후 Hard Disk - SATA - Use an Existing Virtual Disk - 다운받은 vmdk 파일 선택한다.

12. vCPU 개수와 vMemory 크기를 적절히 변경한 후 vm을 실행시킨다,

정상적으로 설치되는 것을 볼 수 있다.




Unable to locate package 에러 나올 시 해결법 Linux

가끔 uml-utilities 처럼 인터넷에는 sudo apt install 을 이용하여 설치하면 된다고 하지만

직접 해보면 Unable to locate package 오류가 뜨는 경우가 있다.

이유 중의 하나로, 리눅스(우분투) 배포판에 따라서 (desktop, server, minimal ...)

패키지를 가져올 repository 가 등록되어 있지 않은 경우가 있다.

기본적으로 아래의 4개의 repository 를 추가해주면 웬만한 패키지는 문제 없이 잘 가져오는 것을 볼 수 있었다.

sudo add-apt-repository main
sudo add-apt-repository universe
sudo add-apt-repository restricted
sudo add-apt-repository multiverse

sudo apt update

위와 같이 하면 잘 되는 것을 볼 수 있다.



추가

sudo sed -i "s/us.archive.ubuntu.com/mirror.kakao.com/g" /etc/apt/sources.list

국내 기준 패키지를 가장 빨리 받아올 수 있는 서버는 kakao 이다.

혹시나 US Archive 나 KR Archive 로 설정되어 있다면 위의 명령어를 이용해 kakao로 바꾸어 사용하는 것도 좋은 방법일 것이다.




Eclipse Photon C/C++ 에 MinGW-w64 연동하기 Eclipse C/C++

1. Eclipse C/C++ 64-bit 를 다운받아 설치한다.


2.MinGW-w64 를 다운받아 설치한다.


설치 시 설치할 폴더를 C:MinGW 로 한다.

3. Eclipse 실행 후 Help - Install New Software... 를 누른다.

4. 최상단에 Work with 콤보 박스의 화살표를 누르면 CDT 라는 항목이 나온다.

CDT 를 누른 후 아래 나오는 CDT Main Features 와 CDT Main Optional Features 를 체크한 후 Next 를 눌러 설치한다.

설치 후 Eclipse 를 Restart 하라는 창이 뜨면 Restart 한다.

5. Path 환경변수에 MinGW 의 bin 폴더(C:MinGWbin)를 추가한다.

6. Eclipse 의 Window - Preferences - C/C++ - New C/C++ Project Wizard - Makefile Project - Binary Parses 에서 GNU Elf Parser 를 체크한다.

7. Builder Settings 에서 Use default build command 의 체크를 풀고 Build command 에 mingw32-make.exe 를 입력한다.

이제 테스트 해본다.

1. File - New - C/C++ Project - C Managed Build 를 누른 후 프로젝트 명을 입력한다.

2. 우측 하단 Toolchains 에서 MinGW GCC 를 선택한 후 Finish 를 누른다.

3. 프로젝트 우클릭 - New - Source File 를 누른 후 .c 소스 파일을 생성한다.

4. 아래의 코드를 입력 후 ctrl + B 를 눌러 빌드한다.

-----------------------------------
#include <stdio.h>

int main(void)
{
printf("Hello world!n");
return 0;
}
-----------------------------------

5. 빌드가 성공적으로 완료되었으면 ctrl + F11 을 누르고 Local C/C++ Application 을 선택한 후 OK 를 누른다.

하단 Console 창에 Hello world! 가 성공적으로 출력되는 것을 볼 수 있다.


혹시나 launch failed. binary not found 라는 문구를 본다면,

이는 Build를 하지 않고 곧바로 실행하려할 때 볼 수 있는 오류로,

ctrl + F11 이전에 ctrl + B 를 이용해 Build 를 먼저 해줘야 한다는 점에 주의하자.





QEMU TAP 네트워크 설정 QEMU

QEMU에서의 네트워크는 크게 두 종류가 있다.

유저 네트워크와 탭 네트워크가 있는데,

유저 네트워크는 구축이 쉬운 반면 ssh, ping 등이 불가한 제약이 있다.

(ifconfig 명령을 입력했을 때 나타나는 network interface가 lo밖에 없다.)

반면 탭 네트워크는 vmware 나 virtualbox의 브리지 네트워크와 같이 qemu vm만의 ip를 할당받아 비교적 자유롭게 네트워크 통신이 가능하다는 장점이 있다.

본 포스트는 윈도우 host 와 우분투 리눅스 guest 간에 탭 네트워크를 설정하고, 호스트에서 게스트로의 ssh 연결까지 해보는 것을 목표로 한다.



0. Prerequisite

게스트에 ubuntu linux가 설치되어 있으며, 용량이 충분하다는 가정 하에 시작한다.

게스트에서 루트로 로그인할 것을 권장한다.

호스트에서 netdev tap 옵션을 주어 qemu vm를 실행시키면 apt가 끊기므로

옵션을 주기 전에 아래의 사항을 미리 해놓는다.

add-apt-repository main
add-apt-repository universe
add-apt-repository restricted
add-apt-repository multiverse
apt install bridge-utils uml-utilities ifconfig ip isc-dhcp-client ifupdown openssh-server -y



1. How to install

아래 사이트에서 최신 버전의 OpenVPN 설치 프로그램을 다운받을 수 있다.

https://openvpn.net/index.php/download/community-downloads.html

설치 후 실행하면 네트워크의 '어댑터 속성 변경' 화면에서

'TAP-Windows Adapter V9' 라는 네트워크 드라이버가 추가된 것을 볼 수 있다.

아이콘 오른쪽 클릭 - 속성 - 인터넷 프로토콜 버전 4(TCP/IPv4) - 속성 - 다음 IP 주소 사용 을 누른다.

QEMU VM에 할당하고자 하는 IP, 서브넷 마스크, 게이트웨이를 설정한 후 확인을 누른다.

혹은 현재 호스트에 인터넷을 공급해주고 있는 네트워크 인터페이스가 있다면

그 네트워크 인터페이스에서 인터넷 공유 기능을 사용함으로써 tap0 인터페이스에서 인터넷을 공유받아 쓰게 할 수도 있다.

이 경우에는 공유 설정 시 tap0의 고정 IP주소가 자동으로 할당되므로

위 처럼 수동으로 고정 IP를 할당할 필요는 없다.

본 포스트에서는 tap0 인터페이스가 인터넷을 공유받아 사용하도록 설정하여 IP가 192.168.137.1 로 자동 할당되었다.


여기까지 하면 호스트의 설정은 끝났다.

QEMU 프로그램을 실행한다. 여기서 호스트의 TAP 드라이버와 연동하기 위해 아래의 옵션을 추가한다.

.\qemu-system-x86_64.exe -smp 4 -m 2048 -hda ubuntu-server.qcow2 -boot c -netdev tap,id=network0,ifname=tap0,script=no,downscript=no -device e1000,netdev=network0,mac=52:53:54:55:56:57

brctl addbr br0
ip addr flush dev eth0
brctl addif br0 eth0
tunctl -t tap0 -u $(whoami)
brctl addif br0 tap0
ifconfig eth0 up
ifconfig tap0 up
ifconfig br0 up

mkdir -p /etc/sysconfig/network-scripts
vi /etc/sysconfig/network-scripts/ifcfg-br0
------------------------------
DEVICE=br0
BOOTPROTO=static
IPADDR=192.168.137.1
NETMASK=255.255.255.0
GATEWAY=192.168.137.2
ONBOOT=yes
TYPE=Bridge
------------------------------

vi /etc/sysconfig/network-scripts/ifcfg-eth0
------------------------------
DEVICE=eth0
HWADDR=$MACADDRESS
ONBOOT=yes
BRIDGE=br0
------------------------------

service networking restart
(이 명령어가 실행되지 않는다면 ifupdown 또는 reboot 를 추천)

ifconfig로 확인해보면 랜카드가 추가되어 ip주소가 할당된 것을 볼 수 있다.

호스트에서 게스트에 할당된 ip주소로 ping을 보내면 정상 동작하는 것을 볼 수 있다.

본 포스트의 목표는 호스트에서 게스트로의 ssh 연결이므로 ssh에 대한 내용을 계속 이어가겠다.


먼저 ssh용 포트를 열어준다.

iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
iptables -I OUTPUT 1 -p tcp --dport 22 -j ACCEPT


QEMU에 ssh 연결을 하기 위해서는 포트포워딩이 필요하다.

(직접 연결이 안되는 것으로 알고 있음.)

외부 포트 2222번으로 접속하면 내부 포트 22번으로 리다이렉트 되도록 게스트와 호스트에서 설정해준다.

(iptables -I INPUT 1 -p tcp --dport 2222 -j ACCEPT)
(iptables -I OUTPUT 1 -p tcp --dport 2222 -j ACCEPT)
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2222 -j DNAT --to 192.168.137.137:22



필자가 처음에는 QEMU에 ssh 연결을 하기 위해서는 포트포워딩이 필요한 줄 알고 있었으나,

직접 해보니 포트포워딩 없이도 ssh 연결이 잘 되는 것을 확인할 수 있었다.


호스트에서 putty를 열어 게스트의 ip 및 22번 포트를 이용해 접속한다.

그러면 접속이 잘 되는 것을 볼 수 있다.


추가로 윈도우에서 ssh keygen을 하려면 puttygen.exe 라는 프로그램이 필요하다.

putty를 portable이 아닌 installer로 설치하였다면 putty.exe와 함께 들어있을 것이고,

아니면 인터넷에서 puttygen.exe만 별도로 다운로드 가능하다.

puttygen.exe 다운로드 페이지: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

프로그램을 실행하여 키를 Generate 한 후, Save public key, Save Private key를 통해 생성된 키를 저장한다.

그리고 public key는 게스트 측으로 복사하여 게스트의 ~/.ssh/authorized_keys 파일에 붙여넣는다.





QEMU for windows 10 설치 및 Ubuntu Minimal VM on QEMU QEMU

본 포스트에서는 ubuntu minimal iso 파일을 이용하여 qemu vm에 ubuntu를 설치하는 내용을 다룬다.


* Ubuntu Minimal ISO 다운로드

https://help.ubuntu.com/community/Installation/MinimalCD

위의 링크에 들어가서 최신 버전의 Ubuntu Minimal 이미지 파일을 다운받을 수 있다.

현재 날짜(2018.8.27) 기준 최신 버전은 18.04(Bionic Beaver) 이며, 해당 파일의 링크는 아래와 같다.
http://archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/current/images/netboot/mini.iso



* QEMU 다운로드 (QEMU for windows 10)

https://qemu.weilnetz.de/w64

위의 링크에 들어가서 최신 버전의 QEMU Installer를 다운받을 수 있다.

현재 날짜(2018.8.27) 기준 최신 버전은 20180815 이며, 해당 파일의 링크는 아래와 같다.
https://qemu.weilnetz.de/w64/2018/qemu-w64-setup-20180815.exe

설치 시, 모든 아키텍처에 대한 에뮬레이터를 전부 다 설치하기 보단 필요한 아키텍처에 대한 에뮬레이터만 체크하여 설치하는 것을 권장한다.



Program Files 폴더 내 qemu가 설치된 폴더로 이동한 후 해당 폴더에서 cmd를 띄운다.



아래의 예시에서는 x86_64 아키텍처의 에뮬레이터를 이용하며, 이미지 파일의 이름은 mini.img, 용량은 10G로 정하였다.

원하는 설정이 있을 경우 적절히 바꾸어 사용하면 된다.


1. vm 이미지 생성

.qemu-img create "C:Users(사용자명)Desktopmini.img" 50G
혹은 runas /user:administrator .qemu-img create mini.img 50G

이미지는 mini.img 라는 이름과 50GB의 용량을 가진다.
runas 를 사용하기 어렵다면 이미지 파일을 바탕 화면에 생성한 후 Program Files 폴더에 복사한다.


2. vm 실행

먼저 ubuntu minimal image 파일을 qemu 폴더에 복사한다.

그리고 다음 명령어를 사용한다.

.qemu-system-x86_64 -boot d -cdrom mini.iso -m 512 -hda mini.img -smp 8 

//-netdev user,id=network0 -device e1000,netdev=network0,mac=52:54:00:12:34:56


--------------------------------------

이미지 생성
: qemu-img create -f qcow2 mini.qcow2 20G

OS 설치
: qemu-system-x86_64 -m 512 -hda mini.qcow2 -cdrom mini.iso -boot d

설치 후 실행
: qemu-system-x86_64 -m 512 -hda mini.qcow2 -boot d -smp 4

디스크 용량 증설
: qemu-img resize mini.qcow2 +10G





.\qemu-system-x86_64.exe -smp 2 -m 1024 -hda mini.qcow2 -cdrom mini.iso -boot c -netdev user,id=network0 -device e1000,netdev=network0,mac=52:53:54:55:56:57

-smp = vCPU 개수
-m = Memory 크기(MB)
-hda = 하드 디스크 지정
-cdrom = 보조기억장치(cd-rom) 지정
-boot c = 부팅 순서를 첫 번째 하드 디스크로 지정
-boot d = 부팅 순서를 첫 번째 cd-rom으로 지정
-netdev = user 네트워크 인터페이스 지정


리눅스의 Run Level Linux

Run Level

Run Level

0-Power Off(시스템 종료)
1-Resque(시스템 복구 모드)
2-N/A
3-Multi-User(CUI 모드)
4-N/A
5-Graphical(GUI 모드)
6-Reboot(시스템 재시작)

2번과 4번은 엄밀히는 Multi-User 이나, 현재는 사용되지 않는다.

런 레벨의 기본값을 확인하려면 다음의 명령을 이용한다.

ls -l /lib/systemd/system/default.target

심볼릭 링크 파일인 default.target 이 가리키는 파일의 이름이 graphical.target 이라면

현재 부팅 모드가 GUI로 되어있다는 뜻이다.

반대로 가리키고 있는 파일의 이름이 multi-user.target 이라면 현재 CUI 모드로 부팅된다는 뜻이다.


현재 GUI 모드 부팅을 GUI -> CUI 모드 부팅으로 바꾸고 싶다면 다음의 명령을 이용하여 바꿀 수 있다.

sudo ln -sf /lib/systemd/system/multi-user.target /lib/systemd/system/default.target
reboot -f

반대로 CUI -> GUI 부팅으로 바꾸려면 다음의 명령을 이용한다.

sudo ln -sf /lib/systemd/system/graphical.target /lib/systemd/system/default.target
reboot -f




추가로 재시작 및 종료는 다음 명령을 이용하여서도 실행이 가능하다.

sudo init 6
(시스템 재시작)

sudo init 0
(시스템 종료)


default 세팅이 아닌 일시적으로 CUI로 부팅하려면 아래의 명령을 사용한다.

sudo init 3
(CUI 부팅)

또는 GUI로 부팅하려면 아래의 명령을 사용한다.

sudo init 5
(GUI 부팅)

RISC-V ISA Simulator 설치 및 사용법 RISC-V

riscv-isa-sim 설치 명령어

아래의 내용을 쉘 스크립트로 만들어 진행하는 것을 권장한다.

작업 시간이 상당히 오래 걸리는 것을 감안하고 진행하기 바란다.

용량이 약 8GB 가 넘는 것 같다.

#!/bin/bash
sudo -i
rm -f /var/lib/dpkg/lock
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev -y
mkdir -p riscv
cd riscv
echo "export RISCV=$(pwd)" >> ~/.bashrc
source ~/.bashrc
export PATH=$PATH:$RISCV/bin:$RISCV/riscv64-unknown-elf/bin:$RISCV/riscv64-pk
source ~/.bashrc
git clone --recursive https://github.com/riscv/riscv-tools.git
cd riscv-tools
./build.sh

echo -e '#include <stdio.h>\n int main(void) { printf("Hello world!\\n"); return 0; }' > hello.c
riscv64-unknown-elf-gcc -o hello hello.c
spike pk hello
hello


혹시나 아래와 같은 에러가 뜬다면,

terminate called after throwing an instance of 'std::runtime_error'
  what(): could not open pk (did you misspell it? If VCS, did you forget +permissive/+permissive-off?)


1주일 노가다 하다가 해답을 찾았다.

놀랍게도, find / -name spike 해보면
/bin/spike 란 실행 파일이 있는 것을 알 수 있다.
그런데 /bin이 환경변수 PATH에서 riscv의 경로보다 앞에 있어서 우리가 의도한 riscv의 spike가 아닌
/bin 안의 spike가 실행되어서 그렇다.
이 경우에는 riscv의 spike의 절대 경로를 이용하여 hello 를 실행할 수 있다.




ssh 연결 및 ssh key 등록 Linux



ssh 서버 여는 법

server에서: sudo apt install -y openssh-server
server에서: sudo systemctl restart ssh
server에서: sudo ufw allow 22/tcp
client에서: ssh REMOTE_USER@REMOTE_IP

* REMOTE_USER 와 REMOTE_IP 는 적절히 치환해서 쓸 것.


ssh key 등록

client에서 키를 생성한 후 .pub 키를 server로 보내는 방식이다.

방법은 아래와 같다.

client에서: ssh-keygen -t rsa -b 2048
client에서: ssh-copy-id -i ~/.ssh/id_rsa.pub REMOTE_USER@REMOTE_IP

만약 ssh-copy-id 명령어를 사용할 수 없다면, scp 로 복사 후 원격 서버에서 직접 key를 등록하여야 한다.

방법은 아래와 같다.

client에서: scp  id_rsa.pub REMOTE_USERID@REMOTE_IP:/home/REMOTE_USERID/
server에서: cat id_rsa.pub >> ~/.ssh/authorized_keys


그리고 client에서 server로 접속한다.

ssh REMOTE_USERID@REMOTE_IP

password 입력 없이 접속이 이루어지는 것을 볼 수 있다.





BGL(boost graph library) 설치 및 사용법 Boost Library

우분투 환경에서 진행하였다.

sudo apt install libboost-dev

설치 후 cpp 파일을 생성한다.

vi hello.cpp

파일의 내용은 다음과 같다.

------------------------------------------------------

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>

using namespace boost;
using namespace std;

int main(void)
{
typedef adjacency_list<vecS, vecS, undirectedS> ListGraph;
ListGraph g(4)

// Create the edges
add_edge(0, 1, g);
add_edge(0, 3, g);
add_edge(1, 2, g);
add_edge(2, 3, g);

// Print graph
write_graphviz(cout, g);

return 0;
}

------------------------------------------------------


컴파일 후 실행한다.

g++ -o hello hello.cpp
./hello



실행결과
------------------------------------------------------
graph G {
0;
1;
2;
3;
0--1 ;
0--3 ;
1--2 ;
2--3 ;
}
------------------------------------------------------


간단하게 살펴본 예제이다.


환경 변수 지정이나 라이브러리 링크 등을 수동으로 해주지 않아도

잘 돌아가는 것을 볼 수 있다.


본 포스트에서는 단지 설치 및 실행에만 중점을 두었으며,

BGL에서 지원하는 다양한 기능들에 대한 예제는 아래 링크에서 확인할 수 있다.

http://www.technical-recipes.com/2015/getting-started-with-the-boost-graph-library/

방향/무방향 그래프, 다익스트라 최단 거리, 최대 유량 알고리즘을

BGL을 이용해 표현 및 계산하는 예제들이 있으니 참고하기 바란다.



우분투 vim 설치 및 vimrc 설정 Linux


위와 같이 vi 에서 백스페이스를 눌러 글자를 지워도 글자가 남아있는 것처럼 보이거나

방향키 입력 시 해당 방향으로 이동하지 않고 깨진 글자가 입력된다면

vim 이 설치되지 않은 것이다.

아래의 명령을 이용해 vim 을 설치한다.

sudo apt install vim -y


이후 vi를 실행해보면 방향키 입력 등이 원활한 것을 볼 수 있다.


추가로 vimrc 파일을 수정하여 vi에서 더욱 원활한 작업이 가능하도록 다음의 명령을 이용한다.

vi ~/.vimrc

아래의 설정 중 원하는 것을 골라 추가한다.

(참조 링크: http://norux.me/13 감사합니다.)

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

set number " line 표시
set autoindent " auto indent
set smartindent " smart indent
set cindent " c style indent
set shiftwidth=4 " shift를 4칸으로 함 ( >, >>, <, << 등의 명령어)
set tabstop=4 " tab 크기를 4칸으로 함
set ignorecase " 검색 시 대소문자를 구별하지 않음
set hlsearch " 검색 시 하이라이트(색상 강조)
set expandtab " tab 대신 띄어쓰기로
set background=dark " 검정 배경을 사용할 때, (이 색상에 맞춰 문법 하이라이트 색상이 달라집니다.)
set nocompatible " 방향키로 이동 가능
set fileencodings=utf-8,euc-kr " 파일 인코딩 형식 지정
set bs=indent,eol,start " backspace 키 사용 가능
set history=1000 " 명령어에 대한 히스토리를 1000개까지 표시
set ruler " 상태표시줄에 커서의 위치를 표시
set nobackup " 백업 파일을 만들지 않음
set title " 제목을 표시
set showmatch " 매칭되는 괄호를 보여줌
set nowrap " 자동 줄바꿈 하지 않음
set wmnu " ctrl+N 자동완성 시 가능한 목록을 보여줌

syntax on " 문법 하이라이트 켬"

===================
(ai, si, ci 는 셋 중 하나만 사용하여도 무방하다.)

이제 vi를 실행해 보면 아래와 같이 한결 나은 vi를 볼 수 있다.



.



쉽게 붙여넣기 위하여 주석을 떼어놓았다.

set number
set autoindent
set smartindent
set cindent
set shiftwidth=4
set tabstop=4
set ignorecase
set hlsearch
set expandtab
set background=dark
set nocompatible
set fileencodings=utf-8,euc-kr
set bs=indent,eol,start
set history=1000
set ruler
set nobackup
set title
set showmatch
set nowrap
set wmnu
syntax on

리눅스 커널 컴파일 방법 Linux

준비사항


- 전체 과정이 오래 걸린다. 3~4시간 정도 걸렸으며, PC 성능에 의해 좌우될 수 있다.

- 중간에 디스크 용량이 모자라 중단될 수 있으니 미리 충분한 디스크 공간을 확보하여야 한다.

- 작업은 root에서 하는 것을 권장한다. root가 아니면 컴파일 도중 permission denied 가 발생하여 중단될 수 있기 때문이다.

- 컴파일 진행 도중 필요한 패키지가 설치되어있지 않으면 진행이 막힐 수 있다. 이런 경우가 발생하지 않도록 미리 설치해둔다. 커널 컴파일에 필요한 패키지는 아래와 같다. 
gcc
make
flex
bison
libssl-dev
libncurses-dev
ncurses-dev
libncurses5-dev
libncursesw5-dev
rdate
python-pip
python-dev
libffi-dev
libssl-dev
libxml2-dev
libxslt1-dev
libjpeg8-dev
zlib1g-dev
mitmproxy
libelf-dev

간단히 한 번에 설치할 수 있도록 아래의 명령어를 이용한다.

sudo apt-get update -y && sudo apt-get install -y gcc make flex bison libssl-dev libncurses-dev ncurses-dev libncurses5-dev libncursesw5-dev rdate python-pip python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev libjpeg8-dev zlib1g-dev mitmproxy libelf-dev

(만약 libelf-dev이 없다면 libelf-devel 혹은 elfutils-libelf-devel 둘 중 하나를 설치한다.)


- 경험에 기반하면 SSL 관련 문제로 certification이 제대로 되지 않아 컴파일이 중단된 경우가 있었다.
이유는 모르겠으나 ssh-keygen 을 이용해 key를 생성한 후 빌드를 했을 땐 제대로 되었다.
혹 이와 같은 문제가 발생한다면 참고하기 바란다.




커널 컴파일 방법


1. 아래 사이트에 들어가서 원하는 버전의 커널의 링크를 얻는다.

https://www.kernel.org/

현재 최신 버전(4.17.11)의 링크는 아래와 같다.

https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.17.11.tar.xz

위 링크를 wget으로 받아온다.


wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.17.11.tar.xz



2. 압축을 푼 후 소스 디렉토리로 옮기고, config 파일을 복사해온다.

xz -d linux-4.17.11.tar.xz && tar -xvf linux-4.17.11.tar && sudo mv linux-4.17.11 /usr/src && cd /usr/src/linux-4.17.11 && cp /boot/config-4.15.0-29-generic .config

(config 버전은 개인 별로 상이할 수 있으니 확인 후 복사한다.)



3. 컴파일 한다.

make clean && make menuconfig

(menuconfig 과정이 오래 걸린다.)

성공 시 아래와 같은 문구를 확인할 수 있다.

************************************************

Setup is 17180 bytes (padded to 17408 bytes).

System is 8273 kB

CRC 533dd9e1

Kernel: arch/x86/boot/bzImage is ready  (#1)

************************************************

make

make bzImage

make modules && make modules_install

make install



4. 부팅 메뉴에 새로운 커널이 추가되었는지 확인한다.

vi /boot/grub/grub.cfg

커널 make 과정에 성공했다면 새로운 커널 버전에 해당하는 내용이 추가된 것을 볼 수있다.

grub.cfg 은 부팅 시에 부팅할 커널의 종류를 지정하는 파일이며, 안에 내용은 배포판 등에 따라 조금씩 다를 수 있다.

title 혹은 menuentry 라는 키워드로 시작하는 내용들이 각 버전에 대한 부트 정보이며, 그 순서는 가장 위에 있는 것부터 
0123 순으로 번호가 증가한다.

새로 추가한 커널이 가장 위에 있다면 default값을 0으로, 아니라면 순서에 해당하는 번호를 default 값으로 주도록 설정
한다.



5. reboot 한다.

켜지면

uname -a

을 이용하여 부팅된 커널의 버전을 확인한다.



만자로 리눅스 vmware에 설치하기 Linux



1. 만자로 리눅스 다운로드: https://manjaro.org/get-manjaro/





XFCE, KDE, GNOME 세 가지 GUI를 지원한다.


원하는 GUI 버전을 선택한 뒤 다운로드한다.


토렌트가 다이렉트보다 속도가 안나왔던 것 같다.



2. vmware를 실행시킨다.


Create a New Virtual Machine 선택 후 아래와 같이 진행한다.




다운로드받은 만자로 리눅스 이미지를 선택한 후 Next를 누른다.





현재 날짜 기준 vmware에서는 만자로 리눅스용 VM을 별도로 지원하지 않는데,


Other Linux 에서 최신 커널 버전 64bit로 만들면 정상적으로 실행된다.







VM 이름 및 위치, 용량를 지정한 후 Next - FInish 를 누르면 VM이 생성된다.


Play Virtual Machine을 누르면 아래와 같이 실행되는 것을 볼 수 있다.





Boot: Manjaro.x86_64.xfce 를 선택하면 만자로 리눅스 부팅이 가능하다.



현재 날짜 기준 만자로 리눅스에서는 한글 언어를 지원하지 않는 것 같다.


하지만 한글 로케일 설정은 가능하다고 한다.


한글 로케일 설정과 관련된 글의 링크를 걸어두겠다.








위와 같은 화면이 뜨는 것을 볼 수 있다.


Launch Installer 를 선택하면 언어, 지역, 키보드, 사용자 세팅 등등을 거쳐 완전히 설치할 수 있다.








restart 하면 정상 실행된다.





라즈베리파이 OS 설치 및 유선 랜 ssh 연결 방법 Raspberry Pi


1. Raspbian OS 설치 방법



1. Raspbian OS 다운로드 사이트: https://www.raspberrypi.org/downloads/


위의 RASPBIAN 을 클릭한 후,




전체 설치를 원한다면 RASPBIAN STRETCH WITH DESKTOP을,

최소 설치를 원한다면 RASPBIAN STRETCH LITE를 선택하여 다운로드한다.




2. 마이크로 SD카드를 컴퓨터에 삽입한다.

컴퓨터에 마이크로SD카드 슬롯이 있다면 그냥 삽입하고, 없으면 USB 어댑터 또는 SD카드 어댑터를 사용하여 삽입힌다.





필자는 노트북에서 작업하는데 마이크로 SD카드 슬롯이 없어서 위와 같은 SD 어댑터를 이용했다.






3. 필자는 이미 Raspbian을 한 번 올린 상태라 파티션이 두개로 쪼개져 있는 것을 볼 수 있다.


만약에 마이크로 SD카드가 이미 포맷되어있는 상태라서 파티션 1개로 깨끗한 상태라면 4번으로 바로 넘어간다.


혹여나 위와 같은 상황에서 Raspbian을 다시 올리려는 사람을 위해 포스팅을 하자면,




[시작]에서 "diskmgmt" 를 입력하면 디스크 관리 유틸리티가 실행되는 것을 볼 수 있다.




빨간 테두리로 표시된 두 개의 파티션(boot 파티션과 그 오른쪽의 이름 없는 파티션)을 오른쪽 클릭 후 "볼륨 삭제" 를 눌러 삭제한다.




정상적으로 삭제된 것을 볼 수 있다.




[내 PC] 화면에서도 확인할 수 있다.




4. 다운로드 받은 RASPBIAN 이미지를 마이크로 SD카드에 올린다.


대표적으로 Win32DiskImager 라는 유틸리티를 이용하여 올린다.


Win32DiskImager 다운로드 사이트: https://sourceforge.net/projects/win32diskimager/


위 사이트에서 설치 파일을 다운로드 받을 수 있다.


혹시나 무설치 버전을 원한다면 직접 구해서 쓰는 것을 권한다.

(무설치가 공식 버전이 아닌 것 같아서 링크를 걸기가 좀 그렇다.)



설치 후 프로그램을 실행하면 아래와 같은 화면을 볼 수 있다.






Image File 에 다운받은 Raspbian img 파일을, Device에 마이크로 SD카드를 선택한 후 "Write" 버튼을 누른다.

버튼을 누르면 이미지 로딩이 시작되고, 완료되면 Write Successful 문구를 볼 수 있다.









2. 유선 랜 연결 및 SSH Enable 방법



1. RJ45 케이블을 이용하여 컴퓨터의 이더넷 포트와 라즈베리파이의 이더넷 포트를 연결한다.






2. 이제부터가 중요한데, 먼저 유선 랜 연결부터 해보겠다.


네트워크 및 인터넷 설정 열기 - 어댑터 옵션 변경 에서

현재 인터넷을 사용하고 있는 랜카드에서 오른쪽 클릭 후 [속성] 을 누른다.









[공유] 탭에서 해당 부분에 체크 표시 후 아래의 이름에 라즈베리파이와 유선 케이블로 연결되어있는 현재 컴퓨터의 랜카드를 선택한다.

대개 "로컬 영역 연결" 으로 되어있을 것이다.

필자는 "이더넷" 으로 되어있으므로 이더넷으로 설명하도록 하겠다.





이더넷 오른쪽 클릭 - 설정 - IPv4 클릭 후 [속성] 을 누른다.


그러면




이더넷 랜카드의 IP가 192.168.137.1 로 고정되어있는 것을 볼 수 있다.


라즈베리파이의 IP는 이더넷의 IP주소와 같은 네트워크 상에 존재해야 하므로


192.168.137.2 ~ 192.168.137.254 대역 안에서 할당해야 한다.


그럼 바로 할당해주도록 하자.


Raspbian을 설치한 마이크로 SD카드에서 "cmdline.txt" 파일을 실행한다.







파일을 열면 텍스트 맨 끝에 ip=192.168.137.xxx 라고 추가 후 저장해 준다.

필자는 xxx에 10을 기재하였지만, 2~254 범위 내에서 자유롭게 할당 가능하다.



3. ssh enable 하는 방법은 아래와 같다.




새로 만들기 - 텍스트 문서 를 클릭한다.




ssh 란 이름의 확장자가 없는 그냥 파일을 만든다.


해당 파일 생성 후 라즈베리파이에 마이크로 SD카드를 꽂으면


ssh 파일이 사라지면서 ssh가 enable되는 구조이다.


위의 상태에서 마이크로 SD를 분리하여 라즈베리파이에 삽입 후 5pin 충전기를 이용하여 전원을 인가한다.



4. 조금 기다린다. 라즈베리파이의 LED가 바쁘게 깜빡이는 것을 볼 수 있다.


불빛이 안정되었다 싶으면 putty를 이용해 라즈베리파이에 접속해보도록 한다.


혹시나 putty가 없다면 아래의 링크에서 다운로드한다.


putty 한글 무설치 다운로드: http://hputty.org/





호스트 네임에 cmdline.txt에 기재했던 IP주소를 입력하고 포트번호를 22로 설정한 후 [Open] 을 누른다.





그러면 접속이 잘 되는 것을 볼 수 있다.


위의 영어를 해석하면, Putty에 등록된 공개키와 라즈베리파이에 등록된 키가 상이하다는 뜻인데,

"예" 를 누르면 Putty의 키를 갱신할 수 있다. "예" 를 누른다.

"아니오"를 접속이 누르면 안되니 누르지 않도록 한다.





라즈베리파이의 초기 아이디 및 패스워드는 다음과 같다.

아이디: pi
패스워드: raspberry

실제로 패스워드 입력 시에는 위엣처럼 문자가 찍히지 않으니 당황하지 않고 패스워드를 입력하기 바란다.





그러면 정상 로그인이 되는 것을 볼 수 있다.





1