반응형

필요 없는 리눅스 커널을 삭제해 보자.

 

rpm -q kernel 명령으로 확인해 보면 2개의 커널이 있다.

※  dnf list kernel 명령으로도 확인 할 수 있다.

 

dnf autoremove 명령을 실행해 보자.

autoremove - 필요 없는 패키지를 삭제한다.

 

y를 선택하고 진행하면 필요 없는 패키지가 삭제된다.

 

다시 rpm 명령으로 커널을 확인해 보면 그대로다. dnf autoremove 명령은 커널과 상관이 없다.

 

rpm -e '커널명' 명령으로 커널을 삭제한다.

rpm -q kernel 명령으로 확인해 보면 위 그림에서 삭제한 커널이 더 이상 표시되지 않는다.

하지만 /boot 디렉토리를 확인해 보면 vmlinuz-XXX 파일은 그대로 남아 있는걸 볼 수 있다.

vmlinuz 파일은 압축된 리눅스 커널 이미지다. (z: 압축을 의미)

 

반응형
Posted by J-sean
:
반응형

dnf update 등의 명령으로 커널이 업데이트 되면 부팅 시 OS를 선택 할 수 있는 GRUB 메뉴가 표시된다.

GRUB을 수정해 바로 부팅 할 수 있도록 해보자.

 

리눅스 커널이 업데이트 되면 부팅 시 원하는 커널을 선택하는 GRUB 메뉴가 표시된다.

 

/boot 디렉토리를 확인해 보면 vmlinuz로 시작하는 여러 버전의 커널이 있는걸 확인 할 수 있다.

 

grubby 명령으로 확인해 보면 grub에는 2개의 커널이 등록되어 있다. 그래서 GRUB 메뉴에서 2개의 커널이 표시되는 것이다.

 

--remove-kernel 옵션으로 GRUB 메뉴에서 지우고 싶은 커널을 삭제한다.

 

 

다시 부팅해 보면 위에서 삭제한 커널 목록은 없어졌지만 여전히 GRUB 메뉴가 표시된다.

 

/etc/default/grub 파일에서 GRUB_TIMEOUT=5를 0으로 수정하고 저장한다.

 

grub2-mkconfig 명령을 실행해 /boot/grub2/grub.cfg 파일을 업데이트 한다.

 

재부팅하면 GRUB 메뉴가 표시되지 않고 바로 기본 커널로 부팅된다.

 

※ 리눅스 커널 삭제

2025.10.11 - [Linux] - [Rocky Linux] Kernel Removal 커널 삭제

 

반응형
Posted by J-sean
:
반응형

 

Luckfox Pico Mini A
Luckfox Pico Plus

 

Luckfox Pico Mini A/B나 Plus 모델은 Rockchip RV1103 chip 기반의 저비용 리눅스 개발 보드다.

 

※ 기본 튜토리얼

Luckfox Tutorial

 

※ 참고 사이트

Build a Ubuntu Linux Server For Less Than $20

 

● Buildroot

ID: root

Password: luckfox

IP: 172.32.0.93

ex) ssh root@172.32.0.93

 

● Ubuntu

ID: pico

Password: luckfox

IP: 172.32.0.70

ex) ssh pico@172.32.0.70

 

Luckfox Pico Plus에 Buidroot를 설치하면 처음엔 잘 되지만 몇 번 로그인을 하고 나면 아래와 같은 메세지가 나타나면서 로그인이 되지 않는다.(2025-02-28)

kex_exchange_identification: read: Connection reset

Connection reset by 172.32.0.70 port 22

어떤 경우엔 처음 한 번만 네트워크 장치로 잡히고 다시 되지 않는 경우도 있다.

=> 한 컴퓨터에서 Luckfox Pico Mini 와 Plus를 바꿔가면서 계속 ssh 접속 테스트를 해서 그럴지도 모르겠다.

   C:\Users\sean\.ssh\known_hosts 파일이 꼬이는거 같다.

 

부트 이미지를 구울때 update.img는 제외한다.

 

Luckfox Pico Mini B/Plus는 SD카드로 부팅 시 SPI NAND Flash 메모리를 삭제해야 한다.

삭제하기 위해 컴퓨터에 연결 시, SD카드는 삽입 되어 있어도 되고 없어도 된다.

 

Luckfox Pico Plus는 이더넷 케이블 연결이 가능하므로 컴퓨터 연결 없이 전원만 공급하면 된다.

Luckfox Pico Mini A/B는 이더넷 케이블 연결이 불가능 하므로 컴퓨터에 연결하고 '제어판 - 네트워크 및 인터넷 - 네트워크 연결'에서 네트워크 장치로 잡히면, '속성 - 인터넷 프로토콜 버전 4(TCP/IPv4)'에서 IP 주소를 172.32.0.100 등으로 지정하고 접속한다.

 

 

 

반응형
Posted by J-sean
:
반응형

WMware 리눅스(우분투)와 윈도우 폴더를 공유해 보자.

 

가상머신의 세팅 옵션에서 Folder sharing을 enable하고 공유할 윈도우 폴더를 지정한다.

 

리눅스에서 공유에 사용할 디렉토리를 생성하고 아래 명령으로 마운팅 한다.

/usr/bin/vmhgfs-fuse .host:/ ~/shares -o subtype=vmhgfs-fuse,allow_other

위 그림과 같이 allow_other 옵션 때문에 에러가 발생한다면 아래 내용을 진행한다. (아니면 명령 앞에 sudo를 붙여준다)

 

/etc/fuse.conf 파일을 에디터로 오픈 한다.

 

user_allow_other 명령의 주석을 해제한다.

 

 

다시 마운팅 명령을 실행하면 문제 없이 마운팅 된다.

재부팅하면 다시 마운팅해야 한다.

 

※ 참고

Using Shared Folders

 

반응형
Posted by J-sean
:
반응형

우분투에 서버용 JDK를 설치하고 세팅해 보자.

 

openjdk-XX-jdk-headless(서버용)를 설치한다.

 

/etc/profile 파일을 오픈 한다.

 

/etc/profile 파일

 

파일의 마지막에 JAVA_HOME 세팅을 추가한다.

 

 

/etc/environment 파일을 오픈 한다.

 

/etc/environment 파일

 

PATH 끝에 ':$JAVA_HOME/bin'을 추가한다.

 

재부팅하고 echo 명령으로 $JAVA_HOME과 $PATH를 확인한다.

 

 

사실 /usr/bin/ 에 JAVA_HOME/bin 파일이 모두 있기 때문에 PATH 추가는 굳이 하지 않아도 상관 없다.

 

테스트용 JAVA 소스 파일을 작성하고 저장한다.

 

컴파일 하고 실행한다.

 

반응형
Posted by J-sean
:
반응형

우분투 16.04 서버를 사용하던 중 업데이트를 했더니 ESM(Extended Security Maintenance)이 활성화 되지 않아 업데이트를 할 수 없다는 메세지가 떴다.

 

우분투 ESM을 활성화 하고 업데이트 해 보자.

 

우분투 홈페이지에 가입하고 UA Subscriptions를 확인하면 Token이 있다.

 

 

아래 명령어를 실행한다.

(급히 적용 하느라 스크린샷은 없다)

 

# Note that the following steps are not necessary in Ubuntu Pro
# Install the latest UA client
$ sudo apt update
$ sudo apt install ubuntu-advantage-tools

# Use the client to attach this machine to your contract using your UA token
$ sudo ua attach <token>            # <token>에 홈페이지에서 찾은 토큰을 넣는다.
# Ensure ESM-infra is enabled as well:

$ sudo ua enable esm-infra         # 이미 enable 되었다고 나올거다.
$ sudo apt update
$ sudo apt upgrade

 

※ 참고

https://ubuntu.com/blog/ubuntu-16-04-lts-transitions-to-extended-security-maintenance-esm

 

반응형
Posted by J-sean
:
반응형

리눅스(우분투, 라즈베리 파이)에서 특정 프로그램이 자동 실행 되도록 해 보자.

 

/etc/rc.local 파일에 실행하고 싶은 명령을 추가한다.

위 예제는 루트 디렉토리(/)의 파일 목록을 /home/sean/test.txt 파일로 출력한다.

'exit 0' 명령 위에 추가한다.

 

/lib/systemd/system/rc-local.service 파일을 열어준다.

 

아래 명령을 추가한다.

[Install]

WantedBy=multi-user.target

 

서비스를 활성화한다.

 

 

재부팅 해보면 rc.local 파일이 자동 실행되어 ~/test.txt 파일이 생성돼 있다.

 

반응형
Posted by J-sean
:
반응형

MySQL(MariaDB)과 구글 차트를 연동해 보자.

 

아래 내용을 참고해 웹서버와 데이터베이스를 준비한다.

2021.08.25 - [Linux] - Linux(Ubuntu) Build Your Own Web Server - 리눅스(우분투)로 웹서버 만들기

2021.08.28 - [Linux] - Linux(Ubuntu) MariaDB(MySQL) Server Remote Access - 데이터베이스 원격 접속

(데이터베이스는 로컬로 사용하므로 원격 설정을 할 필요는 없다)

 

위와 같은 데이터베이스와 테이블을 생성한다.

 

시간, 온도, 습도 데이터를 적당히 입력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<html>
<head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <!--
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
    -->
 
    <?php
        // 에러가 발생하면 내용 표시
        error_reporting(E_ALL);
        ini_set('display_errors''1');
 
        $mysql_host = "localhost";
        $mysql_user = "root";
        $mysql_password = "1234";
        $mysql_db = "test_db";
 
        $conn = mysqli_connect($mysql_host$mysql_user$mysql_password$mysql_db);
        if (!$conn) {
            die("Database Connect Error: " . mysqli_connect_error());
        }
            
        //echo "Database Connected.<br><br>";
            
        $sql = "SELECT * FROM test_tb";
        $result = mysqli_query($conn$sql);
        
        if (mysqli_num_rows($result> 0) {
            while ($row = mysqli_fetch_assoc($result)) {
                $data_array[] = $row;
            }
            $chart = json_encode($data_array);
        } else {
            echo "No Data";
        }
        
        //echo $chart;
 
        mysqli_close($conn);
    ?>
 
    <script type="text/javascript">
        google.charts.load('current', { packages: ['corechart''line'] });
        google.charts.setOnLoadCallback(drawChart);
        
        function drawChart() {
            var chart_array = <?php echo $chart; ?>;
            //console.log(JSON.stringify(chart_array))
            var header = ['dt''temp''humid'];
            var row = "";
            var rows = new Array();
            jQuery.each(chart_array, function(index, item) {
                row = [
                    item.dt,
                    Number(item.temp),
                    Number(item.humid)
                ];
                rows.push(row); 
            });
 
            var jsonData = [header].concat(rows);
            var data = new google.visualization.arrayToDataTable(jsonData);
            var options = {
                title: 'Temperaure & Humid',
                hAxis: {
                    title: 'Time'
                },
                series: {
                    0: { targetAxisIndex: 0 },
                    1: { targetAxisIndex: 1 }
                },
                vAxes: {
                    0: {
                        title: 'Temperature',
                        viewWindow: { min: -30, max: 50 }
                    },
                    1: {
                        title: 'Humid',
                        viewWindow: { min: 30, max: 100 }
                    }
                }
                //,
                //curveType: 'function',
                //legend: { position: 'bottom' }
            };
 
            var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
            chart.draw(data, options);
        }
    </script>
</head>
<body>
    <div id="chart_div" style="width: 900px; height: 500px"></div>
</body>
</html>
 

 

소스를 입력하고 웹서버에 저장한다.(/var/www/html/index.php)

 

웹서버에 접속하면 위와 같은 그래프가 표시된다.

 

 

X축 레이블을 좀 더 보기 편하게 바꾸고 테이블 차트도 추가해 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<html>
<head>
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <!--
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
    -->
 
    <?php
        // 에러가 발생하면 내용 표시
        error_reporting(E_ALL);
        ini_set('display_errors''1');
 
        $mysql_host = "localhost";
        $mysql_user = "root";
        $mysql_password = "1234";
        $mysql_db = "test_db";
 
        $conn = mysqli_connect($mysql_host$mysql_user$mysql_password$mysql_db);
        if (!$conn) {
            die("Database Connect Error: " . mysqli_connect_error());
        }
            
        //echo "Database Connected.<br><br>";
            
        $sql = "SELECT * FROM test_tb";
        $result = mysqli_query($conn$sql);
        
        if (mysqli_num_rows($result> 0) {
            while ($row = mysqli_fetch_assoc($result)) {
                $data_array[] = $row;
            }
            $chart = json_encode($data_array);
        } else {
            echo "No Data";
        }
        
        //echo $chart;
 
        mysqli_close($conn);
    ?>
 
    <script type="text/javascript">
        google.charts.load('current', { packages: ['corechart''line'] });
        google.charts.load('current', { packages: ['table'] });
        google.charts.setOnLoadCallback(drawChart);
        
        function drawChart() {
            var chart_array = <?php echo $chart; ?>;
            //console.log(JSON.stringify(chart_array))
            var header = ['Date&Time(MM-DD HH:MM)''Temp''Humid'];
            var row = "";
            var rows = new Array();
            jQuery.each(chart_array, function(index, item) {
                row = [
                    item.dt.substr(511),  // 너무 긴 날짜 및 시간을 짧게 추출
                    Number(item.temp),
                    Number(item.humid)
                ];
                rows.push(row); 
            });
 
            var jsonData = [header].concat(rows);
            var data = new google.visualization.arrayToDataTable(jsonData);
 
            var lineChartOptions = {
                title: 'Temperaure & Humid',
                hAxis: {
                    title: 'Time',
                    showTextEvery: 4    // X축 레이블이 너무 많아 보기 힘드므로 4개마다 하나씩 표시
                },
                series: {
                    0: { targetAxisIndex: 0 },
                    1: { targetAxisIndex: 1 }
                },
                vAxes: {
                    0: {
                        title: 'Temperature',
                        viewWindow: { min: -30, max: 50 }
                    },
                    1: {
                        title: 'Humid',
                        viewWindow: { min: 30, max: 100 }
                    }
                }
                //,
                //curveType: 'function',
                //legend: { position: 'bottom' }
            };
 
            var lineChart = new google.visualization.LineChart(document.getElementById('lineChart_div'));
            lineChart.draw(data, lineChartOptions);
 
            // 테이블 차트
            var tableChartOptions = {
                showRowNumber: true,
                width: '40%',
                height: '20%'
            }
 
            var tableChart = new google.visualization.Table(document.getElementById('tableChart_div'));
            tableChart.draw(data, tableChartOptions);
        }
    </script>
</head>
<body>
    <div id="lineChart_div" style="width: 900px; height: 500px"></div>
    <div id="tableChart_div"></div>
</body>
</html>
 

 

소스를 수정하고 웹서버에 저장한다.(/var/www/html/index.php)

 

웹서버에 접속하면 위와 같은 그래프와 차트가 표시된다.

 

※ 참고

2022.05.05 - [Web Development] - Google Chart - 구글 차트 1

반응형
Posted by J-sean
: