초보자들이 자주 겪는 리눅스 문제/ 오류 해결 방법
안녕하세요.
오늘은 초보자들이 자주 겪는 리눅스 문제에 대해서 오류에 대해서 또 어떻게 대처할 수 있는지에 대한 얘기를 하고요.
대표적인 예시 파일 권한 예시로 한번 실습을 한 번 보여드리려고 합니다.
바로 한 번 이야기를 가보도록 할게요.
자, 일단은 리눅스 에서 문제를 해결할 때는요.
이 접근 방법이 굉장히 중요합니다.
기존에 우리가 어떻게 하는지를 한번 살펴볼까요?
보통 우리가 리눅스 문제를 어떻게 해결 하냐면요 일단 에러 메시지를 봐요.
에러 메시지가 나오면은 에러 메시지는 굉장히 다양하죠.
예를 들어서 뭐 no such file or directory이라는 어 뭐 문구가 뜰 수도 있고요.
안 그러면은 커맨드 가 없을 수도 있고요.
예를 들어서 이제 없는 폴더 인데 테스트 폴더를 했다, 그러면 요런 에러가 뜰 수도 있는 거고요.
그리고 PWD 라고 해서 프린트 워킹 디렉토리 현재 디렉토리에 경로를 출력할 수 있는데.
프린트 워킹 디렉토리 근데 얘를 오타를 내서 이런 식으로 낼 수도 있죠.
그러면은 이렇게 커맨드 가 없다라고 또 오류가 뜰 수도 있습니다. 이런 다양한 오류 들이 있어요.
이렇게 단순한 오류 들도 있지만 약간은 복잡한 오류 들도 있고요.
근데 이런 에러 메시지를 봤을 때 일단은 우리는 구글링을 합니다.
혹은 chatGPT 같은 걸 활용할 수 있죠.
그렇게 해서 뭐 단편적으로 해결을 하면 뭐 그렇게 복잡하지 않은 문제면 다 그렇게 넘어갈 수가 있죠.
근데 이게 여러 가지 해결 책을 적용한다는 게 뭔 말이냐면 이 문제가 발생을 했을 때 이렇게 하라 그래가지고 이렇게도 해보고 저렇게 하라고 그래서 저렇게도 해보고 그리고 블로그든 아니면은 뭐 스택오플러 라든지 말하는 게 조금씩 조금씩 달라요.
뭐 이것저것 다 해봤는데 다 안 돼 이러면은 이제 굉장히 한 번 두 번까지는 괜찮아요.
근데 이제 세 번, 네 번 다섯 번 이렇게 넘어가다 보면은 이게 이제 내가 어디까지를 정확하게 한 실습 인지도 좀 헷갈리기 도 하고요.
그리고 이제 뭔가 계속 이 제, 어 문제가 계속 발생 하다 보니까 그냥 그냥 안 돼라는 생각이 사로잡힐 수가 있습니다. 그래서 이제 요런 문제 이런 상황들을 해결을 하고자 한다면은 이제 어, 접근 방법이 좀 바뀌는 게 필요해요.
그리고 요런 식으로 접근을 하다가 결국에 해결 했다고 하더라도 원인인 분석이 제대로 안 되고 해결 방법에 대해서 이해를 못 했기 때문에 부작용이 발생을 하거나 그러니까 내가 원래의 목적에 걸맞지 않는사이드 이펙트가 발생할 수 있다던가 안 그러면은 이제 똑같은 문제가 또 일어났을 때 내가 모르고 또 다시 그 문제에 대해서 해쳐 되는 약간 이런 상황이 벌어질 수가 있습니다.
그래서 요런 것들을 해결해서 어떻게 하면은 문제를 좀 잘 해결할 수 있을까요.
좀 접근 방법이 굉장히 중요하다라고 볼 수가 있겠고요.
문제가 굉장히 간단 하면 사실 이런 것까지는 생각할 필요는 없어요.
근데 특히나 뭐 네트워크 혹은 메모리 혹은 디스크 이런 식으로 시스템과 엮여서 문제가 생기게 되면은 이게 단순하게 접근이 안 됩니다.
특히나 우리가 요즘에 리눅스를 다르면 우리는 지금 오 물론 요번 주제는 초보자들 문제 주제이긴 하지만 어쨌든 계속 초보자도 남아 있지는 않을 거잖아요.
계속 성장을 하고 서버 엔지니어 로서 구동을 시키다 보면은 어 이제 리눅스 에 대한 어떤 코너 설정 뿐만 아니라 혹은 이제 뭐 도커 나 쿠버네티스 를 통해서 쓸 수도 있고요.
그리고 또 클라우드를 같이 응용해서 쓰는 경우들도 많이 생기고 이런 식으로 소프웨어 스택이나 구조도 복잡해지고, 서버 구조도 복잡해지고 에 그리고 더군다나 뭐 네트워크나 메모리 나 어떤 시스템적인 문제까지 같이 섞여 버리게 되면은 위와 같은 문제 해결 방식으로는 굉장히 어려운 한계 점들을 많이 겪게 됩니다. 그래서 어 다음과 같은 어떤 접근 방법과 전략을 한 번 말씀드리고 싶은데요.
첫 번째로는 에러 메시지를 읽을 때 물론 지금 방금 전에 저희가 보여드렸던 이런 에러 메시지는 아주 단순한 에러 들이기 때문에 사실 이것만으로도 이렇게 원인이 많이 드러나요 그렇긴 하지만 에러 메세지가 뭔가 나타났을 때 이거를 결과적 이고 현상으로 봐야 될 수 있습니다.
예를 들어서 no such file or directory라고 하는 에러가 터졌을 때 이 에러 메세지가 지금 중요한 게 아니라 사실은 에러 메시지가 생성된 이유가 원래는 생겨 나야 되는 폴더가 생겨나지 않아서 다 혹은 생겨 나야 되는 파일이 생겨나지 않아서 다 라면 내가 뭔가 하고자 하는 어떤 목표가 있을 거고 그 목표를 그 이루기 위해서 작업하는 명령어 들 중에서 이장 명령어 안 돼서 이 오류가 터졌을 수 있는거 그러니까 결과적으로는 no such file 에러지만 실제로 과정에서의 문제는 예를 들어서 디스크 공간이 없어 디스크 공간이 없어서 파일을 만들 수 없었고 파일을 만들 수 없었으니까, ls결과가 이렇게 에러가 뜬 거죠.
에러 에만 집착을 하게 되면은 그냥 이런 파일이 없다는데 애만 자꾸 집착을 하게 되거든요.
근데 사실 이거는 결과적인 거고 결과적인 거 현상인 거고 그 우리가 진짜로 하고자 하는 전반적인 작업에 대한 어떤 나열과 확인 그리고 그거에 대한 분석 이런 것들이 좀 필요할 수가 있는 거죠.
그래서 아주 단순한 문제 같은 경우에 메시지만 으로도 웬만하면은 처리가 될 수 있겠지만 이런 식으로 에러 메시지 자체가 그냥 결과나 현상으로 봐야 되는 경우들도 많이 있어요.
특히나 이제 메모리 나 네트워크 문제 같은 경우에는 에러 메세지가 근본적인 원하는 원인을 나타나지 않는 경우가 정말 많습니다.
그래서 헷갈리지 않는 게 좀 필요해요.
그 다음에 에러 메세지가 됐든 이제 에러 메시지가 그대로 그냥 해석이 돼서 문제와 직결이 되는 경우들도 있지만, 말씀드린 대로 결과적으로 나온 에러 메시지 일일 수도 있잖아요. 그렇기 때문에 문제를 항상 정의 내리는 게 굉장히 중요해요.
그러니까 예를 들어서 내가 지금 하고자 하는 게 뭐냐, 예를 들어서 웹 서버의 실행 이냐 DB 서버 하고의 접속이냐 뭐 이런 여러 가지가 있을 텐데 그런 목표를 하는 게 뭐고, 그리고 그 목표와 현 상태를 보고 그 다음에 그 갭을 확인 해야 되는 거죠.
그래서 no such file or directory 라는 에러 메시지가 떴다고 하더라도 그 메세지 자체에 물론 집중해야 되는 경우들도 있죠.
근데 그 에러 메세지는 결국에 결과이기 때문에 우리가 목표로 했던 거는 예를 들어서 웹 서버 실행인데 웹 서버 실행에서 no such file or directory 에러가 결과적으로 나타났을까 를 정확하게 이해하려면 이 차이, 이 문제 상황을 더 정확하게 그 인지하고 그 다음에 이 부분을 조금 펼쳐서 보는 게 필요하죠.
그게 이제 원인 분석이 될 수 있습니다. 이 동작 과정이나 절차를 좀 나열하는 게 필요하고요.
그 다음에 거기에다가 What, Why 라는 질문을 계속 던져야 되는 거죠.
예를 들어서 웹 서버가 실행 된다고 따졌을 때, 웹 서버가 실행된 때의 동작 과정 중에서 특히나 이런 파일 에러가 뜨는 것들은 어 설정 파일과 연관 될 수 확률이 굉장히 높습니다.
왜냐면은 설정 파일을 기반으로 해서 웹 서버가 실행될 수 있거든요.근데 그 설정 파일이 맨 처음에는 생성이 안 된다던가. 생성 안 되는 이유가 사실은 디스크 공간이 없어서 일 수 있는 거고, 그렇기 때문에 이 과정을 일단 펼쳐놓고 나열하고 관찰하고 What, Why를 계속 던질 필요성이 있어요.
근데 아주 심플한 문제면 이게 괜찮은데 그렇게까지 펼칠 필요도 없는데요.
메모리,네트워크 하고 문제가 생기게 되면은 원래 메모리를 우리가 어떻게 엑세스 를 했는지 메모리 엑세스 하는 메커니즘에 가상 메모리 메커니즘 이라는 게 무엇인지 네트워크에서도 TCPIP,3 way handshake, 패킷 이라는 게 뭐고 네트워크를 어떻게 처리하는 건지 이런 부분들에 대한 내용들을 전혀 답변할 수 없다면 이 동작 과정을 펼쳐 놓을 수도 없어요.
우리가 만약에 형사 예요.그러면은 사건의 범인을 찾아야 되고 그 사건을 바라볼 때 그냥 그 사건 하나만 보지 않잖아요. 결과만 보지도 않잖아요.
그러니까 에러 메시지만 보는 것도 아니에요. 그러니까 이거를 펼쳐야 돼요. 일단 사건이 발생 되기 전 후, 그리고 그 사건이 발생될 때에 그 타임 테이블 마다 어떤 있었던 일들 이런 것들을 다 맞추잖아요 맞추고 보고 확인하고 어, 이런 것들을 점검하고 근 데 그럴려면 그러려면 이 개념이 어느 정도 잡혀 있어야 됩니다. 아주 단순 문제 같은 경우 괜찮아요.
오늘 바라보는 아주 단순 문제 같은 경우는 크게 이 문제에 대해서 많이 보지 않아도 되는데 특히나 이제 시스템과 관련될 수록 시스템에 대한 어떤 동작 원리를 얘기하는 게 굉장히 중요할 수 있습니다.
그래서 요런 부분들에 대한 문제 능력을 굉장히 향상시키기 위해서는 다양한 공부들을 필요하기 때문에 특히나 메모리 나 네트워크 디스크에 대한 근본적으로 처리되는 원리를 준비하는 게 중요할 수 있겠고, 특히 리얼리눅스 수업 안에서는 리눅스 시스템 핵심 정리해서 이런 것들을 좀 많이 다루고 있습니다.
그래서 필요하시면 또 확인해 보셔도 좋을 것 같고요.
그 다음에 근본 원인을 찾는 이제 Why 라는 질문을 계속 던지는 게 필요하죠.
방금 전에도 말씀드렸다시피 no such file or directory 라는 에러 메시지를 그냥 우리가 결과적으로 봤다고 하더라도 여기에만 집착할 게 아니라 그럼 폴더가 왜 생성이 안 됐지?
그러면 폴더를 왜 생성하지, 그러니까 왜 필요한 거지, 뭐 이런 것들을 이제 볼 수 있는 거고, 그리고 생성이 안 되는 이유들은 왜 안 되는지에 대해서 이렇게 봤을 때 예를 들어서 권한 문제 때문에 생성이 안 됐을 수도 있는 거고요. 아니면은 말씀드린 대로 디스크 공간이 부족해서 일 수도 있어요.
근데 디스크 공간은 있지만 아이 노드 라는 개념이 있어요.
파일을 다룰 때에 파일에 대한 어떤 메타 데이터를 다룰 수 있는 그 자료 구조를 뜻하게 되는데, 아이노드도 파일 시스템 마다 최대 개수가 한정돼 있는 경우들이 있습니다.
그러면은 디스크의 어떤 데이터적인 공간은 남아 있지만 아이 노드 개수에 대한 문제 때문에 이제 파일이 생성이 안 될 수도 있단 말이에요.
그래서 그런 부분들은 당연히 이제 명령 같은 걸로 예를 들어서 df -h 하면은 그 물리적인 공간을 뜻하게 되고요.
만약에 df -i 라고 하시게 되면은 아이는 아이 노드 라고 해서 실제 파일의 개수가 많아요.
그래서 작은 파일이 개수가 많아지게 되면은 아이 노 공간이 꽉 차가지고 디스크 공간은 있는데 파일도 생성하지 못하는 상황들도 있죠.
그래서 끊임없이 있던 Why 라는 질문을 통해서 근본 원인 루트 코드를 찾는 게 중요 하겠고요.
어떤 피상적인 문제를 그냥 단편적으로 만 해결하는 게 아니라 근본적으로 해결을 할 수 있습니다.
그리고 이제 사실 문제 분석이 되고 나면은 사실 해결 방식은 선택의 문제예요.
결국에 왜냐면 문제 분석까지 가 사실 되게 어려운 거고요.
문제가 사실 분석된 걸 기준으로 우리가 적용할 때 되게 쉬워요.
왜냐면 해결책 적용은 그냥 명령 한 두 줄 이면 끝나는 경우들이 많거든요.
그래서 부분 같은 경우에는 이제 어려운 내용은 아닙니다.
하지만 여러 가지 해결 방식을 적용을 하는 과정에서 그런 것들이 기록이나 메모를 해두는 게 정말 좋거든요.
저 같은 경우에도 실제로 이전에 어, 현업에서 한 십 년 정도 개발 활동을 하면서 어, 있었던 다양한 이슈들 과 이런 것들을 남만 저만의 메모장에 있어요.
거기다가 날짜 라든지 그리고 어떤 상황이라든지 이런 것들을 완전 깨끗하게 아니어도 다 맨날 정리를 해 놓거든요.
그래서 그런 정리 들이 굉장히 많은 도움을 준다라고 생각이 듭니다.
그리고 반복된 실수를 하지 않아도 될 수 있고 그리고 또 무엇보다도 해결 방식에 대한 평가를 좀 정확하게 더 내릴 수 있어요.
그러니까 지금은 되게 근본적인 해결이 라고 있다고 생각했는데 나중에 시간이 지나가면 내공이 더 좋아져서 안의 내용들을 봤을 때 이게 근본적인 문제는 해결은 아니었구나 라는 거를 또 깨달을 수도 있는 거고요. 그래서 그런 것들은 기록과 메모를 꼭 하시는 걸 좀 추천드리겠습니다.
여기까지 해가지고요 접근 방법이랑 전략에 대한 팁을 좀 드려봤습니다.
리얼리눅스에서 관련 추천드리는 강의는 시스템 핵심정리입니다.
https://reallinux.co.kr/course/se_system