반응형

구형 PC 서버 부팅시 키보드나 마우스 인식 경고

구체적인 증상

 오래된 PC중에 키보드나 마우스가 없는 경우 부팅중에 경고 메시지를 보내면서 부팅이 중단되는 경우가 있다. 이게 일반 PC일 경우 항상 마우스와 키보드가 연결 되어 있기 때문에 문제가 없지만, 서버로 사용할 경우에는 주로 원격으로 관리 한다. 때문에 이런 경우 초기 운영체제 설치외에는 보통 키보드나 마우스를 연결을 안하게 되는데, 여기서 부터 문제가 된다.


 전원을 켜거나 재부팅을 하면, OS가 실행되기 전에 경고 메시지에서 걸리게 되는 것이다(여기서 바이오스(BIOS) 문제인걸 직감했다). 그래서 원격으로 리부트를 하면, 구형 PC 앞에 가서 키보드를 한번 두드리거나 안쓰는 키보드나 마우스를 꼿아 놔야 한다. 이게 상당히 보기 흉하거나 귀찮다.


문제 해결하기

 구글링을 해본 결과 과거 우분투 커뮤니티에 비슷한 증상에 대해서 언급을 하였었는데, 당시 바이오스 클리어(초기화)를 해서 해결하였다고 기록되어 있었다. #원본 글


 이 글을 믿고 바이오스 초기화를 했으나 내가 가진 구형 PC의 기본 설정은 키보드나 마우스가 없으면, 부팅에 일시정지가 걸리는 상태였다. 이제 바이오스 문제인걸 알았으니 바이오스 설정에 대한 자료를 찾다가 halt on에서 no error로 하면 키보드 검사를 안해서 부팅 속도가 빨라진다고 써있는 걸 힌트로 얻어서 추가로 찾아보니 장비에 관한 설정이다. 각 바이오스마다 차이는 있겠으니 항목별로 찾아보면 되는데, 이 글을 보게 되면, 분명 앞의 증상일테니 "halt on ~" 으로 된것이 있을 것이다.


 다만, 바이오스가 버그가 있는 건지 장비별로 disable이 아니라 enable로 해놔야 해당 장비가 없어도 무시하고 부팅을 진행한다(설마 영어권의 Yes, I do 와 No, I do의 차이인가??)


 덤으로 플로피 디스크 설정은 상관이 없었더라... 근데 요즘 어린이 여러분들은 플로피 디스크가 뭔지 모르겠지?..


참고자료

우분투 커뮤니티: 비슷한 증상 사례: 바이오스 초기화 방법

블로그: 시모스에 대한 설명

블로그: halt on에 대한 설명


반응형

'잡소리' 카테고리의 다른 글

URI, URL 의미  (0) 2020.11.10
코드 뷰 : 문법 하이라이트(syntax highlight)  (0) 2018.02.19
Mac OS X 패키지 관리자 Homebrew  (0) 2017.03.15
Mac OS X: 악성 앱 메모  (0) 2017.03.08
성격유형 검사  (0) 2017.01.02
반응형

라즈베리 파이3 라즈비안 : 화면 회전

알게된 배경

 진행하던 프로젝트에서 라즈베리 파이가 있는 자리와 코딩하는 자리의 거리가 먼관계로 좁은 책상에 비집고 자리를 만들어서 회전되는 모니터를 설치하고 라즈베리 파이에 연결했다. 자동으로 회전이 되면 좋겠지만, 라즈비안에서 설정을 새로 잡아 줘야 했다.


설정 방법

화면의 회전은 부팅할때 결정되는 듯 하다.

sudo nano /boot/config.txt


 파일의 마지막에 한줄을 추가를 하면 된다. 여기서 숫자는 0 = 0도, 1 = 90도, 2 = 180도, 3 = 270도 를 의미한다.

display_rotate=3


부트 설정 파일을 바꿨으니 이제 재부팅을 해보자.

sudo reboot


참조자료

PSNA Simulation 게시판 글

라즈베리파이 포럼


반응형
반응형

Linux Ubuntu 16.04 : IP 고정 설정하기

IP 설정파일 위치

우분투의 뛰어난 확장력 덕분에 라즈베리 파이3의 운영체제인 라즈비안의 설정위치와 동일하다(하지만 우분투 코어라는 IoT 커널이 우분투 재단에서 제공되고 있다).

sudo vi /etc/network/interfaces


IP 설정 수정

# 초기 설정
# ...  생략 ...
auto enp0s2
iface enp0s2 inet dhcp
# ... 생략 ...
# 수정후 내용
# ...  생략 ...
auto enp0s2
#iface enp0s2 inet dhcp
iface enp0s2 inet static
address xxx.xxx.xxx.xxx
netmask xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx
dns-nameservers xxx.xxx.xxx.xxx
# ... 생략 ...

 iface 이후 enp0s 뒤에 붙는 숫자는 시스템 설치환경에 따라서 차이가 날 수 있다. 라즈비안과 달리 dns-nameservers를 지정하지 않으면, 외부의 네임서버를 아예 인식하지 못한다. 공유기나 네트워크 관리자에게 dns ip주소를 알아내서 입력해주자.

 netmask, gateway도 공유기를 사용할 경우 공유기의 매니저를 실행하여 확인하고 입력하고 네트워크 관리자가 따로 있는 경우 물어서 입력을 하자.


설정을 저장하고 네트워크를 재시작하거나 리부트 하자.

# 네트워크 재시작
systemctl restart networking.service


참고자료

블로그 고정IP 수정하기


반응형
반응형

C, C++ : 운영체제를 구분할 수 있는 매크로변수

알게된 배경

 규모가 큰 프로젝트의 경우 운영체제별로 빌드되는 파일이 달라야 하기 때문에 이를 구분하기 위해서 매크로 변수를 정의하여 구분을 하고 있다.


원리

 컴파일러가 컴파일을 하기 전에 매크로를 먼저 실행을 하는데, 이 때 각 컴파일러는 환경에 대한 매크로변수가 정의 되어 있다. 이 매크로변수의 존재 유무를 가지고 운영체제를 판단하는 것이다. 단, 주의 할 점은 컴파일러자신이 있는 운영체제가 반영된 것이 때문에 윈도우에서 빌드한것은 윈도우에서 실행되고 리눅스에서 빌드된것은 리눅스에서 실행된다. 대신 소스코드만 같은 파일을 사용할 수 있다는 점이다.(그리고 이를 핑계로 고용주에게 운영체제 사달라고 하겠지..)

 실제로 규모가 큰 프로젝트는 C보다는 C++에서 많이 진행되므로 실제 사용하는 경우는 C++에서 사용될 것이다.


매크로 변수들

// windows
// 32 bit, 64 bit
#ifdef _WIN32
#endif
// only 64 bit
#ifdef _WIN64
#endif

// unix
#ifdef unix
#endif
#ifdef __unix
#endif
#ifdef __unix__
#endif

// Mac OS X
#ifdef __APPLE__
#endif
#ifdef __MACH__
#endif

// Linux
#ifdef __linux__
#endif
#ifdef linux
#endif
#ifdef __linux
#endif

// FreeBSD
#ifdef __FreeBSD__
#endif


참고자료

스택오버플로워 답변들 중


반응형

'C++' 카테고리의 다른 글

gcc C++ : 리눅스 라이브러리 만들기 입문  (0) 2017.06.12
STL C++ : vector 중복원소 제거  (0) 2017.04.28
STL C++ : string을 이용한 뒷단어 검사  (0) 2017.04.24
C++ : 네임스페이스  (0) 2017.04.21
표준 레퍼런스  (0) 2017.02.18
반응형

리눅스/윈도우 C : 현재날짜와 시간 가져오기

알게된 배경

 서버애서 생성하는 파일명에 날짜와 시간요소를 넣어서 생성하기 위해서 시스템의 시간을 알아야 할 필요가 있었다.


리눅스 계열(유닉스)과 윈도우

 윈도우 엄밀하게 말하면, MVC(VS 20xx)에서 사용하는 컴파일러는 C++에 대해서는 지원을 잘하지만, C에대해서는 지원이 잘 안되고 있다. 따라서 본의 아니게 소스코드를 실행할 때 차이점이 발생한다. 물론 이를 해결하기 위해서는 새로 소스코드를 작성하거나 minGW, Cygwin 처럼 리눅스 함수를 윈도우에 맞게 포팅해주는 컴파일러를 사용하면된다(하지만 socket 계열은 지원이 안되는 걸로 기억한다).

 시간에 대해서 더 자세히 알기 위해서는 struct tm에 대해서 검색을 해보도록 하자.



리눅스 소스코드

 C++에서는 헤더파일을 ctime으로 호출이 가능하며, 동일하게 사용이 가능하다.

// clock.c
#include <stdio.h>
#include <time.h>

void printTime(void)
{
    time_t timer;
    struct tm* t;

    timer = time(NULL);
    t = localtime(&timer);

    printf("UNIX Time : %d [sec]\n\n", timer);
    printf("year : %d\n", t->tm_year + 1900);
    printf("month : %d\n", t->tm_mon + 1);
    printf("days : %d\n", t->tm_mday);
    printf("hour : %d\n", t->tm_hour);
    printf("min : %d\n", t->tm_min);
    printf("sec : %d\n", t->tm_sec);
}


윈도우 소스코드

 리눅스 소스코드와 차이점은 struct tm 포인터 객체 대신 객체 자체를 선언하면 되며, localtime_s()를 사용한다.

// clock.c
#include <stdio.h>
#include <time.h>

void printTime(void)
{
    time_t timer;
    struct tm t;

    timer = time(NULL);
    localtime_s($t, &timer);

    printf("WINDOWS Time : %d [sec]\n\n", timer);
    printf("year : %d\n", t->tm_year + 1900);
    printf("month : %d\n", t->tm_mon + 1);
    printf("days : %d\n", t->tm_mday);
    printf("hour : %d\n", t->tm_hour);
    printf("min : %d\n", t->tm_min);
    printf("sec : %d\n", t->tm_sec);
}


참고자료

블로그: 유닉스 현재시간 아는 방법 소개


반응형

'C' 카테고리의 다른 글

리눅스 C : TCP 소켓 프로그램  (0) 2017.05.24
Linux C : 파일이나 폴더 조회하기  (0) 2017.04.24
C : 구조체를 네임스페이스처럼 사용하기  (0) 2017.04.22
C : 문자열 숫자 변환  (0) 2017.04.21
C : extern 키워드  (0) 2016.11.28
반응형

STL C++ : string을 이용한 뒷단어 검사

정리한 배경

 문자열 처리에 대해서는 C++외에 다른 프로그래밍 언어에서도 거의 비슷한 기능들을 지원하며, 동시에 문자열 처리를 잘하는 사람이 보통 프로그래밍도 잘한다는 말도 있다. 또한 매번 필요할때 마다 손코딩을 하는 것보다는 미리 작성해놓고 보기 위함도 있다(근데 막상 보면 간단하다).


소스코드

// Utils.h
#pragma once

#include <string>

bool isHasBackword(const std::string str, const std::string backword);

// Utils.cpp
#include "Utils.h"

using namespace std;
bool isHasBackword(const string str, const string backword)
{
    string strBack(str.c_str() + (str.size() - backword.size()) );
    return strBack == backword;
}


 C 를 쓰다가 C++의 STL로 코드를 적고 보니 역시 C++이 C보다 편한 장치가 많다는 것을 다시 느껴진다.

반응형
반응형

Linux C : 파일이나 폴더 조회하기

알게된 배경

 라즈베리 파이의 라즈비안에서 프로그램으로 파일관리를 하기 위해서 사용하였다. 물론 소스코드 작성은 우분투에서 작성하여 먼저 테스트를 진행 했었다.


소스 코드

// Ls.h
#include <stdio.h>
#include <dirent.h>

typedef enum {false, true}bool;
bool isFile(const unsigned char  type);
bool isFolder(const unsigned char type);
void ls(const char* path, const bool isFile);
// Ls.c
#include "Ls.h"

bool isFile(const unsigned char type)
{
    return type == 0x08;
}
bool isFolder(const unsigned char type)
{
    return type == 0x04;
}
// 실제 파일이나 폴더리스트를 가져오는 함수
// 인자는 1:초기 경로, 2:true일경우 파일명, false일경우 폴더명
void  ls(const char* path, const bool isFile)
{
    DIR* dir;
    struct dirent* ent;
    if(NULL != (dir = opendir(path)) )
    {
        while(NULL != (ent = readdir(dir)) )
        {
            if(isFile? isFile(ent->d_type) : isFolder(ent->d_type) )
            {
                printf("%s\n", ent->d_name);
            }
        }
        closedir(dir);
    }
    else
    {
        perror("could not open directory");
    }
}


추가 참조 사항

 더 궁금한 점이 있다면, dirent 구조체에 대해서 조사하도록 하자. dirent.h 파일은 디렉토리나 같은 파일 시스템과 관련된 함수들이 있다.

 C++에서는 cdirent가 없기 때문에 C의 함수를 가져와서 사용해야 한다. 다른 대체 방법이 있는 걸 아시는 분은 댓글로 피드백을 준다면 환영한다.


참고자료

커뮤니티: 파일 및 폴더 명 받기

블로그: dirent 구조체에 대한 설명

반응형
반응형

Linux CentOS 7 : 처음 MariaDB 설치하기

도입부

CentOS 7를 처음 설치할때 설치 항목중에 MariaDB가 있어서 설치를 하게 될 경우 기본적으로 설치되는 버전은 최신버전이 아니라고 한다. 때라서 많약 운영체제 설치과정에서 설치를 했다면, 먼저는 제거를 해줘야 하고, 이후에는 yum의 저장소(repository) 주소를 새로 등록을 해준다음에 다시 설치를 해줘야 한다.



기존 MariaDB 삭제하기

yum list mariadb

Installed Packages에 항목이 있다면 설치가 되어 있는것이다. 만약 설치 되어 있지 않는다면, mysql을 입력했을 때 bash에서 해당 파일이 없다고 뜨면 레퍼지토리 등록을 하면 된다.

yum remove 명령어로 삭제한다.

yum remove mariadb.*



yum 저장소(repository) 등록

 MariaDB공식 사이트에 저장소 등록방법이 설명이 되어 있다(공식홈페이지의 등록방법). 요약하면, 저장소 설정파일을 추가작성하고, server, client 패키지를 설치하면 된다.

# 파일명은 권장이지 의무는 아니다
vi /etc/yum.repos.d/MariaDB.repo

MariaDB.repo 파일에 다음과 같은 내용을 적는다. 여기서 시간은 알아서 자신에게 맞는 시간을 적으면 되는데, 주석이니 의무는 아니다

# MariaDB 10.1 CentOS repository list - created 2017-04-24 01:18 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

:wq로 저장한다음에 아래 명령어로 설치하면 된다

yum install MariaDB-server MariaDB-client

여기까지는 공식 홈페이지 메뉴얼대로이다. 이제 MariaDB를 실행해보자


systemctl start mariadb

제대로 동작되는지 확인하기 위해 root로 접속을 한다. (처음 설치 직후에는 패스워드가 없다.)

mysql -u root mysql


패스워드 바꾸기

 아래는 위의 MariaDB에 접속이 되어 있는 상태에서 입력하는 명령어이다.

use mysql;
select host,user,password from user;    # 패스워드 상태 확인
update user set password=password('Maria!');
select host,user,password from user;
exit

위의 예는 패스워드를 Maria!로 설정한 경우이다. 패스워드를 바꾸는 방법을 검색을 하면 다양한 방법이다. 있다. 이제 서비스를 재시작을 해서 설정한 비번을 적용하자.

systemctl restart mariadb


참고자료

블로그: CentOS 7 기반(삭제 방법 참조)

블로그: CentOS 7 기반(초기 설치방법 참조)

블로그 : 윈도우 기반(패스워드 설정 참조)

반응형
반응형

Linux CentOS 7 : root 계정 직접 로그인 막기

알게된 배경

 ssh 원격을 사용하면서, root 계정으로 직접적으로 로그인이 가능하게 할 경우 비밀번호에 대해서 상당한 취약점이 발생한다는 것을 알게 되었기 때문에 이러한 취약점을 보강하기 위해서 root 계정의 직접 로그인을 막는다.


설정 변경 방법

 설정파일을 변경하고 리부트를 하면 된다.

vi /etc/ssh/sshd_config

이 파일에서 아래의 #PermitRootLogin yes 부분을 찾아서 주석(#)을 해제한 다음에 yes를 no로 바꾸면 된다.

#PermitRootLogin yes

 vi가 익숙하지 않다면, 익숙한 편집기를 사용해도 된다. 

 vi에서는 '/'키를 눌러서 'PermitRootLogin'으로 검색을 하면 쉽게 찾을 수 있다. 찾았으면, 'i'를 눌러서 편집모드로 바꾼뒤 주석해제와 yes를 no로 바꾼뒤 'esc'로 편집모드를 나온다음에 ':wq' 입력하여 저장하고 vi를 닫는다.

 이후 리부트 하면 root 계정으로 바로 로그인이 안되고 다른 계정을 통해서 로그인한뒤에 'su'명령어를 통해서 root 계정으로 전환할 수 있다.

반응형
반응형

Linux CentOS 7 : 고정IP 설정

알게된 배경

 서버를 구축하고 사용하려 하다 보면 IP관리를 위해서 고정 IP는 필수로 설정하게 된다. 가장 이상적인 방법은 CentOS7부터는 설치할때 GUI에서 설정할 수 있으니 가능하면 이때 설치를 해놓으면 좋다. 하지만, 관리하다 보면 변동 사항이 있을 수도 있으니 정리해 놓자


고정 IP 설정 파일 위치

cd /etc/sysconfig/network-scripts
vi ifcfg-eth0

vi 사용법을 모른다면, 다른 편집기를 사용해도 된다.

 여기서 파일은 과거에는 ifcfg-eth0이지만, 설치할때 디바이스를 뭘로 잡았느냐에 따라서 ifcfg-뒤의 이름이 다르다. 때문에 ls를 입력하여 어떤 파일이 있는지 확인해야 한다. wlan0 같은 이름을 가진 파일은 와이파이 디바이스니 설치할때 뭘로 했었는지 기억을 떠올리던가 기록을 해둔것을 찾아서 수정해야 한다.


 대략 많은 내용의 설정파일들이 다음의 내용을 수정하고 없으면, 추가를 해서 작성하면 된다.

BOOTPROTO=static
IPADDR=XXX.XXX.XXX.XXX
NETMASK=XXX.XXX.XXX.XXX
DNS2=XXX.XXX.XXX.XXX
GATEWAY=XXX.XXX.XXX.XXX
DNS1=XXX.XXX.XXX.XXX

 수정이 끝났으면, vi의 경우 저장하고 종료한다음에 리부트(reboot)하거나 디바이스를 재시작 해주면 된다.


각 필요한 항목에 대한 설명은 다음과 같다.


 BOOTPROTO

 static이면 고정, dhcp이면 유동(자동), none이면 사용안함

 IPADDR

 고정(사용)할 IP주소 

 NETMASK

 네트워크 제공쪽 넷마스크(공유기의 내부망 정보 참조)

 국민 공유기인 iptime 제품 경우 255.255.255.0 이 기본 설정이다.

 DNS2

 보조DNS 서버(공유기 혹은 모뎀에서 확인가능)

 GATEWAY

 네트워크 제공자(공유기 혹은 모뎀)

 DNS1

 DNS 서버(공유기 혹은 모뎀에서 확인가능)


나머지는 네트워크 디바이스에 관한내용이기 때문에 다음에 다루던가 네트워크 쟁이들에게 물어보자.


참조 자료

고정IP 설정 메모된 블로그


반응형

+ Recent posts