일반적인 Linux 배포판을 쓰지 않고, Kernel source와 Root file system 으로 부터 Linux system 을 구성한 경우,

Linux runtime 에 kernel module을 compile 하여 insmod/rmmod 를 할 수 있다.


Kernel module을 컴파일 하기 위해서는 현재 Linux system 에서 사용되고 있는 kernel source를 필요로 한다.

일반적인 방법과 유사하게 사용하기 위해

kernel source 를 /usr/src 디렉토리에 위치시키고,

/lib/modules/<kernel_version>/build 와 symbolic link 시킨다.

# cd /lib/modules/<kernel_version>

# ln -s /usr/src/<kernel_source_dir> build

커널 모듈을 컴파일 하기 위한 준비 작업은 아래 와 같다.

# cd /usr/src/<kernel_source_dir>

# make <defconfig>

# make prepare

# make scripts

※ 참조: http://www.fun25.co.kr/blog/linux-ubuntu-14-04-kernel-module-compile


kernel module을 컴파일 할 Makefile은 아래와 같이 구성한다.

obj-m := test_module.o


all:

make -C /lib/modules/<kernel_version>/build M=$(PWD) modules

clean:

make -C /lib/modules/<kernel_version>/build M=$(PWD) clean

아래는 테스트를 위한 기본적인 kernel module source code.

#include <linux/module.h>

#include <linux/kernel.h>


int init_module(void){

printk(KERN_ALERT"Hello"\n);

return 0;

}


void cleanup_module(void){

printk(KERN_ALERT"Bye"\n);

}


kernel module을 컴파일 하고, insmod/rmmod 를 통해 test 한다.

# make

# insmod <kernel_module>.ko

# rmmod <kernel_module>.ko

※ 이 때, 현재 Linux system 에서 사용되는 kernel 과 다른 source로 부터 kernel module을 컴파일 하게 되면 version 차이로 오류가 나타난다.

'Programming > Linux Kernel' 카테고리의 다른 글

cross kernel debugging  (0) 2020.06.19
Kernel module programming  (0) 2018.05.23
Kernel Version Check  (0) 2018.05.23
Kernel 프로그래밍 - printk  (0) 2017.06.20

Linux 명령어 중에 Shell 접속이 끊어지더라도, 프로세스를 죽이지 않기 위해 screen 을 사용할 수 있다.


screen 은 가상의 shell을 담당하여, 실제 shell의 접속 여부와 상관없이 프로세스를 계속적으로 진행하게 해준다.


초간단 사용법

1. 스크린 생성

$ screen

screen 명령어에 아무런 옵션이 없는 경우 임의의 이름을 가지는 screen을 생성한다.

이름을 지정하기 위해서는 screen -S <NAME> 과 같이 -S 옵션을 사용하면 된다.


2. Detach

screen에 접속한 상태에서 screen으로 명령을 전달하기 위해서는 ctrl+a 를 입력 한 뒤에 명령을 입력해야 한다.

screen에서 접속을 해제하는 detach 명령어는 d 이다


3. List 확인

Detach 한 screen에 재접속(Reattach) 하기 위해서는 우선 해당 screen의 이름을 알거나, Process ID를 알아야 한다.

Screen의 Process ID를 확인하기 위해서는 아래와 같이 -x 옵션을 사용한다.

$ screen -x

이 때, 활성화된 screen 이 1개밖에 없는 경우, 해당 screen으로 바로 재접속(Reattach) 된다.


4. Reattach

3에서 확인한 Process ID 혹은 screen 이름으로 Reattach 하는 명령은 -r 옵션을 사용한다.

$ screen -r <Process_ID | screen_name>


5. Kill

screen에 접속한 상태에서 해당 screen을 kill 하는 명령어는 k 이다.

Kill 명령의 경우 진짜로 죽일 것인지 한 번 더 확인한다.


6. Screen for running multiple processes

Screen command option 중 -dmS 옵션을 사용하면 각 Process를 동작하는 screen을 여러개 생성할 수 있다. 프로세스가 종료되면 screen 또한 종료된다.

Bash script 와 함께 활용하면 유용하다.

#!/bin/bash


for size in 2 4 8 16 32

do

    screen -dmS screen_${size} ./test.sh ${size}

done


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

How to use GDB  (0) 2020.03.12
PhantomJS Installation on Ubuntu from source  (0) 2018.12.10
Xshell + Xming  (0) 2018.09.10
Memtester  (0) 2018.07.15
Ctags  (0) 2018.07.03

라즈베리파이 등을 사용할 때, Root Filesystem의 size가 실제 SD 카드의 사이즈 보다 작게 인식 되는 경우가 있다.

라즈베리 파이의 경우에는 raspi-config를 사용하여 resize 할 수 있지만,

일반적인 Command를 사용해서 resize 하는 방법은 아래와 같다.

해당 과정 중에 문제가 생기는 경우 Kernel panic으로 다시 살릴 수 없기에 SD카드를 백업해 둘 것을 추천한다.

 - 백업은 win32 DiskImager로 Read 하면 이미지로 백업 가능. 추후 write로 복원


1. 현재 partition 확인

fdisk 로 device 정보 확인 후,

$ fdisk -l


해당 디바이스의 사이즈가 실제 디바이스의 사이즈보다 작은 경우

partition table을 다시 작성해준다.

이 때, partition table Start sector를 확인해 둔다.

$ fdisk /dev/mmcblk0


우선 기존의 작게 인식되는 partition을 삭제해 준다.

Command (m for help): d

Partition number (1,2, default 2): 2


새로 partition을 추가 한다.

이때, start sector가 위에서 확인한 기존 partition table과 일치해야 kernel panic이 나지 않을 것이다.

Command (m for help): n

Partition type

p    primary (1 primary, 0 extended, 3 free)

e     extended (container for logical partitions)

Select (default p): p

Partition number (2-4, default 2): 2

First sector (2088450-31116287, default 2088960): 2088450

Last sector, +sectors or +size{K,M,G,T,P} (2088450-31116287, default 31116287): 


작성된 partition table을 저장 하고 종료한다.

Command (m for help): w


현재 사용 중인 시스템에서는 partition table을 다시 작성한 것이 재부팅 후에 인식이 되므로, 시스템을 재부팅 해준다.

$ shutdown -r now


재부팅 된 시스템에서, partition 사이즈가 제대로 인식이 되는지 확인한다.

$ fdisk -l


제대로 인식이 됐다면, resize를 해준다.

$ resize2fs /dev/mmcblk0p2


끗.

'Programming > RaspberryPi' 카테고리의 다른 글

Rasbian qbittorrent-nox installation  (0) 2019.11.19
SD card image backup  (0) 2018.10.12
RaspberryPi Remote Desktop Client  (0) 2018.06.01
Raspbian Korean(Hangul) Install  (0) 2018.05.18
Raspbian Install  (0) 2018.05.16

Linux 에서 여러 파일 간의 코드 연결을 보고자 할 때, Ctags를 활용 할 수 있다.


설치

$ sudo apt-get install ctags


태그 생성

$ ctags -R


명령어(Vim 사용 중)

 - 커서 + Ctrl + ] : 커서 위치의 tag로 이동(push to stack)

 - :ts : tag stack 확인

 - Ctrl + t : Pop stack

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

Xshell + Xming  (0) 2018.09.10
Memtester  (0) 2018.07.15
scp  (0) 2018.05.29
Systemd Service  (0) 2018.05.04
Linux tar, gz, bz2  (0) 2018.04.25

Linux 상에서 다른 서버의 파일을 복사해 오고자 하는 경우

scp 명령어를 활용할 수 있다.


scp 명령어는 cp와 문법이 비슷하다.

$ scp <user_id>@<ip_addess_of_source>:/<file> <user_id>@<ip_address_of_dest>:/<file_name>

scp 명령어를 사용하는 서버로(부터) 옮기고자 하는 경우에는 <user_id>@<ip_address>:를 생략 할 수 있다.


scp 명령어를 사용할 때 password를 포함하게 하는 방법

$ sshpass -p '<PASSWORD>' scp <user_id>@<ip_addess_of_source>:/<file> <user_id>@<ip_address_of_dest>:/<file_name>

※ 이렇게 사용하면 PASSWORD가 드러날 수 있으니 보안에 취약하다는 점을 유념하자.

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

Memtester  (0) 2018.07.15
Ctags  (0) 2018.07.03
Systemd Service  (0) 2018.05.04
Linux tar, gz, bz2  (0) 2018.04.25
Linux HDD mount  (0) 2018.04.06

Linux 시스템 상에서 kernel의 version을 확인하기 위한 방법

$ cat /proc/version


참조: https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EC%BB%A4%EB%84%90_%EB%B2%84%EC%A0%84_%ED%99%95%EC%9D%B8

'Programming > Linux Kernel' 카테고리의 다른 글

cross kernel debugging  (0) 2020.06.19
Linux kernel module compile from linux source  (0) 2019.01.17
Kernel module programming  (0) 2018.05.23
Kernel 프로그래밍 - printk  (0) 2017.06.20

Linux에서 백그라운드로 자동으로 실행하게끔 service를 등록할 수 있다.

현재 등록된 service 목록은 /etc/systemd/system 경로에 *.service 파일을 보면 확인 할 수 있다.


systemd는 Linux의 init system 중 하나로,

init system을 사용하는 가장 기본적인 이유는 Linux system 이 부팅 된 다음 User영역의 Component를 initialize 하기 위함이다.

또한 백그라운드에서 동작하는 daemon이나 서비스를 관리하기 위함이다.

간단하게, /etc/init.d 경로에 있는 script 등은 System V init, /etc/systemd/system 경로에 있는 *.service는 systemd 라고 생각하면 된다.


가장 간단하게 systemd를 추가하는 방법은 아래와 같은 파일을 /etc/systemd/system 경로에 추가 하면 된다.

파일 이름은 <service_name>.service

[Unit]

Description=<Description of your own service>

After=network.target


[Service]

ExecStart=<File would be executed with this service>


[Install]

WantedBy=multi-user.target

Description: 해당 service에 대한 설명으로, systemctl status로 확인 할 때 가장 첫 줄에 표현된다.

ExecStart: 실행할 파일의 절대경로

※위의 ExecStart 로 표기된 파일은 ./<file> & 와 비슷한 방식으로 구동되기 때문에, 실행되는 파일의 첫 줄에 해당 파일을 실행할 shell을 나타내는 shebang(#!)을 포함해줘야 한다.


<service_name.service 파일을 추가 한 후에는,

$ sudo systemctl daemon-reload

를 통해 새로운 모듈을 load 하고,

시작, 정지, 상태 확인은 아래와 같은 명령어로 할 수 있다.

$ sudo systemctl start <service_name>

$ sudo systemctl stop <service_name>

$ sudo systemctl restart <service_name>

$ sudo systemctl status <service_name>

부팅 시 자동으로 실행되게 하기 위해서는 아래와 같이 enable 하면 된다.

$ sudo systemctl enable <service_name>

$ sudo systemctl disable <service_name>


참조: https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units



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

Ctags  (0) 2018.07.03
scp  (0) 2018.05.29
Linux tar, gz, bz2  (0) 2018.04.25
Linux HDD mount  (0) 2018.04.06
HandBrakeCLI  (0) 2018.04.06

Linux 압축 하기/압축 풀기


Tape Archive

tar은 Tape Archive 의 약자로, 옛날부터 Tape 드라이브를 백업하기 위해 사용했다고 한다. tarball 이라고 불리기도 한다고 한다.

tar은 압축을 옵션으로 줄 수 있는데, gzip 으로 압축을 하면 tar.gz 파일이, bzip2로 압축하면 tar.bz2 가 생성된다.

tar command의 (사실은 상당히 많은 옵션을 가지고 있지만) 기본적인 옵션은 아래와 같다.

c : Create a new .tar file

v : Verbosely show the pregress

f : File name

x : Extract

t : List content

z : for gzip

j : for bzip2


간단 사용예

tar 압축 하기

$ tar -cvf <output_file_name>.tar <input_folder>

tar 압축 풀기

$ tar -xvf <input_file_name>.tar 

tar.gz 압축 하기

$ tar -zcvf <output_file_name>.tar.gz <input_folder>

tar.gz 압축 풀기

$ tar -zxvf <input_file_name>.tar.gz 

tar.bz2 압축 하기

$ tar -jcvf <output_file_name>.tar.bz2 <input_folder>

tar.bz2 압축 풀기

$ tar -jxvf <input_file_name>.tar.bz2 


보다 자세한 내용은, https://www.tecmint.com/18-tar-command-examples-in-linux/ 참조

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

scp  (0) 2018.05.29
Systemd Service  (0) 2018.05.04
Linux HDD mount  (0) 2018.04.06
HandBrakeCLI  (0) 2018.04.06
Linux sed  (0) 2018.02.05

리눅스에서 새 하드디스크를 마운트 하고 자 하는 경우


우선 fdisk 를 통해 새 하드디스크의 device number?(sda | sdb | sdc ...)를 확인해야한다.

$ sudo fdisk -l


확인한 device number(예시 sdc)를 가지고 fdisk 를 통해 파티션을 설정한다.

$ sudo fdisk /dev/sdX

Command (m for help): n

Partition type

p    primary (0 primary, 0 extended, 4 free)

e    extended (container for logical partitions)

Select (default p): 

Partition number (1-4, default 1):

First sector (2048-41943039, default 2048):

Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039):


Created a new partition 1 of type 'Linux' and of size 20 GiB.


Command (m for help): w

The partition table has been altered.

Calling ioctl() to re-read partition table.

Syncing disks.


파티션 설정이 끝나면, 포멧을 해야한다.

일반적으로 리눅스에서는 ext4 포멧을 사용한다.

$ sudo mkfs.ext4 /dev/sdc


이제 하드디스크가 준비가 완료 된 것이다.

다음은, 해당 하드디스크를 디렉토리 어딘가에 마운트 해야한다.

$ sudo mkdir /mnt

$ sudo mount /dev/sdc /mnt


그러나, 위와 같은 방법으로 마운트를 하면 매번 컴퓨터를 켤 때 마다 새로 마운트를 해줘야 한다.

컴퓨터가 부팅 될 때 자동으로 마운트는 /etc/fstab을 참조하여 하는데,

/etc/fstab에 해당 HDD를 추가하면 된다.

fstab에 HDD 정보를 UUID를 바탕으로 적어주기 때문에 이를 위해서는 우선, HDD의 UUID를 확인해아 한다.

$ sudo blkid

UUID를 확인하여 클립보드로 복사해 둔후

vi editor로 etc/fstab을 수정한다.

$ sudo vi /etc/fstab

fstab에 추가하는 형식은 아래와 같다.

<file system> <mount point> <type> <options> <dump> <pass>

UUID=5aa86733-92d5-4060-9086-d026d9409e7b /mnt ext4

이때, options, dump, pass는 입력하지 않아도 기본적으로 동작하는데는 문제없다.


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

Systemd Service  (0) 2018.05.04
Linux tar, gz, bz2  (0) 2018.04.25
HandBrakeCLI  (0) 2018.04.06
Linux sed  (0) 2018.02.05
Linux find  (0) 2018.02.04

Linux에서 동영상 인코더로 많이 사용하는 HandBrake

Command Line 명령어로 HandBrake를 사용하기


옵션이 많아 따지기 귀찮으면

간단하게 preset을 사용하면 된다.

$ HandBrakeCLI --input <input_file> --output <output_file> --preset 'Devices/Apple 540p30 Surround'


preset list는

$ HandBrakeCLI --preset-list

로 확인하자


위의 Apple preset이 너무 느려서... 내가 사용하는 옵션은

$ HandBrakeCLI --input <input_file> --output <output_file> --encoder x264 --encoder-preset ultrafast  --rate 30 --width 640 --height 360


자세한 옵션은 help 옵션으로 확인하자.

$ HandBrakeCLI --help


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

Linux tar, gz, bz2  (0) 2018.04.25
Linux HDD mount  (0) 2018.04.06
Linux sed  (0) 2018.02.05
Linux find  (0) 2018.02.04
Ubuntu sources.list generation  (0) 2017.09.06

+ Recent posts