2020年2月27日 星期四

** 如何製作ubuntu arm64的rootfs檔案 **


------------------------------------------------------------
** 如何製作ubuntu arm64的rootfs檔案 **
source form: https://www.itread01.com/content/1545126143.html
------------------------------------------------------------

  **建立 ubuntu-rootfs
    $ mkdir ~/ubuntu-rootfs && cd ubuntu-rootfs

  **下載最新的arm64 ubuntu release image
    $ wget http://cdimage.ubuntu.com/ubuntu-base/releases/18.04/release/ubuntu-base-18.04-base-arm64.tar.gz
    $ tar -xpf ubuntu-base-18.04-base-arm64.tar.gz

    我們解壓縮後,就可以直接刪除這個下載的ubuntu-base-16.04.2-base-arm64.tar.gz檔案了。ls 命令之後的樣子是這樣的:
    [email protected]:~/ubuntu-rootfs$ ls
    bin   dev  home  media  opt   root  sbin  sys  usr
    boot  etc  lib   mnt    proc  run   srv   tmp  var
   
    或是抓取 ubuntu-18.04.4-server-arm64.iso
    mount ubuntu-18.04.4-server-arm64.iso rootfs_18.04
    在 install 目錄下 filesystem.squashfs,這就是根文件系統
    安裝解壓縮工具: apt-get install squashfs-tools
    解壓縮 unsquashfs filesystem.squashfs 會得到 squashfs-root
    內容會得到 filesystem
    bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
 
  **安裝 qemu-user-static
    我們可以使用如下的指令來完成對qemu-user-static的安裝
    $ pwd
    /home/user/ubuntu-rootfs
    $ apt-get install qemu-user-static
    $ cp /usr/bin/qemu-aarch64-static  usr/bin
    $ cp -b /etc/resolv.conf etc/
    在這裡我們要注意的是我們針對arm64的qemu-user-static安裝的檔案是qemu-aarch64-static。
   
  **mount proc, sys, dev, dev/pts到新的檔案系統
    https://raw.githubusercontent.com/psachin/bash_scripts/master/ch-mount.sh
    利用一個簡單的ch-mount.sh指令碼來完成這個動作。它可以幫我們mount及unmount。我們把下載好的指令碼置於ubuntu-rootfs目錄的上一級目錄,並做如下的處理:

    [email protected]:~$ chmod a+x ch-mount.sh
    [email protected]:~$ sudo bash ch-mount.sh -m ubuntu-rootfs/
    [sudo] user 的密碼:
    MOUNTING
    [email protected]:/#
    這樣我們就進入到chroot的環境中了。
   
  **更新系統並安裝所需要的包
    運用如下的命令來更新系統,並安裝所需要的包。依賴網路環境,安裝的時間可能會有差異。
    [email protected]:/# apt-get update
    [email protected]:/# apt-get install -y language-pack-en-base sudo ssh net-tools ethtool wireless-tools
                         lxde xfce4-power-manager xinit xorg network-manager iputils-ping rsyslog lightdm-gtk-greeter
                         alsa-utils gnome-mplayer lightdm bash-completion lxtask htop python-gobject-2 python-gtk2 synaptic
 
    修正版: 只安裝基本需求
    apt-get install -y language-pack-en-base sudo ssh net-tools ethtool wireless-tools network-manager ifupdown iputils-ping rsyslog htop vim
   
    sudo apt-get update
    安裝make rool: sudo apt-get install  gcc automake autoconf libtool make
    安裝vim 編輯器:apt-get install vim
    安裝固件(顯卡固件包含在裡面,必須安裝):apt-get install linux-firmware(如果已拷貝,則不必安裝)
    安裝libncurses5-dev,內核配置make menuconfig 時依賴的庫:apt-get install libncurses5-dev
    安裝內核編譯所需工具:apt-get install bc
    安裝u-boot-tools,編譯uImage 用:apt-get install u-boot-tools
    安裝gcc g++: apt-get install gcc g++
    安裝gfortran: apt-get install gfortran
    安裝ssh: apt-get install ssh
    安裝ifupdown,自動開啟網卡: apt-get install ifupdown
    安裝網絡工具nettools: apt-get install net-tools
    如果需要安裝圖形界面:
    apt-get install xinit gdm3 ubuntu-desktop
    安裝完後重啟系統,這時可以進入圖形界面了。有時可能會遇到鼠標和鍵槃無法使用情況,在內核選項中將
    INPUT_EVDEV 選上即可。
    這時候會提醒語言包的錯誤:
    修改/etc/default/locale 文件,添加以下內容
    LANG="en_US.UTF-8"
    LANGUAGE="en_US:en"
    LC_ALL="en_US.UTF-8"
    執行命令locale-gen en_US.UTF-8 即可。
    這時sudo su 還無法切換到root 用戶,在root 登陸下修改:
    chown root:root /usr/bin/sudo
    chmod 4755 /usr/bin/sudo
    這時在普通用戶下sudo su 就可以臨時切換到root 了。
    如果出現root ssh 無法登陸現象,在/etc/ssh/sshd_config 文件中修改PermitRootLogin yes
    重啟ssh 服務,再次登陸就可以了。
 
  **make modules_install INSTALL_MOD_PATH=/home/sam/rootfs/rootfs_18.04
   
  **設置root密碼
    passwd root
 
  **創建用戶
    adduser accusys
   
  **設置主機名稱和本機IP
    echo "i.MX6" > /etc/hostname
    echo "127.0.0.1 localhost" >> /etc/hosts
    echo "127.0.1.1 i.MX6" >> /etc/hosts
   
  **配置串口和網絡dhcp
    首先配置串口,這裏踩了幾次坑,下載到板子上以後發現串口無法輸出到超級終端,找了很多方案,終於試出來了,需要做一個鏈接才行。
    ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttymxc0.service
    由於我用的是i.mx6ul的平臺,需要添加一個名?getty@ttymxc0.service的鏈接,連接到getty@.service服務。i.mx的平臺是ttymxc0,其他平臺的名字就不清楚了。如果確定不了名字,一個比較笨的方法就是先把製作好的根文件系統下載到開發板上,超級終端上查看打印出來的log,會在 waiting for device dev-ttymxc0.device 時出現 [Time out] ,Dependency failed for Serial Getty on ttymxc0. 由此就可以知道了。
   
   
  **配置DHCP,也可以等下載到開發板之後在配置,但?動時會很慢。
    echo auto eth0 > /etc/network/interfaces.d/eth0
    echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
    /etc/init.d/networking restart

  **系統基礎改造
    # useradd -s '/bin/bash' -m -G adm,sudo yourusername
    # echo "Set password for yourusername:"
    # passwd yourusername
    # echo "Set password for root:"
    # passwd root
   
  **設定主機名
    # echo 'ubuntu.yourusername' > /etc/hostname
   
  **設定自動更新DNS
    # apt-get install resolvconf
    # dpkg-reconfigure resolvconf
   
  **新增主機入口到/etc/hosts:
    127.0.0.1    localhost
    127.0.1.1    yourhostname
   
  **設定timezone
    # apt-get install tzdata
    # dpkg-reconfigure tzdata
   
  **在lib目錄下建立目錄並拷入我們自己硬體相關的模組檔案
    我們可以從我們的host中拷入我們想要的arm64的模組到系統中,比如:
    # cp -r /opt/out/modules/3.4.5 ~/ubuntu-rootfs/lib/modules
    在這裡,我們把我們想要定製的包拷入到lib之下的modules中。
   
  **選項:啟動serial console登入
    我們可以建立/etc/init/ttyS0.conf檔案,並寫入如下的內容:
   
    start on stopped rc or RUNLEVEL=[12345]
    stop on runlevel [!12345]
    respawn
    exec /sbin/getty -L 115200 ttyS0 vt102
   
    在host中可以同如下的命令來登入:
    $ sudo start ttyS0
    等我們完成上面的工作後,我們就可以開始製作我們的rootfs檔案了。在上面我們已經把我們所需要的檔案拷入到相應的檔案目錄之中了。
   
  **退出並製作可燒錄的韌體
    [email protected]:/# exit         
    exit
    [email protected]:~$ pwd
    /home/user
    [email protected]:~$ ./ch-mount.sh -u ubuntu-rootfs
   
  **使用dd指令製作空的韌體容器
    $ dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=2048
    $ sudo  mkfs.ext4  ubuntu-rootfs.img
   
  **將arm64檔案系統內容製作到ubuntu-rootfs.img
    $ mkdir  ubuntu-mount
    $ sudo mount ubuntu-rootfs.img ubuntu-mount/
    $ sudo cp -rfp ubuntu-rootfs/*  ubuntu-mount/
    $ sudo umount ubuntu-mount/
    $ e2fsck -p -f ubuntu-rootfs.img
    $ resize2fs -M ubuntu-rootfs.img
    這樣最終,我們生成了我們所需要的ubuntu-rootfs.img檔案:
   
    [email protected]:~$ ls ubuntu-rootfs.img -hal
    -rw-rw-r-- 1 user user 2.0G 10月 31 16:23 ubuntu-rootfs.img
    [email protected]:~$ file ubuntu-rootfs.img
    ubuntu-rootfs.img: Linux rev 1.0 ext4 filesystem data, UUID=9ed3cd8b-e81a-4ec9-a8e0-bd185f223936 (needs journal recovery) (extents) (large files) (huge files)
   
  **參考文章:
    https://gnu-linux.org/building-ubuntu-rootfs-for-arm.html
    https://olimex.wordpress.com/2014/07/21/how-to-create-bare-minimum-debian-wheezy-rootfs-from-scratch/
   
ch-mount.sh ---------------------------------------->
#!/bin/bash
#

function mnt() {
    echo "MOUNTING"
    sudo mount -t proc /proc ${2}proc
    sudo mount -t sysfs /sys ${2}sys
    sudo mount -o bind /dev ${2}dev
    sudo mount -o bind /dev/pts ${2}dev/pts
    sudo chroot ${2}
}

function umnt() {
    echo "UNMOUNTING"
    sudo umount ${2}proc
    sudo umount ${2}sys
    sudo umount ${2}dev/pts
    sudo umount ${2}dev

}

if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
    mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
    umnt $1 $2
else
    echo ""
    echo "Either 1'st, 2'nd or both parameters were missing"
    echo ""
    echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
    echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
    echo ""
    echo "For example: ch-mount -m /media/sdcard/"
    echo ""
    echo 1st parameter : ${1}
    echo 2nd parameter : ${2}
fi
ch-mount.sh <----------------------------------------

2020年2月26日 星期三

Linux script 與 sorce scitp 差異

觀念
執行script時,預設使用子shell,若要在原shell執行,要使用
. script檔 或 source script檔
子shell會繼承父shell的環境變數,不會繼承父shell的變數
檢查目錄是否存在
檢查檔案是否存在
在 Shell Script 檔案和函式往往需要透過傳入參數來設定執行程式的內容。在 Shell Script 支援許多好用的特殊變數,可以方便我們透過使用變數方式來設置程式執行的流程。
指令描述註解
$0目前的檔案檔名
$nn 從 1 開始,代表第幾個參數
$#傳遞到程式或函式目前有幾個參數
$*傳遞到程式或函式所有參數
$@類似 $* 但是在被雙引號包含時有些許不同
$?上一個指令退出狀態或是函式的返回值
$$目前 process PID

於 Bash shell echo 輸入換行字元的寫法

echo 可以使用 -e 的參數,或者直接使用 printf 來達成,範例如下:
  1. $ echo -e "1\n2\n3\n4\n5\n" > filename
  2. $ printf "hello\nworld\n" > filename
  3. $ printf "\n" > filename
  4. $ cat filename # 就可以看到換行的內容
  5. printf "\n" | iconv -f utf-8 -t utf-16 >> filename # UTF-16 的 newline 換行
    printf "\n" | iconv -f utf-8 -t utf-16 | xxd 和 printf "\n" | xxd 可以看到 UTF-8 和 UTF-16 的差異
另外一種是把 \n 獨立出來,不過這不太好記憶,先列範例即可
  • $ echo $'hello\nworld' > filename
  • $ echo Hello$'\n'world > filename

解決shell指令碼中 echo 怎麼寫入換行到檔案




Linux echo命令25個實用案例


1. 前言
echo是一種最常用的與廣泛使用的內置於Linux的bash和C shell的命令,通常用在腳本語言和批處理文件中來在標準輸出或者文件中顯示一行文本或者字符串。




Linux echo命令
echo命令用於在shell中列印shell變量的值,或者直接輸出指定的字符串。linux的echo命令,在shell編程中極為常用, 在終端下列印變量value的時候也是常常用到的,因此有必要了解下echo的用法echo命令的功能是在顯示器上顯示一段文字,一般起到一個提示的作用。




echo命令默認輸出
2. echo命令選項
echo命令的功能是在顯示器上顯示一段文字,一般起到一個提示的作用。
該命令的一般格式為: echo [ -n ] 字符串
其中選項n表示輸出文字後不換行;字符串能加引號,也能不加引號。用echo命令輸出加引號的字符串時,將字符串原樣輸出;用echo命令輸出不加引號的字符串時,將字符串中的各個單詞作為字符串輸出,各字符串之間用一個空格分割。
功能說明:顯示文字。
語 法:echo [-ne][字符串]或 echo [--help][--version]
補充說明:echo會將輸入的字符串送往標準輸出。輸出的字符串間以空白字符隔開, 並在最後加上換行號。
參 數:-n 不要在最後自動換行
-e 若字符串中出現以下字符,則特別加以處理,而不會將它當成一般
文字輸出:
\a 發出警告聲;
\b 刪除前一個字符;
\c 最後不加上換行符號;
\f 換行但光標仍舊停留在原來的位置;
\n 換行且光標移至行首;
\r 光標移至行首,但不換行;
\t 插入tab;
\v 與\f相同;
\ 插入\字符;
\nnn 插入nnn(八進位)所代表的ASCII字符;
–help 顯示幫助
–version 顯示版本信息
3. echo使用實例演示
3.1 列印字符串string
Shell 的 echo 指令與 PHP 的 echo 指令類似,都是用於字符串的輸出。命令格式:
[root@zcwyou ~]# echo string
您可以使用echo實現更複雜的輸出格式控制。
3.2 列印一段字符:
[root@zcwyou ~]# echo "It is a test"
這裡的雙引號完全可以省略,以下命令與上面實例效果一致:
[root@zcwyou ~]# echo It is a test




linux使用echo列印內容
3.3 結合轉義符
把特殊字符轉義為普通字符
[root@zcwyou ~]# echo "\"It is a test\""
結果將是:
"It is a test"




linux把特殊字符轉義為普通字符
同樣,雙引號也可以省略
3.4 查詢變量
read 命令從標準輸入中讀取一行,並把輸入行的每個欄位的值指定給 shell 變量
#!/bin/sh
read name 
echo "$name It is a test"
以上代碼保存為 zcwyou.sh,name接收標準輸入的變量,結果將是:
[root@zcwyou ~]# sh zcwyou.sh
OK #標準輸入
OK It is a test #輸出
3.5 換行
使用轉義符\n換行
[root@zcwyou ~]# echo -e "OK! \n" # -e
[root@zcwyou ~]# echo "It is a test"
輸出結果:
OK!
It is a test
3.6 輸出不換行
使用轉義符 \c 不換行
腳本文件內容:
#!/bin/sh
echo -e "OK! \c" # -e 
echo "It is a test"
輸出結果:
OK! It is a test
3.7 回顯結果定向至文件
[root@zcwyou ~]# echo "It is a test" > test.log
檢查:
cat test.log
3.8 原樣輸出字符串,不進行轉義或取變量(用單引號)
[root@zcwyou ~]# echo '$name\"'
輸出結果:
$name\"
3.9 顯示命令執行結果
[root@zcwyou ~]# echo `date`
注意: 這裡使用的是反引號 , 而不是單引號 '。 結果將顯示當前日期 Mon Nov 19 00:45:23 EST 2018 ¨K44K ¨G11G 會輸出下面的文本: hi hello ¨K45K 比如,聲明變量x並給它賦值為10。 ¨G12G 會輸出它的值: ¨G13G ¨K46K 『-e『後帶上'\b'會刪除字符間的所有空格。 注意: Linux中的選項『-e『扮演了轉義字符反斜線的翻譯器。 ¨G14G ¨K47K 『-e『後面的帶上『\n』行會在遇到的地方作為新的一行 ¨G15G ¨K48K 『-e『後面跟上『\t』會在空格間加上水平制表符。 ¨G16G 也可以同時使用換行『**\n**『與水平制表符『**\t**『 ¨G17G ¨K49K 『-e『後面跟上『\v』會加上垂直制表符。 ¨G18G 也可以同時使用換行『**\n**『與垂直制表符『**\v**『 ¨G19G 注意: 你可以按照你的需求連續使用兩個或者多個垂直制表符,水平制表符與換行符。 ¨K50K 『-e『後面跟上『\r』來指定輸出中的回車符。(LCTT 譯註:會覆寫行開頭的字符) ¨G20G ¨K51K 『-e『後面跟上『\c』會抑制輸出後面的字符並且最後不會換新行。 ¨G21G ¨K52K ¨G22G Tecmint is a community of Linux Nerds Tecmint is a community of Linux[root@zcwyou ~]# ¨K53K 『-e『後面跟上『\a』選項會聽到聲音警告。 ¨G23G 注意: 在你開始前,請先檢查你的音量設置。 ¨K54K ¨G24G ¨K55K 比如,讓我們假設你想要列印所有的『.jpeg『文件,使用下面的命令。 ¨G25G ¨K56K ¨G26G 檢查: ¨G27G ¨K57K ¨G28G This is red text ![linux echo輸出彩色文字](http://images.linuxrumen.com/linux/linuxecho/linuxecho05.png-1)\e[1;31m將顏色設置為紅色 \e[0m` 將顏色重新置回
顏色碼:重置=0,黑色=30,紅色=31,綠色=32,黃色=33,藍色=34,洋紅=35,青色=36,白色=37
3.24 使用echo設置輸出的背景色
[root@zcwyou ~]# echo -e "\e[1;42mGreed Background\e[0m"
Greed Background




linux echo使用echo設置輸出的背景色
顏色碼:重置=0,黑色=40,紅色=41,綠色=42,黃色=43,藍色=44,洋紅=45,青色=46,白色=47
3.25 使用echo輸出閃動的文字
[root@zcwyou ~]# echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"
紅色數字處還有其他數字參數:0 關閉所有屬性、1 設置高亮度(加粗)、4 下劃線、5 閃爍、7 反顯、8 消隱




linux echo使用echo輸出閃動的文字