2018年4月25日 星期三

Ubuntu發行版更換Linux Kernel的方法

首先我們必須到下面的網址去下載想要升級的版本
http://kernel.ubuntu.com/~kernel-ppa/mainline/

以這次的實驗為例子,我們想把 4.10.0的 Kernel版本升級為 4.14.12

我們的電腦,安裝64位元的Ubuntu
因此我們先透過上面的link找到如下圖的檔案:

































下載三個檔案,下載完成後把這三個檔案放在同一個資料夾

  • linux-headers-4.14.12-041412_4.14.12-041412.201801051649_all.deb
  • linux-headers-4.14.12-041412-generic_4.14.12-041412.201801051649_amd64.deb
  • linux-image-4.14.12-041412-generic_4.14.12-041412.201801051649_amd64.deb

接著我們在要安裝的Ubuntu那端,對這三個檔案,執行下面的指令

# sudo dpkg -i *.deb

若是產生 Grub設定檔的部分有Warning訊息,請使用下面指令來更新Grub

# sudo update-grub

安裝完成後,先重新開機,開機後使用 "uname -a" 確認kernel版本應該已經更新到4.14.10

Linux 設定 DNS Server

在Linux底下, 有個設置 DNS 位置的設定文件 ===> /etc/resolv.conf

因此我們只需修改此檔案,來增加我們想要設置的DNS Server

假設我們要增加 168.95.1.1

#vi /etc/resolv.conf
#================= resolv.conf ===============
nameserver 168.95.1.1

#========================================

只需要增加 nameserver那行,這樣就可以了

2018年4月23日 星期一

[Linux Embedded System] Linux的Serial port(ttyS1) 無法登入&輸入訊息,但是透過VGA(tty1)的卻可以

今天遇到了一個很奇怪的問題,首先我的平台有兩個終端介面可以使用,一個是透過VGA輸出到螢幕的終端介面,可供我們對機器下指令。另一個則是透過Serial port(UART),利用Tera Term或是putty等軟體,來對機器下指令

今天遇到的問題是,進入Linux系統之後,VGA那邊的終端介面可以順利的輸入訊息,機器也能順利的給予回饋,而Serial port的部分則是無法輸入任何訊息,看起來就像是無法進到sh一樣(如下圖)。















我也嘗試了一下,從能夠下指令的VGA那方,輸入下面的指令
#echo "ls" | sh > /dev/ttyS1

結果在ttyS1那方還真有一些回饋訊息,看來問題是跟sh有所關係

















後來找了一些資料,發現可能的問題出在/etc/inittab

最後的解決方法,是去修改/etc/inittab 這之檔案,在裡面的內容多加一行 ttyS1::respawn:-/bin/sh

















重新啟動之後便能夠順利的進入shell 模式底下囉!!!


*註
若是進入到 Linux Kernel 底下,無Serial 訊息,請先確認您的硬體是使用UART1 或 UART2
UART1 就必須指定你的Console參數 ===>  Console=ttyS0
UART2 就必須指定你的Console參數 ===>  Console=ttyS1


2018年4月19日 星期四

#pragma pack() 的用途與用法


#pragma pack 會要求compiler 使用特別的對齊方式來包裝 Structure Member . 大多數的compilers, 當你宣告一個結構時, 將會在彼此成元之間插入 padding 來確保他們在記憶體中的對齊。下面舉個例子:

struct Test
{
   char AA;
   int BB;
   char CC;
};

 compiler 可能會在記體中選擇以下列的方式來排列對齊:

|   1       |   2       |   3       |   4       |  

| AA(1) | pad..............................|
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad..............................|
雖然真正的資料只佔了6 (byte),但是 sizeof(Test) 結果會是 4 × 3 = 12(byte)



#pragma比較常使用的時機,是在與Hardware device作溝通的時候,你為了要確保compiler不會插入padding,這時候你就會使用 #pragma pack(1),而結構的排列就會如下:

|   1      |

| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
sizeof(Test) 結果就會變成 1 × 6 = 6(byte).


如果是使用 #pragma pack(2), 結構的排列就會如下::

|   1       |   2       | 

| AA(1) | pad... |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad... |
sizeof(Test) 結果就會變成 2 × 4 = 8(byte).



下面是一個簡單的範例,我們使用#pragma pack(1),並印出structure 大小:
==================   pragma.c  ==========================
#include <stdio.h>

int main()
{
#pragma pack(1)
        struct test {
           char A;
           int B;
           char C;
        };

        typedef struct test Struct_Test;

        Struct_Test AA;
#pragma pack()
        printf("Sizeof Struct_Test is %d\n", (int)sizeof(AA));
        return 0;
}
====================================================

執行結果:


2018年4月11日 星期三

架設 Mantis 遇到 SMTP server 無法寄信的問題,使用Gmail的SMTP server

請先去修改 /var/www/html/mantis/config/config_inc.php
( 或是{mantis_path}/config_inc.php ) 如果缺少此檔,就自己新增一個 ~

=================================================
<?php
$g_hostname               = 'localhost';
$g_db_type                = 'mysqli';
$g_database_name          = 'bugtracker';
$g_db_username            = 'root';    #input your database server username
$g_db_password            = 'root';    #input your database server passwd

$g_default_timezone       = 'Asia/Taipei';

$g_crypto_master_salt     = 'RKCEdulaQd4f+j8zNfdcVzRMjrM4DXI1OlhAZtjNntc=';

$g_phpMailer_method= PHPMAILER_METHOD_SMTP ;
$g_smtp_host= 'smtp.gmail.com';
$g_smtp_username = 'your_gmail_account@gmail.com';
$g_smtp_password = '*******';         #input your smtp server passwd
$g_smtp_connection_mode = 'ssl';
$g_smtp_port = 465;
?>
========================================================

改完之後重新啟動apach即可
#/etc/init.d/apache2 restart

2018年4月10日 星期二

【shell script】Script中,單引號與雙引號,對於變數的差別


變數(例如$Num) 當在'  '裡面時 就只被當作一個字串而不會自動轉成變數的值
ex:
   Num=6
   1. echo '${Num}'     ===>   ${Num}
   2. echo "${Num}"    ===>   6


另外當script有error時,可以透過 -x 參數來作Debug
sh -x /test.sh  <====可以做Debug用途

2018年4月9日 星期一

位元(bit)運算的方法

將 X 變數的第 n 個位元設定為 1 (bit從0開始數):

        X = X | (1 << n)

Example_1:
    X = 11110010,假設我們要把第2個bit改為1

    ==>  X = (11110010) | (1 << 2)
    ==>  X = (11110010) | (00000100)
    ==>  X = 11110110

Example_2:
    X = 11110010,假設我們要把第0個bit改為1

    ==>  X = (11110010) | (1 << 0)
    ==>  X = (11110010) | (00000001)
    ==>  X = 11110011



將 X 變數的第 n 個位元設定為 0 (bit從0開始數):

        X = X & ~(1 << n)

Example:
    X = 11110010,假設我們要把第1個bit改為0

    ==>  X = (11110010) & ~(1 << 1)
    ==>  X = (11110010) & ~(00000010)
    ==>  X = (11110010) & (11111101)
    ==>  X = 11110000



【Linux cmd】Linux查看資料夾大小的指令

先簡單介紹一下 du 指令的用法:
# du [參數] [檔案/目錄]

可使用的參數列表如下:
============================
-a | 顯示目錄中個別檔案的大小
-b | 以bytes為單位顯示
-c | 顯示個別檔案大小與總和
-D | 顯示符號鏈結的來源檔大小
-h | Human readable
-H | 與-h類似, 但是以1000為k的單位而非1024 bytes為區塊的單位
-l | 重複計算鏈結黨所占空間
-L 符號鏈結 | 指定符號鏈結檔的大小
-m | 以 MB 為顯示單位
-s | 只顯示總和
-S | 顯示目錄內容時, 不包含子目錄大小.
-x | 若目錄中有不同的檔案系統, 不顯示相異的檔案系統
--exclude | 忽略指定的檔案或目錄
--max-depth | 僅搜尋指定的目錄層級
==================================

Example(直接看範例怎麼使用):

要查看某個資料夾總大小,可以使用以下的指令(以KB顯示):
#du -s FolderName

若是想直接以 MB 或是 GB 顯示,可以加入-h的參數,指令如下:
#du -sh FolderName

實際操作如下圖:







若是想找出當下目錄,空間佔據前5大的資料夾或檔案,則我們可以搭配管線指令來找出來:
#du -sh * | sort -rn | head -5

2018年4月2日 星期一

【Linux cmd】在Ubuntu Terminal下,把使用者改成具有admin權限

此範例我們新增一個tester使用者,並讓他有admin權限能使用sudo

1. 首先我們必須要先有一個admin權限的使用者先登入(例如:root)

2. 接著使用下面指令,新增一個使用者,過程中會要求你輸入密碼:
#adduser tester

3. 接著我們使用指令"usermod" 來把tester 加入到 sudo 群組
#usermod -a -G sudo tester


接下來你就可以使用 sudo 來作一些需要權限的事情了~