728x90

M1 silicon 맥북에서는 안되는게 참 많습니다. 새로운 CPU 아키텍쳐라서 여기저기서 패키지들이 오동작하거나 설치가 안되는 문제들이 많이 발생합니다. 오늘의 주인공인 파이썬 cryptography 패키지도 마찬가지입니다. 그나마 이 녀석은 에러가 나름 명확한 친구임에도 문제를 해결하기 위해 적지 않은 시간을 쏟아야 했습니다.

우선 에러 메세지 보고 가시겠습니다. :-) 이 에러 메세지는 pip install -r requirements.txt 를 수행하는 동안 발생헀고 requirements.txt 에는 cryptography가 기술되어 있었습니다. (드라마 24시에서 Following takes place... 하는 느낌이네요)

Building wheels for collected packages: cryptography
  Building wheel for cryptography (PEP 517) ... error
  ERROR: Command errored out with exit status 1:
...
...
 ...
    clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -iwithsysroot/System/Library/Frameworks/System.framework/PrivateHeaders -iwithsysroot/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/Headers -arch arm64 -arch x86_64 -Werror=implicit-function-declaration -I/Users/nopd/project/venv/include -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/include/python3.8 -c build/temp.macosx-10.14.6-arm64-3.8/_openssl.c -o build/temp.macosx-10.14.6-arm64-3.8/build/temp.macosx-10.14.6-arm64-3.8/_openssl.o -Wconversion -Wno-error=sign-conversion
  build/temp.macosx-10.14.6-arm64-3.8/_openssl.c:575:10: fatal error: 'openssl/opensslv.h' file not found
  #include <openssl/opensslv.h>
           ^~~~~~~~~~~~~~~~~~~~
  1 error generated.
  
      =============================DEBUG ASSISTANCE=============================
      If you are seeing a compilation error please try the following steps to
      successfully install cryptography:
      1) Upgrade to the latest pip and try again. This will fix errors for most
         users. See: https://pip.pypa.io/en/stable/installing/#upgrading-pip
      2) Read https://cryptography.io/en/latest/installation.html for specific
         instructions for your platform.
      3) Check our frequently asked questions for more information:
         https://cryptography.io/en/latest/faq.html
      =============================DEBUG ASSISTANCE=============================
  
  error: command 'clang' failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for cryptography
Failed to build cryptography
ERROR: Could not build wheels for cryptography which use PEP 517 and cannot be installed directly

 

화려한 에러 메세지이지만 결론은 설치가 잘 안되었다 입니다. DEBUG ASSISTANCE의 내용은 평이합니다. PIP가 구버전이라 그럴 수 있으니 업데이터 해보고 cryptography 설치 가이드 문서를 읽어 본 다음, faq에 단서가 있을지도 모르니 찾아보라는 내용입니다. TL;DR 하자면 아래의 한줄이 모든 것을 이야기 해주고 있었습니다.

build/temp.macosx-10.14.6-arm64-3.8/_openssl.c:575:10: fatal error: 'openssl/opensslv.h' file not found

 

Trouble Shoot #1 - Install separate openssl with brew

구글 검색을 통해 살펴봤던 문서를 종합해보면 M1 silicon 기종에 선탑재되어 나오는 openssl이 cryptography 빌드에 필요한 버전과 상이하다고 합니다. 실제로 M1 silicon 탑재 기종에서 openssl version 명령으로 버전을 확인해보면 LibreSSL 이 설치되어 있는 것을 알 수 있습니다. 아래와 같이 brew 를 이용해 openssl 을 별도로 설치해 보도록 하겠습니다. 공식 가이드에서 안내하는 1.1 버전을 지정해서 설치 진행했습니다. 

cryptography 설치 가이드의 안내  (https://cryptography.io/en/latest/installation/)

% openssl version
LibreSSL 2.8.3
% brew install openssl@1.1 rust
Updating Homebrew...

 

Trouble Shoot #2 - Uninstall cffi then install cryptography again

별도의 openssl 설치와 혹시 몰라서 rust(cryptography는 rust를 사용합니다)를 설치하는 작업이 끝나면 이제 파이썬 패키지중에서 C언어를 호출할 때 사용되는 cffi 도 삭제후에 다시 설치해 주도록 하겠습니다. 아래의 명령을 순서대로 터미널에서 입력하면 cryptography 가 설치됩니다. 제 경우 cryptography를 3.3.1 버전으로 지정해서 사용할 일이 있어서 버전을 지정했습니다만 그렇지 않은 경우에는 버전 정보를 빼고 설치하면 되겠습니다. 

% pip uninstall cffi
% LDFLAGS=-L$(brew --prefix libffi)/lib CFLAGS=-I$(brew --prefix libffi)/include pip install cffi --no-binary :all:
% LDFLAGS="-L$(brew --prefix openssl@1.1)/lib" CFLAGS="-I$(brew --prefix openssl@1.1)/include" pip install cryptography==3.3.1

 

문제가 해결되었습니다. 비슷한 이슈를 겪는 분들은 정리된 내용대로 패키지 삭제, 재설치를 진행해 보시기 바랍니다. 영어로 된 자료도 흥미롭게 읽을 수 있다면 보다 깊은 내용과 관련 링크가 공유된 stackoverflow 의 아래 스레드를 읽어 보시면 도움이 되겠습니다!

 

Installing Cryptography on an Apple Silicon M1 Mac

Help! I'm trying to install cryptography on my m1. I know I can run terminal in rosetta mode, but I'm wondering if there is a way not to do that. Output: ERROR: Command errored out with exit st...

stackoverflow.com

 

Hope this helpful to someone who experiencing similar issue.

728x90
728x90

한 번 설치해서 잘 돌아가는 시스템을 업그레이드 하는 것은 참 귀찮은 일입니다. 하지만 새로운 버전에서만 쓸 수 있는 기능이 생겼고 이를 사용해야 하는 경우엔 어쩔수 없이 업그레이드를 선택하게 되죠. 여기저기에서 마구 설치해서 사용하고 있는 grafana 역시 새로운 버전이 종종 등장하고 있어 가끔씩 업데이트 해줘야 새로운 기능을 활용할 수 있습니다. 

오래전에 설치해 사용하던 grafana 를 업그레이드하려다 보니 혹시나~ 하는 생각이 들어서 방법을 정리해 봅니다. 쓰시는 분이 많지 않아 업그레이드의 부담은 없었지만, grafana 공식 페이지의 문서가 보기가 좀 불편한 점들도 있어서 추후 작업을 위해 이력을 남기는 차원입니다 ㅎㅎ


설치된 grafana 버전 확인하기

꼭 필요한 과정은 아니지만 설치된 grafana 패키지의 버전을 확인해보겠습니다. 권한에 따라 sudo 명령을 곁들여 주시면 맛이 더욱 훌륭합니다. 6.6.1 버전이니 오래된 유물급까지는 아니지만 꽤 오래된 버전입니다. 제 경우 yum 으로 설치하긴 했지만, grafana 의 공식 repo 를 쓰지 않고 grafana 웹 페이지에서 rpm 을 다운로드 받아 yum 으로 localinstall 했습니다. 

$ sudo yum list grafana
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Packages
grafana.x86_64                      6.6.1-1                        installed

 

grafana.db 파일 백업하기

grafana 의 설정을 sqlite (기본 값) 로 해두었다면 grafana.db 파일을 백업해야 합니다. mysql 등의 다른 DB 를 사용했다면 해당 DB 의 데이터베이스나 테이블 내용을 백업해야 합니다. sqlite 는 파일 기반 DB 라 백업도 간편하죠. 패키지를 설치했을 경우 경로는 아래와 같으며, 파일을 그대로 다른 경로에 옮겨두면 나중에 복원시 사용할 수 있습니다. 

$ mkdir backup
$ cp /var/lib/grafana/grafana.db ./backup/

 

새로운 버전의 rpm 다운로드 받기

기억이 맞다면 repo 를 등록해서 yum 으로 패키지 설치를 하지 못했었는데... 일단 현재는 가능한 것 같습니다. repo 를 등재하여 별도 다운로드 없이 패키지를 설치하셔도 되고, 저처럼 rpm 을 받아 설치해도 무방합니다. 

# RPM 다운로드 경로 : grafana.com/grafana/download

 

Download Grafana

Overview of how to download and install different versions of Grafana on different operating systems.

grafana.com

# yum repo 등록후 설치 가이드 (CentOS 기준) : grafana.com/docs/grafana/latest/installation/rpm/

 

Install on RPM-based Linux

› Installation › Install on RPM-based Linux Install on RPM-based Linux (CentOS, Fedora, OpenSuse, Red Hat) This page explains how to install Grafana dependencies, download and install Grafana, get the service up and running on your RPM-based Linux syst

grafana.com

$ wget https://dl.grafana.com/oss/release/grafana-7.3.7-1.x86_64.rpm
--2021-01-20 16:29:54--  https://dl.grafana.com/oss/release/grafana-7.3.7-1.x86_64.rpm
Resolving dl.grafana.com (dl.grafana.com)... 151.101.198.217, 2a04:4e42:2e::729
Connecting to dl.grafana.com (dl.grafana.com)|151.101.198.217|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 53729497 (51M) [application/x-redhat-package-manager]
Saving to: ‘grafana-7.3.7-1.x86_64.rpm’

100%[============================================================================>] 53,729,497  13.5MB/s   in 5.6s

2021-01-20 16:30:00 (9.07 MB/s) - ‘grafana-7.3.7-1.x86_64.rpm’ saved [53729497/53729497]

FINISHED --2021-01-20 16:30:00--
Total wall clock time: 6.1s
Downloaded: 1 files, 51M in 5.6s (9.07 MB/s)

 

yum 으로 rpm 업그레이드 하기

이제 다운로드 받은 파일을 설치하도록 하겠습니다. `yum localinstall` 로 설치한 rpm 패키지는 `yum localupdate` 로 업데이트 할 수 있습니다. yum repo 를 사용하는 경우 `yum install` 과 `yum update` 를 설치와 업그레이드에 각각 사용하는 것과 마찬가지입니다. 

$ sudo yum localupdate grafana-7.3.7-1.x86_64.rpm
Loaded plugins: fastestmirror, langpacks
Examining grafana-7.3.7-1.x86_64.rpm: grafana-7.3.7-1.x86_64
Marking grafana-7.3.7-1.x86_64.rpm as an update to grafana-6.6.1-1.x86_64
Resolving Dependencies
--> Running transaction check
---> Package grafana.x86_64 0:6.6.1-1 will be updated
---> Package grafana.x86_64 0:7.3.7-1 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

======================================================================================================================
 Package                 Arch                   Version                 Repository                               Size
======================================================================================================================
Updating:
 grafana                 x86_64                 7.3.7-1                 /grafana-7.3.7-1.x86_64                 170 M

Transaction Summary
======================================================================================================================
Upgrade  1 Package

Total size: 170 M
Is this ok [y/d/N]:y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : grafana-7.3.7-1.x86_64                                                                             1/2
  Cleanup    : grafana-6.6.1-1.x86_64                                                                             2/2
POSTTRANS: Running script
  Verifying  : grafana-7.3.7-1.x86_64                                                                             1/2
  Verifying  : grafana-6.6.1-1.x86_64                                                                             2/2

Updated:
  grafana.x86_64 0:7.3.7-1

Complete!

 

확인!

이제 문제 없는지 확인을 해야겠죠? 웹 브라우저로 grafana 에 접근하여 좌측 하단에 있는 ? 버튼을 눌러 버전을 확인해 봅니다. 다행히도 백업한 파일을 사용할 일 없이 마무리가 잘 된 것 같습니다. 

 

728x90
728x90

혼자 사용하는 서버는 환경 설정을 자유롭게 할 수 있습니다. 자주 사용하는 경로의 지정이나 무언가를 설치했을 때 경로까지 익숙함을 바탕으로 찾아내는데 어려움이 없을 겁니다. 하지만, 서버의 운영체제 버전이 조금 다르다던가 계정 정책의 차이 등으로 패키지가 어디에 설치되었는지 헤메는 경우가 종종 생깁니다.

서버 환경으로 CentOS 를 자주 사용하다보니 패키지 설치는 거의 yum 을 사용합니다. 간혹 커스텀한 구성이 필요하여 직접 빌드하는 경우를 제외하면 관리가 편하기 때문에 yum 을 쓰는 편이죠. 오늘 아침, 자주 안들어가던 서버에서 mtr 패키지가 필요해서 yum 으로 설치했으나 실행이 되지 않는 문제가 있어서 패키지 설치 디렉토리를 찾느라 잠시 헤프닝이 있었습니다. 

// yum 은 패키지는 잘 설치해 주지만, 설치된 위치를 알려주진 않습니다
$ sudo yum install mtr
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
 * centos-sclo-rh: mirrors.aliyun.com
 * epel: xxxx.xxxx.xxx
Resolving Dependencies
--> Running transaction check
---> Package mtr.x86_64 2:0.75-5.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

======================================================================================================================
 Package                 Arch                       Version                            Repository                Size
======================================================================================================================
Installing:
 mtr                     x86_64                     2:0.75-5.el6                       base                      54 k

Transaction Summary
======================================================================================================================
Install       1 Package(s)

Total download size: 54 k
Installed size: 96 k
Is this ok [y/N]: y
Downloading Packages:
mtr-0.75-5.el6.x86_64.rpm                                                                      |  54 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : 2:mtr-0.75-5.el6.x86_64                                                                            1/1
  Verifying  : 2:mtr-0.75-5.el6.x86_64                                                                            1/1

Installed:
  mtr.x86_64 2:0.75-5.el6

설치는 잘 되었으나 Shell 환경에 지정된 Path 에 잡혀있지 않은지 실행이 되지 않았습니다. 패키지가 설치된 경로를 찾아야 할 때는 rpm 을 사용하면 좋습니다. rpm 과 grep 으로 패키지가 설치되어 있는지 찾아보거나 rpm 에 옵션을 지정하여 패키지 설치 경로를 확인할 수 있습니다. 

// 설치된 패키지의 이름을 확인
$ rpm -qa | grep mtr
mtr-0.75-5.el6.x86_64

// 설치된 패키지의 경로를 확인
$ rpm -ql mtr
/usr/sbin/mtr

일반적인 설치 경로인데 왜 실행이 안되었을까요? 그건 리눅스의 환경 변수중 명령어를 실행할 수 있는 경로의 집합을 나타내는 $PATH 에 경로가 빠져 있기 때문입니다. 한 번 확인해 보고 누락된 경우 추가를 해보도록 하겠습니다. 매번 전체 경로를 넣고 실행하기는 좀 번거롭겠죠? 실제로는 profile 설정 등에서 추가해 주어야 다음번 로그인시에도 경로가 추가된다는 점 잊지 마시구요.

// 꼴랑 두개 들어가 있네요
$ echo $PATH
/bin:/usr/bin

// 기존 $PATH 값에 콜론으로 연결하여 경로를 지정합니다
// 잘 들어갔는지 절대 알려주지 않으니 echo 로 다시 확인을...
$ PATH=$PATH:/usr/sbin
$ echo $PATH
/bin:/usr/bin:/usr/sbin

 

728x90
728x90

pip 가 참 많은 일을...

 

Python 을 조금씩 좋은 감정으로 알아가고 있는 중입니다. 결실을 맺게 될지는 잘 모르겠지만 오늘도 새롭게 공부한 것들이 있어서 공유해 봅니다. Python 에서 Package 관리를 위해 사용하는 것이 pip 혹은 pip3 입니다. npm 과 같은 Package 관리자라고 생각하니 마음이 편해졌습니다.

 

npm 에서는 프로젝트 루트 경로의 package.json 에 패키지를 기술해두고 npm install 명령으로 패키지를 쉽게 설치할 수 있었는데요, pip 에는 그런 기능이 없나 하고 살펴보니 역시나 제공하고 있었습니다. 당연한 것을 이렇게 하나씩 알아가는 것도 새로운 개발 환경을 익히고 배우는 재미이겠지요.

 

// 패키지의 목록을 출력
$ pip freeze
boto3==1.12.24
botocore==1.15.24

// 패키지의 목록을 requirements.txt 에 저장
$ pip freeze > requirements.txt

 

먼저 pip 의 freeze 를 이용하여 사용중인 패키지를 확인할 수 있습니다. 가상 환경을 적절히 분리해 두지 않았다면 전역으로 설치된 모든 패키지의 목록이 나오는 것처럼 보입니다. 아직 Python 가상환경에 익숙치 않아서... 대충 그렇게 돌아가는 것처럼 보이는 느낌입니다 ㅎㅎ.

 

$ pip install -r requirements.txt

 

requirements.txt 파일은 `패키지명=버전` 혹은 `패키지명` 으로 패키지에 대하여 기술한 목록 파일입니다. NodeJS 에서는 package.json 에 JSON 형태로 모듈명과 버전명을 기술했던 것에 비해 단순합니다. pip install 명령을 -r #패키지목록# 형태로 실행하면 지정되어 있는 패키지의 버전을 찾아 설치하게 됩니다. 참 쉽죠? 

 

 

728x90

+ Recent posts