VS CODE에서 NPM 사용시 권한 문제 해결

Windows 10에서 Windows Subsystem for Linux(WSL)를 설치 후 node의 개발을 VSCODE를 이용해서 진행하려고 하였습니다.

문제의 발생은 VSCODE의 terminal에서 npm을 이용해서 모듈을 설치할때 발생하였습니다.

# IN VS CODE TERMINAL
$> cd /project
$> npm i
npm ERR! code EACCES
npm ERR! syscall rename
npm ERR! path /project/node_modules/@samverschueren/stream-to-observable
npm ERR! dest /project/node_modules/@samverschueren/.stream-to-observable.DELETE
npm ERR! errno -13

sudo 명령어를 이용해서 시도해보고, root 권한으로도 시도 해보았으나, 동일한 오류가 발생했습니다.

하지만, wsl 터미널에서는 해당 문제가 없이 설치가 진행됩니다.

npm install 명령어는 자주 사용하기에 해결 방법을 찾아보니, Developing in WSL에서 다음과 같은 내용을 찾았습니다.

I see EACCESS: permission denied error trying to rename a folder in the open workspace
That's a known problem with the WSL file system implementation (Microsoft/WSL#3395, Microsoft/WSL#1956) caused by the file watcher active by VSCode. The issue will only be fixed in WSL 2.

To avoid the issue, set remote.WSL.fileWatcher.polling to true. However, polling based has a performance impact for large workspaces.

For large workspace you want to increase the polling interval: remote.WSL.fileWatcher.pollingInterval and control the folders that are watched: files.watcherExclude.

WSL 2 does not have that file watcher problem is also not affected by the new setting.

해당 이슈는 WSL 2에서 해결된다고 합니다.

우선 간단하게 해당 문제를 피하기 위해서는 vscode에서 설정으로 가서 remote.WSL.fileWatcher.polling 옵션을 true로 체크 해주면 됩니다.

다른 이슈도 Developing in WSL에 잘 정리되어 있습니다.

참고 자료

Posted by lahuman

댓글을 달아 주세요

특정 도메인의 API를 사용시 발생하는 ssl certificate_verify_failed 오류

https 통신시 발생을 합니다.

도메인이나 다른 문제가 없어 보이는테 이상하게 httpclient, axios로 통신을 시도하면 발생하는 문제입니다.

언어별로 해별방법이 비슷합니다.

python에서 해결 방법

import urllib.request
import ssl

def callApi(requst):
    context = ssl._create_unverified_context() 
    r = urllib.request.urlopen('https://lahuman.github.com', context = context)    

java에서 해결 방법

httpclient 4.4 이상을 사용하면 다음과 같이 쉽게 해결이 가능합니다.

void contextLoads() throws IOException {
        CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();
        HttpPost httpPost = new HttpPost("https://lahuman.github.com");
    httpPost.addHeader("API-KEY","adsfasdfasdfasdfasdfasdf" );
        httpPost.addHeader("Content-Type","application/json" );
        httpPost.setEntity(new ByteArrayEntity(String.format("{\"ABC\":123}").getBytes()));

        try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
            System.out.println(response.getStatusLine());
            HttpEntity entity = response.getEntity();
            String text = null;
            try (Scanner scanner = new Scanner(entity.getContent(), StandardCharsets.UTF_8.name())) {
                text = scanner.useDelimiter("\\A").next();
            }
            System.out.println(text);
            EntityUtils.consume(entity);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

nodejs에서 해결 방법

const https = require('https');
const axios = require('axios');

const instance = axios.create({
  baseURL: 'https://lahuman.github.com',
  timeout: 120000,
  httpsAgent: new https.Agent({
    rejectUnauthorized: false
  })
});

const response = await instance.post('/api', { abc:123 });

결론

결국 https의 Verifier를 사용하지 않는 옵션을 추가 한다.

Posted by lahuman

댓글을 달아 주세요

windows에 wsl 설치하고 설정하기

일반적으로 windows OS에서 linux 환경을 사용하기 위해서는 vmware를 이용해 OS를 설치하고 활용했다.
장단점이 있지만, 기본적으로 OS 설치 비용 + 디스크, 메모리 등을 쉐어 하기 때문에 호스트 OS에도 부담이 되는 방식이다.

2년전쯤 WSL을 설치하려고 시도하다가 업데이트가 잘 안되서 실패 했었다.

요즘은 쉽게 설치가 된다고 하여 다시 재도전을 해보았다.

제어판에서 Linux용 Windows 하위 시스템 사용 설정

  1. 제어판을 연다.
  2. 프로그램을 선택한다.
  3. Windows 기능 켜기/끄기 선택
  4. Linux용 Windows 하위 시스템 켜기
  5. 재부팅 한다.

Ubuntu 18.04 설치

  1. Microsoft Store에서 Linux를 검색한다.
  2. Ubuntu 18.04 LTS를 선택한다.

처음에 Ubuntu를 설치했더니, yum update 부터 오류가 발생했다.

설치가 끝나면 실행을 한다.

실행을 하면 사용자 ID와 Password를 입력하면 된다.

nvm 설치 하기

현재(2020.01.26)기준 최신 버젼은 0.35.2이다. 다음 명령어를 이용해서 설치 한다.

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13527  100 13527    0     0  13888      0 --:--:-- --:--:-- --:--:-- 13873
=> Downloading nvm from git to '/home/lahuman/.nvm'
=> Cloning into '/home/lahuman/.nvm'...
remote: Enumerating objects: 288, done.
remote: Counting objects: 100% (288/288), done.
remote: Compressing objects: 100% (258/258), done.
remote: Total 288 (delta 35), reused 95 (delta 18), pack-reused 0
Receiving objects: 100% (288/288), 146.70 KiB | 408.00 KiB/s, done.
Resolving deltas: 100% (35/35), done.
=> Compressing and cleaning up git repository

=> Appending nvm source string to /home/lahuman/.bashrc
=> Appending bash_completion source string to /home/lahuman/.bashrc
: not foundram Files/nodejs/npm: 3: /mnt/c/Program Files/nodejs/npm:
: not foundram Files/nodejs/npm: 5: /mnt/c/Program Files/nodejs/npm:
/mnt/c/Program Files/nodejs/npm: 6: /mnt/c/Program Files/nodejs/npm: Syntax error: word unexpected (expecting "in")
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

설치가 끝나면 마지막 3줄을 복사해서 붙이면 설치는 마무리 된다.

$ export NVM_DIR="$HOME/.nvm"
$ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" 
$ [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" 

nvm list명령어를 이용해서 현재 설치된 것을 확인하면, 다음과 같이 아무것도 설치 되어 있지 않다는 것을 확인 할 수 있다.

$ nvm list
            N/A
iojs -> N/A (default)
node -> stable (-> N/A) (default)
unstable -> N/A (default)

nvm install node 명령어를 이용해서 node를 설치 할 수 있다.

$ nvm install node
Downloading and installing node v13.7.0...
Downloading https://nodejs.org/dist/v13.7.0/node-v13.7.0-linux-x64.tar.xz...
################################################################################################################# 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v13.7.0 (npm v6.13.6)
Creating default alias: default -> node (-> v13.7.0)
$ node -v
v13.7.0
$ npm -v
6.13.6

설치 버젼을 확인하여, 설치가 잘된 것을 확인한다.

docker 설치 하기

기본적으로 WSL은 docker 데몬을 지원 하지 않는다.

하지만! WSL2 라면 지원을 한다.

WSL2설치

WSL2란, 최신의 가상화 기술을 사용하여 경량 유틸리티 VM(가상 머신) 내에서 Linux 커널을 실행합니다. 기존 VM과 다르게, WSL1과 동일한 사용자 환경을 유지 하면서 백그라운드에서 관리되고 실행됩니다.

우선 Hyper-v를 사용하도록 설정 해야 한다.

  1. BIOS 설정
  2. Hyper-V 설정
  3. wsl2 설치

WSL 2는 Windows 10 빌드 18917 이상에서만 사용할 수 있음
Windows 참가자 프로그램을 참가하여야 합니다.

이후 업데이트(인터넷 속도에 따라 2시간 정도 걸림)를 모두 하면, 빌드 버젼이 2020.01.27기준 10.0.19041.21이다.
버전을 확인하는 방법은 cmd 명령창에서 ver 명령어로 확인이 가능합니다.

# ver

Microsoft Windows [Version 10.0.19041.21]

이후 가상 컴퓨터 플랫폼을 사용하도록 powserShell에서 다음 명령어를 입력한다. 주의 할것은 powserShell을 관리자 권한으로 실행해야 한다.

# dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

2020년 5월 20일 추가 사항
WSL2로 변환하기 위해서 다음주소에서 실행파일을 받아서 설치해야 한다.

이후 powserShell에서 wsl의 배포판 모드를 변경한다.

# wsl --set-version <Distro> 2

이제 docker를 사용할 준비가 완료 되었습니다.

docker 설치

docker container를 설치해보자, 설치는 다음의 명령어를 이용해서 할 수 있다.

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce

설치가 완료 되었으면, docker service를 root 권한으로 실행하여야 한다.

$ sudo service docker start
 * Starting Docker: docker                                                                                       [ OK ]

기본적으로 docker는 root 권한으로만 실행할 수 있다. docker 명령어를 이용할 때마다, sudo를 붙이는게 귀찮다면, 다음과 같이 사용자를 docker그룹에 추가하면 된다.

$ sudo usermod -aG docker $(whoami)
# 터미널 종료후 다시 열어야 한다.
$ exit

샘플 docker 실행 테스트

$ docker run -d --name react-app -p 80:80 lahuman/test-react-app
Unable to find image 'lahuman/test-react-app:latest' locally
latest: Pulling from lahuman/test-react-app
e7c96db7181b: Pull complete
8985e402e050: Pull complete
41c1b09855ea: Pull complete
Digest: sha256:bb4d447b8a51845510671f731d68a4b944e681fe856bef670102bb97f904895d
Status: Downloaded newer image for lahuman/test-react-app:latest
5e0cd323d4c97682e4ecb3103555ff9c9ff9d10ffd2bc30fe9591a8b8157fad1

$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                NAMES
5e0cd323d4c9        lahuman/test-react-app   "nginx -g 'daemon of…"   5 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp   react-app

VSCODE 와 연동 하기

vscode에서 Remote-WSL plugin을 설치 한다.

이후 F1을 눌러 Remote-WSL: new Windows를 입력 후 클릭한다.

새창이 뜨고, 뜬 새창에서 터미널이나, 파일 exporler를 열면 wsl 안의 내용을 확인 가능하다.

ubuntu 삭제 하기

설치된 wsl의 OS를 삭제하기 위해서는 앱 및 기능으로 이동해서 ms store에서 설치했던, Ubuntu를 찾아서 제거 하면 된다.

참고 자료

Posted by lahuman

댓글을 달아 주세요