'apt-get install codespell' 명령어를 사용하면 됩니다.
 
root@raspberrypi:/home/pi# apt-get install codespell
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  gconf-service gconf2-common libexiv2-14 libgconf-2-4 libgfortran3 libgmime-2.6-0 libncurses5 libssl1.0.2 uuid-dev vlc-l10n vlc-plugin-notify
  vlc-plugin-samba vlc-plugin-video-splitter vlc-plugin-visualization
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
  codespell
0 upgraded, 1 newly installed, 0 to remove and 23 not upgraded.
Need to get 86.2 kB of archives.
After this operation, 385 kB of additional disk space will be used.
Get:1 http://ftp.harukasan.org/raspbian/raspbian buster/main armhf codespell all 1.14.0-1 [86.2 kB]
Fetched 86.2 kB in 3s (28.9 kB/s)
Selecting previously unselected package codespell.
(Reading database ... 161005 files and directories currently installed.)
Preparing to unpack .../codespell_1.14.0-1_all.deb ...
Unpacking codespell (1.14.0-1) ...
Setting up codespell (1.14.0-1) ...
Processing triggers for man-db (2.8.5-2) ...
 
설치 완료!
 
root@raspberrypi:/home/pi# codespell
WARNING: Binary file: ./.Xauthority
최신 라즈비안 이미지는 SSH가 비활성화돼 있습니다.
아래 블로그에서 도움 받아 해결했습니다.
 
< 출처 >

 

화면 없이 Rasperry Pi에서 SSH를 활성화

Rasperry Pi를 연결하는 데 사용할 수 있는 여분의 HDMI 디스플레이나 키보드가 없는 경우, SSH라는 빈 파일을 부팅 파티션에 배치하면 쉽게 SSH를 활성화할 수 있습니다.

Rasperry Pi에서 SSH를 활성화하려면 다음 단계를 수행합니다.

라즈베리 파이의 전원을 끄고 SD 카드를 제거합니다.

SD 카드를 컴퓨터의 카드 판독기에 삽입합니다. SD 카드가 자동으로 마운트됩니다.

OS 파일 관리자를 사용하여 SD 카드 부팅 디렉토리로 이동합니다. Linux 및 MacOS 사용자도 명령줄에서 이 작업을 수행할 수 있습니다.

부팅 디렉터리 내에 확장자 없이 ssh라는 새 빈 파일을 만듭니다.

컴퓨터에서 SD 카드를 꺼내 라즈베리 파이 안에 넣습니다.

피보드의 전원을 켭니다. 부팅 시 Pi가 이 파일의 존재 여부를 확인하고 파일이 존재하면 SSH가 활성화되고 파일이 제거됩니다.

라즈베리 파이만 부팅하면 SSH를 넣을 수 있습니다.

 

 

 

Rasperry Pi에서 SSH를 활성화

Rasperry Pi에 HDMI 모니터를 연결한 경우 데스크톱 GUI 또는 터미널에서 SSH를 수동으로 활성화할 수 있습니다.

 

 

 

GUI에서 SSH를 사용하도록 설정

명령줄보다 GUI를 선호하는 경우 다음 단계를 수행하십시오.

기본 설정 메뉴에서 "Raspberry Pi 구성" 창을 엽니다.

인터페이스 탭을 클릭합니다.

SSH 행 옆에 있는 "Enable"을 선택합니다.

Raspberry Pi : SSH 활성화 방법, 예제, 명령어

 

 

변경 내용을 적용하려면 "확인" 단추를 클릭하십시오.

 

 

 

터미널에서 SSH를 사용하도록 설정

Ctrl+Alt+T를 사용하여 터미널을 엽니다. 바로 가기 키를 누르거나 터미널 아이콘을 클릭하고 다음을 입력하여 raspi-config 도구를 시작합니다.

raspi-config

 

 

키 위로 또는 아래로 키를 사용하여 "인터페이스 옵션"으로 이동한 후 Enter 키를 누릅니다.

SSH로 이동하고 Enter 키를 누릅니다.

SSH 서버를 사용하도록 설정할지 묻는 메시지가 표시됩니다. Yes를 선택하고 Enter 키를 누릅니다.

다음 창에서는 SSH 서버가 사용 가능함을 알려줍니다. Enter top을 눌러 기본 메뉴로 돌아가 "Finish"를 선택하여 raspi-config 대화상자를 닫습니다.

또는 raspi-config 도구를 사용하는 대신 systemctl을 사용하여 ssh 서비스를 시작하고 활성화하기만 하면 됩니다.

sudo systemctl enable ssh
sudo systemctl start ssh

 

 

 

SSH를 통해 Rasperry Pi를 연결

SSH를 통해 Pi에 연결하려면 Rasperry Pi IP 주소를 알아야 합니다. 화면 없이 Pi를 실행하는 경우 라우터의 DHCP 임대 테이블에서 IP 주소를 찾을 수 있습니다. 그렇지 않은 경우 모니터를 연결한 경우 ip 명령을 사용하여 보드 IP 주소를 확인합니다.

ip a

 

 

IP 주소를 찾았으면 컴퓨터에서 Rasperry Pi에 연결할 수 있습니다. 윈도우즈 사용자는 PuTTY와 같은 SSH 클라이언트를 사용할 수 있습니다.

Linux 및 MacOS 사용자는 기본적으로 SSH 클라이언트가 설치되어 있으며 다음을 입력하여 Pi에 SSH할 수 있습니다.

ssh pi@pi_ip_address

 

 

파이보드의 IP 주소로 pi_ip_address를 변경합니다. "pi" 사용자 암호를 변경하지 않은 경우 기본 암호는 raspberry입니다.

SSH를 통해 처음 연결하면 RSA 키 지문을 수락하라는 메시지가 표시됩니다. 계속하려면 "예"를 입력하십시오.

Rasperry Pi에 로그인하면 아래 메시지와 유사한 메시지가 표시됩니다.

# Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l
# 
# The programs included with the Debian GNU/Linux system are free software;
# the exact distribution terms for each program are described in the
# individual files in /usr/share/doc/*/copyright.
# ...

 

 

인터넷에 Pi를 노출하는 경우 몇 가지 보안 조치를 실행하는 것이 좋습니다. 기본적으로 SSH는 포트 22에서 수신 대기합니다. 기본 SSH 포트를 변경하면 자동 공격의 위험을 줄여 시스템에 추가 보안 계층이 추가됩니다. SSH 키 기반 인증을 설정하고 암호를 입력하지 않고 연결할 수도 있습니다.

Rasperry Pi에서 SSH를 활성화하는 방법을 배웠습니다. 이제 보드 추가에 로그인하여 명령 프롬프트를 통해 일반적인 sysadmin 태스크를 수행할 수 있습니다. Linux 및 MacOS 사용자는 SSH 구성 파일의 모든 SSH 연결을 정의하여 워크플로우를 단순화할 수 있습니다.

 

Putty를 사용해 라즈베리 파이에 접근하면 '복사'된 내용이 붙혀 넣기가 되지 않습니다.
터미널이 Default로 Visual 모드이기 때문입니다.
 
이럴 때 .vimrc 파일을 열고 수정해야 합니다.
 
사용 방법
 
.vimrc 파일 오픈합니다.
 
austin@raspberrypi:~/work/0722_work $ vi cred_trace.sh
austin@raspberrypi:~/work/0722_work $ cd ~
austin@raspberrypi:~ $ vi .
./                    .bash_history         .cache/               .profile              .xsession-errors
../                   .bash_logout          .config/              .viminfo              .xsession-errors.old
.Xauthority           .bashrc               .local/               .vimrc
austin@raspberrypi:~ $ vi .vimrc
 
그 다음 아래와 같은 코드를 추가합니다.
 
set mouse-=a
 
이제 복사와 붙혀넣기가 잘 됩니다.
 

이번 포스트에서는 라즈베리 파이에서 삼바를 설정하는 방법을 소개합니다.

 
환경: 라즈베리 파이4

삼바 설치
 
아래 명령어를 입력해 삼바를 설치합니다.
 
'sudo apt install samba samba-common-bin'
 
위 명령어를 라즈베리 파이의 터미널을 열고 입력해봤습니다.
 
pi@raspberrypi:~ $ sudo apt install samba samba-common-bin
Reading package lists... Done
Building dependency tree
Reading state information... Done
samba is already the newest version (2:4.9.5+dfsg-5+deb10u1+rpi1).
samba-common-bin is already the newest version (2:4.9.5+dfsg-5+deb10u1+rpi1).
The following packages were automatically installed and are no longer required:
  libexiv2-14 libgfortran3 libgmime-2.6-0 libncurses5 libssl1.0.2 uuid-dev vlc-l10n vlc-plugin-notify
  vlc-plugin-samba vlc-plugin-video-splitter vlc-plugin-visualization
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 140 not upgraded.
 
 
설치를 진행하다 보면 'Samba server and utilities' 창이 나타나면 'No'나 '아니오'를 선택합니다. multihomed smb network에만 필요하고, 일반 네트워크를 사용하는 경우에 필요하지 않습니다.
 
삼바 계정 추가
 
'sudo smbpasswd -a pi' 명령어를 입력해 pi라는 삼바 계정을 추가한 다음에 삼바 패스 워드를 입력합니다.
 
pi@raspberrypi:~ $ sudo smbpasswd -a pi
New SMB password:
Retype new SMB password:
 
 
이어서 '/etc/samba/smb.conf' 파일을 열고 다음과 같이 수정합니다.
 
[pi]
   comment = pi shared folder
   path = /home/pi
   valid users = pi
   browseable = yes
   guest ok = no
   read only = no
   create mask = 0777
 
아래는 제가 설정한 라즈베리 파이 설정 화면입니다.
 
이어서 'sudo service smbd restart' 명령어를 입력해 삼바를 재실행합시다.
 
pi@raspberrypi:~ $ sudo service smbd restart
 
 
처음 삼바를 restart 할 때는 pi 혹은 root를 선택하라는 옵션 창이 뜨는데 이 때 1(pi)을 선택하면 됩니다.
 
 
윈도 PC에서 삼바 접속하기
 
이제 윈도에서 삼바를 접속할 차례입니다.
아래 형식으로 디렉터리 창에서 명령어를 입력합시다.
 
\\ip주소\pi
 
제 pi 주소는 192.168.0.9 이니 다음과 같이 입력합니다.
 
\\192.168.0.9\pi
 
 
이후 패스 워드를 입력하라는 창이 뜨면 삼바를 설정할 때 입력했던 패스 워드를 입력합시다.
 
설정 결과 아래와 같이 라즈베리 파이에 삼바로 접속할 수 있었습니다.
 
삼바는 기존에 다른 블로그 유저 분들께서 올리신 자료를 바탕으로 잘 설정하게 됐습니다.
아래 블로그 운영자께 감사드립니다.
 
 
 
 
이번 절에서는 리눅스 커널을 빌드하는 과정에서 전처리 코드를 생성하는 방법을 소개합니다.
 
리눅스 커널 소스코드를 분석하다 보면 수많은 매크로를 만납니다. 리눅스 커널을 캡슐화나 다형성과 같은 객체지향 방식으로 구현하다 보니 매크로로 구현된 코드가 많습니다. 그런데 이 매크로가 소스 분석의 걸림돌 중 하나로 작용합니다. 
 
전처리 코드는 이러한 매크로를 모두 풀어서 표현합니다. 따라서 훨씬 편하게 소스코드를 분석할 수 있으며, 리눅스 커널 코드를 분석할 때는 전처리 코드를 함께 보시기를 바랍니다.
 
전처리 코드는 GCC 컴파일 오브젝트를 생성하는 과정에서 추출됩니다. 커널에서 전처리 코드를 추출하는 방법은 크게 두 가지가 있습니다. 
 
전체 전처리 파일을 추출
특정 전처리 파일을 추출
 
전체 전처리 파일을 추출하는 방법
 
먼저 리눅스 커널의 전체 소스코드를 전처리 파일로 추출하는 방법은 다음과 같습니다.
 
01 diff --git a/Makefile b/Makefile
02 index 3da5790..0414cb2 100644
03  --- a/Makefile
04 +++ b/Makefile
05 @@ -419,6 +419,7 @@ KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
06            -fno-strict-aliasing -fno-common -fshort-wchar \
07            -Werror-implicit-function-declaration \
08            -Wno-format-security \
09 +          -save-temps=obj \
10            -std=gnu89
11  KBUILD_CPPFLAGS := -D__KERNEL__
12  KBUILD_AFLAGS_KERNEL :=
 
위 패치 코드에서 어떤 옵션이 전처리 코드를 추출하는 역할을 수행할까요? 바로 다음 09번째 줄의 '-save-temps=obj \' 구문입니다. 
 
09 +          -save-temps=obj \
 
패치 코드를 입력하는 방식의 이해를 돕기 위해 패치 코드를 반영하기 전 코드를 살펴보겠습니다.
 
Makefile
408 # Use LINUXINCLUDE when you must reference the include/ directory.
409 # Needed to be compatible with the O= option
410 LINUXINCLUDE    := \
411         -I$(srctree)/arch/$(hdr-arch)/include \
412         -I$(objtree)/arch/$(hdr-arch)/include/generated \
413         $(if $(KBUILD_SRC), -I$(srctree)/include) \
414         -I$(objtree)/include \
415         $(USERINCLUDE)
416
417 KBUILD_AFLAGS   := -D__ASSEMBLY__
418 KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
419            -fno-strict-aliasing -fno-common -fshort-wchar \
420            -Werror-implicit-function-declaration \
421            -Wno-format-security \
422            -std=gnu89
423 KBUILD_CPPFLAGS := -D__KERNEL__
424 KBUILD_AFLAGS_KERNEL :=
425 KBUILD_CFLAGS_KERNEL :=
426 KBUILD_AFLAGS_MODULE  := -DMODULE
 
위 Makefile 파일의 421번째 줄 다음에 다음 코드를 입력하면 됩니다.
 
-save-temps=obj \
 
-save-temps=obj \를 입력한 후의 Makefile은 다음과 같습니다. 
 
417 KBUILD_AFLAGS   := -D__ASSEMBLY__
418 KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
419            -fno-strict-aliasing -fno-common -fshort-wchar \
420            -Werror-implicit-function-declaration \
421            -Wno-format-security \
422            -save-temps=obj \
423            -std=gnu89
424 KBUILD_CPPFLAGS := -D__KERNEL__
425 KBUILD_AFLAGS_KERNEL :=
426 KBUILD_CFLAGS_KERNEL :=
427 KBUILD_AFLAGS_MODULE  := -DMODULE
 
이 같은 방식으로 Makefile 을 수정한 다음, 이전 절에 소개한 build_rpi_kernel.sh 커널 빌드 스크립트를 실행합시다. 그럼 전처리 코드가 out 폴더에 생성됩니다. 전처리 코드가 어떻게 생성됐는지 확인해 보겠습니다.
 
먼저 커널 스케줄링과 관련된 공통 코드가 담긴 kernel/sched/core.c 파일에 대한 전처리 코드를 찾아보겠습니다.
 
root@raspberrypi:/home/pi/rpi_kernel_src/out/kernel/sched# ls -al
total 33692
...
-rw-r--r--  1 root home  613852 Mar 19 09:35 .tmp_completion.i
-rw-r--r--  1 root home 20953 Mar 19 09:35 .tmp_completion.s
-rw-r--r--  1 root home 2800883 Mar 19 09:57 .tmp_core.i
-rw-r--r--  1 root home 368699 Mar 19 09:57 .tmp_core.s
-rw-r--r--  1 root home 1262723 Mar 19 09:35 .tmp_cpuacct.i
-rw-r--r--  1 root home 17772 Mar 19 09:35 .tmp_cpuacct.s
 
C 언어로 작성된 리눅스 커널 소스 파일은 다음 위치에서 전처리 파일로 생성됩니다. 
 
linux/kernel/sched/core.c
out/kernel/sched/.tmp_core.i
 
소스 파일명 앞에 ".tmp_"란 접두사와 맨 끝에 “i”가 붙습니다.
 
그럼 다른 리눅스 커널 소스코드는 어떻게 전처리 파일로 생성될까요? linux/init 폴더에 있는 아래 파일을 예로 들겠습니다.
 
calibrate.c  do_mounts.c do_mounts_initrd.c
 
위 파일들은 전처리 과정에서 out/init 폴더에 다음과 같은 이름으로 생성됩니다.
 
.tmp_calibrate.i  .tmp_do_mounts.i  .tmp_do_mounts_initrd.i
 
root@raspberrypi:/home/pi/rpi_kernel_src/out/init# ls -al
total 12912
-rw-r--r--  1 312538 Mar 19 09:34 .tmp_calibrate.i
-rw-r--r--  1 10928 Mar 19 09:34 .tmp_calibrate.s
-rw-r--r--  1 2830878 Mar 19 09:34 .tmp_do_mounts.i
-rw-r--r--  1 1616189 Mar 19 09:34 .tmp_do_mounts_initrd.i
-rw-r--r--  1 7311 Mar 19 09:34 .tmp_do_mounts_initrd.s
-rw-r--r--  1 1621237 Mar 19 09:34 .tmp_do_mounts_rd.i
-rw-r--r--  1 14425 Mar 19 09:34 .tmp_do_mounts_rd.s
 
위와 같이 커널 Makefile을 수정해 모든 리눅스 커널 소스 파일을 전처리 코드가 담긴 *.i 파일로 변환할 수 있습니다. 문제는 "*.i"뿐만 아니라 "*.s" 파일로 생성돼 용량이 5GB까지 늘어난다는 점입니다. 
 
특정 처리 파일을 추출하는 방법
 
대부분 특정 커널 소스 파일의 전처리 파일을 열어 보고 싶을 때가 많을 것입니다. 이번에는 특정 소스 파일만 전처리 파일로 생성하는 방법을 알아보겠습니다. 먼저 다음과 같은 셸 스크립트 코드를 실행해야 합니다.
 
build_preprocess_RPi_kernel.sh
01 #!/bin/bash
02
03 echo "configure build output path"
04 
05 KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
06 OUTPUT="$KERNEL_TOP_PATH/out"
07 echo "$OUTPUT"
08 
09 KERNEL=kernel7
10 BUILD_LOG="$KERNEL_TOP_PATH/rpi_preproccess_build_log.txt"
11 
12 PREPROCESS_FILE=$1
13 echo "build preprocessed file: $PREPROCESS_FILE"
14
15 echo "move kernel source"
16 cd linux
17
18 echo "make defconfig"
19 make O=$OUTPUT bcm2709_defconfig
20
21 echo "kernel build"
22 make $PREPROCESS_FILE O=$OUTPUT zImage modules dtbs -j4 2>&1 | tee $BUILD_LOG
 
위와 같은 코드를 입력한 후 build_preprocess_rpi_kernel.sh라는 이름으로 저장합니다. 파일을 저장한 후 다음 명령어로 실행 권한을 줍니다.
 
root@raspberrypi:/home/pi/rpi_kernel_src# chmod +x build_preprocess_RPi_kernel.sh
 
앞에서 소개한 build_rpi_kernel.sh 빌드 스크립트에 세 줄 정도를 추가했는데, 아래의 12~13번째 줄은 셸 스크립트를 실행할 때 전달하는 소스코드의 이름입니다.
 
12 PREPROCESS_FILE=$1
13 echo "build preprocessed file: $PREPROCESS_FILE"
 
다음으로 22번째 줄의 코드를 보겠습니다.
 
22 make $PREPROCESS_FILE O=$OUTPUT zImage modules dtbs -j4 2>&1 | tee $BUILD_LOG
 
커널 코드를 빌드하는 명령어에 "$PREPROCESS_FILE"이라는 구문이 추가됐습니다. 이는 지정한 파일만 전처리 파일로 추출하라는 뜻입니다.
 
이번에는 build_preprocess_rpi_kernel.sh 셸 스크립트를 실행하는 방법을 알아보겠습니다. build_preprocess_rpi_kernel.sh 셸 스크립트를 실행할 때는 디렉터리를 포함한 파일 이름을 지정해야 합니다. 
 
build_preprocess_rpi_kernel.sh [파일이름.i]
 
예를 들어, linux/sched/core.c 파일을 전처리 코드로 추출하려면 다음 형식으로 셸 스크립트를 실행하면 됩니다.
 
build_preprocess_rpi_kernel.sh kernel/sched/core.i
 
이번에는 라즈베리 파이에서 다음 명령어로 실행해 봅시다.
 
root@raspberrypi:/home/pi/Rpi_kernel_src# build_preprocess_rpi_kernel.sh kernel/sched/core.i
configure build output path
build preprocessed file: kernel/sched/core.i
make[1]: Entering directory ' root@raspberrypi:/home/pi/rpi_kernel_src/out '
  GEN     ./Makefile
#
# configuration written to .config
#
make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'
make[1]: Entering directory '/home/pi/rpi_kernel_src/out'
  GEN     ./Makefile
scripts/kconfig/conf  --silentoldconfig Kconfig
  CHK     include/config/kernel.release
  GEN     ./Makefile
  CHK     include/generated/uapi/linux/version.h
  Using  /home/pi/Rpi_kernel_src/linux as source for kernel
  CHK     include/generated/utsrelease.h
  CHK     scripts/mod/devicetable-offsets.h
  CHK     include/generated/timeconst.h
  CHK     include/generated/bounds.h
  CHK     include/generated/asm-offsets.h
  CALL    /home/pi/rpi_kernel_src/linux/scripts/checksyscalls.sh
  CHK     include/generated/compile.h
  CPP     kernel/sched/core.i
  GZIP    kernel/config_data.gz
  CHK     kernel/config_data.h
  Kernel: arch/arm/boot/Image is ready
  Building modules, stage 2.
  Kernel: arch/arm/boot/zImage is ready
  MODPOST 1506 modules
make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'
 
전처리 파일을 문제 없이 생성하면 위와 같은 빌드 메시지를 볼 수 있습니다. out/kernel/sched 디렉터리로 가면 core.i 파일만 전처리 코드로 생성된 것을 확인할 수 있습니다. 
 
root@raspberrypi:/home/pi/rpi_kernel_src/out/kernel/sched# ls
autogroup.o  clock.o       core.i  cpuacct.o      cpufreq.o            cpupri.o
 
하지만 소스코드 디렉터리를 잘못 지정하면 다음과 같은 에러 메시지와 함께 빌드가 중단됩니다.
 
root@raspberrypi:/home/pi/rpi_kernel_src# ./build_preprocess_rpi_kernel.sh  sched/core.i
configure build output path
build preprocessed file: sched/core.i
make[1]: Entering directory '/home001/austin.kim/src/book_RPi_kernel/out'
  GEN     ./Makefile
#
# configuration written to .config
#
make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'
make[1]: Entering directory '/home/pi/rpi_kernel_src/out'
  GEN     ./Makefile
scripts/kconfig/conf  --silentoldconfig Kconfig
make[1]: *** No rule to make target 'sched/core.i'.  Stop.
make[1]: Leaving directory '/home/pi/rpi_kernel_src/out'
Makefile:146: recipe for target 'sub-make' failed
make: *** [sub-make] Error 2
 
따라서 이 셸 스크립트를 실행할 때는 디렉터리와 소스 파일을 이름을 정확히 지정해야 합니다.
 
* 유튜브 강의 동영상도 있으니 같이 들으시면 더 많은 걸 배울 수 있습니다. 


 
 
 
 
 
라즈베리 파이 설정 
 
라즈베리 파이 설치하기
라즈베리 파이 기본 설정하기 
라즈비안 리눅스 커널 빌드
 
"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 
 
Thanks,
Austin Kim(austindh.kim@gmail.com)
 
 
# Reference: For more information on 'Linux Kernel';
 
디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1
 
디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2
 
 
Thanks,
Austin Kim
 
 
 
 
 
 
 
 
 
 
 
 

+ Recent posts