2021年9月22日 星期三

CentOS 6 安裝

 2020年底,CentOS 就完全宣告生命週期終止,連更新安裝都沒辦法了。2021年9月,使用者說他必須裝 6.9 才能跑所需的軟體,只好再來努力的裝。

硬體資訊

網卡及顯卡為
Ethernet controller: Intel Corporation Ethernet Connection (11) I219-LM
Ethernet controller: Intel Corporation Ethernet Controller I225-LM (rev 02)
VGA compatible controller: Intel Corporation CometLake-S GT2 [UHD Graphics 630] (rev 05)

開機磁碟為 m2 SSD。

依據 Intel 的說明,Intel Gigabit 網路連線有三個 Linux* 基礎驅動程式:

  • igb-x.x.x.tar.gz 驅動程式:支援所有 82575/6、82580、I350、I354 和 I210/I211 型的 gigabit 網路連線。
  • e1000e-x.x.x.x.tar.gz 驅動程式:支援 Intel® PRO/1000 PCI-E (82563/6/7、82571/2/3/4/7/8/9 或 82583) I217/I218/I219 型的 gigabit 網路介面卡。
  • e1000-x.x.x.tar.gz 驅動程式:支援 Intel® PRO/1000 PCI 和 PCI-X 系列的 gigabit 網路連線。

其中 I225 ,Intel 只提供 Win 64 的 driver,Linux 由 kernel 提供,模組名稱為 igc。

安裝經過

使用者僅說要裝 CentOS,但未指定要安那個版本,考慮 CentOS 8 很快就不再維護了,最先裝 CentOS 7。CentOS 7 裝好後,只有 I225 的網卡會動,不過重開機後又不動了,必需把網路線拔掉再重插,即可連上網路。I219 則完全不動,載入 e1000e 的 driver 也偵測不到網卡。只好改裝 CentOS 8,裝好後,兩個網卡都可正常運作。

不過使用者拿回去後,過了幾天就說要改裝 CentOS 6.9 才行,只好經歷重重難關來安裝 CentOS 6.9。

安裝 CentOS 6.9

在官網上說,自 CentOS 6.5 以後,就可以用 USB 隨身碟安裝。但試了用 dd 寫入 USB disk 或用 Rufus 寫都無法成功開機。注意,用 Rufus 將 ISO 檔寫入隨身碟時,要選 ISO 模式。更慘的是,先前可以用光碟片安裝,這次連安裝光碟片都無法開機,只好想其他辦法安裝。最後決定在 VM 中先裝好,再想辦法複製過去。

不敢執行更新,但也無法執行 yum install xxxx ,必須要修改 /etc/yum.repos.d/CentOS-Base.repo 的設定,指向  vault.centos.org,用下列指令一次搞定。

sed -i -e 's/^mirrorlist/#mirrorlist/g' -e 's/^#baseurl=http:\/\/mirror.centos.org\/centos\/$releasever\//baseurl=http:\/\/vault.centos.org\/6.10\//g' /etc/yum.repos.d/CentOS-Base.repo

再重新執行安裝。

槮器太新,連 CentOS 都無法正常啟動網路,一定要裝 Intel 的驅動程式,要先裝 devel-tool。

因為要裝最新的網卡驅動程式,必須安裝新版的 gcc。

因授權問題,網卡驅動程式必須手動下載。

使用 cpio 複製系統,用 USB 隨身碟,速度很慢很慢 ...

複製系統磁區
mount /dev/sdd1 /mnt/src
mount /dev/nvme0n1p1 /mnt/dst
cd /mnt/src
find ./ -xdev -print0 | cpio -pa0V /mnt/dst
cd /mnt
umount /mnt/src
umount /mnt/dst

mount /dev/sdd2 /mnt/src
mount /dev/nvme0n1p2 /mnt/dst
cd /mnt/src
find ./ -xdev -print0 | cpio -pa0V /mnt/dst
cd /mnt
umount /mnt/src
umount /mnt/dst

使用 chroot 進入目標磁碟,建立 grub 

mkdir /mnt/sysimage
mount /dev/nvme0n1p2 /mnt/sysimage
mount /dev/nvme0n1p1 /mnt/sysimage/boot
mount --bind /proc /mnt/sysimage/proc
mount --bind /dev /mnt/sysimage/dev
mount --bind /sys /mnt/sysimage/sys
chroot /mnt/sysimage
source /etc/profile
export PS1="(chroot) ${PS1}"

#######
# 進入 chroot 後,安裝 grub
#######
grub-install --target=i386-pc /dev/nvme0n1
grub-mkconfig -o /boot/grub/grub.cfg

### 記得修改 /etc/fstab ###

最前面要留約 2MB 的空間,建立 grub boot 資料,不然會出現像下面的錯誤。 可以先建一個 2MB 的分割區,等全部分割區都建好後,再把最前面的分割區刪除。

# grub-install --target=i386-pc /dev/nvme0n1
Installing for i386-pc platform.
grub-install: warning: your embedding area is unusually small.  core.img won't fit in it..
grub-install: warning: 不可能內嵌。GRUB 在本設置中僅能藉由區塊清單來安裝。然而,使用區塊清單不僅「不可靠」甚至令人挫折。.
grub-install:錯誤: 不會繼續處理區塊清單.

CentOS 6.9 使用 GRUB 0.97,系統裝在 nvme SSD,開機時會出現下面的錯誤。

----------------------------
grub
Probing devices to guess BIOS drives. This may take a long time.

    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> find /boot/grub/stage1
find /boot/grub/stage1

Error 15: File not found
---------------------------------------------
所以 CentOS 6.9 不支援 nvme SSD開機。但是 CentOS 7 可以開機,因此將 GRUB 升級至 2.0 版。試著下載不同版本來測試,可安裝的最高版本是 2.02。

到 http://ftp.gnu.org/gnu/grub/ 下載 grub-2.02。要先安裝 bison 才能編譯。
yum install bison
wget http://ftp.gnu.org/gnu/grub/grub-2.02.tar.gz
tar xvfz grub-2.02.tar.gz
cd grub-2.02
./configure
make -j4
make install


  • yum install gcc gcc-c++
  • yum install svn texinfo-tex flex zip libgcc.i686 glibc-devel.i686
  • svn ls svn://gcc.gnu.org/svn/gcc/tags | grep gcc | grep release
  • cd ~/cent6-install
  • svn co svn://gcc.gnu.org/svn/gcc/tags/gcc_4_8_5_release/   (這個會花很多時間)
  • cd gcc_4_8_5_release/
  • ./contrib/download_prerequisites
  • cd ..
  • mkdir gcc_4_8_5_build/
  • cd gcc_4_8_5_build/
  • ../gcc_4_8_5_release/configure --prefix=/usr/local/gcc-4.8.5 --enable-languages=c,c++ 
  • make -j6,約 40分鐘
  • sudo make install
  • echo "/usr/local/lib64" > gcc-4.8.5.conf
  • sudo mv gcc-4.8.5.conf /etc/ld.so.conf.d/
  • sudo ldconfig,會出錯,不管它 --  ldconfig: /usr/local/gcc-4.8.5/lib64/libstdc++.so.6.0.19-gdb.py 不是一個 ELF 檔 - 其開頭的魔術位元組是錯的。

libgcc.i686 和 glibc-devel.i686 => 要同時安裝 32 和 64 的版本

------------------------------------------------
svn ls svn://gcc.gnu.org/svn/gcc/tags | grep gcc | grep release
.....
gcc_4_8_3_release/
gcc_4_8_4_release/
gcc_4_8_5_release/
gcc_4_9_0_release/
gcc_4_9_1_release/
.....

sudo vi /etc/profile.d/gcc_485_env.sh
PATH=/usr/local/gcc-4.8.5/bin:$PATH
source /etc/profile.d/gcc_485_env.sh
gcc --version
gcc (GCC) 4.8.5
-------------------------------------------

參考 CentOS 7,安裝 gcc-4.8.5 及 grub-2.0.2
預設是 enable multilib,不管它
--prefix=/usr/local/gcc-4.8.5
           新版本最終安裝的目錄,不然會裝到 /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.8.5

-----------------------------------------
下載 kernel-devel-2.6.32-696.el6.x86_64.rpm
sudo yum install kernel-devel-2.6.32-696.el6.x86_64.rpm 

tar xvfz e1000e-3.8.4.tar.gz
cd e1000e-3.8.4/src/
make
common.mk:85: *** Kernel header files not in any of the expected locations.
(要先裝 kernel header,不然會出錯)

/home/ntu/cent6-install/e1000e-3.8.4/src/netdev.c:7788:57: 錯誤:「dev」 undeclared (first use in this function)
  struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev));
修正 netdev.c
make 成功

sudo make install
----------------------------------------------------

https://sourceforge.net/p/e1000/bugs/656/
編譯 e1000e 3.8.4,netdev.c 有一行程式要改
原來
struct net_device netdev = pci_get_drvdata(to_pci_dev(dev));

修改成

struct net_device netdev = pci_get_drvdata(pdev);

------------------------------------
tar xvfz grub-2.02.tar.gz
cd grub-2.02
./configure
 ==> configure: error: bison is not found,sudo yum install bison
make
sudo -i  => 切換到 管理者,不然 make install 會失敗
make install
-------------------------------------------


編譯 grub 的問題,要使用自己定義的 alignof,不能使用 gcc 的 stdalign.h 的定義
#define alignof(type) offsetof (struct { char c; type x; }, x)

到 kernel 5 之後,才支援 I225



sh -c 'yes "" | make oldconfig'

sudo yum install ncurses-devel openssl-devel

Avoid speculative indirect branches in kernel (RETPOLINE) ==> OFF

 https://www.kernel.org/doc/html/latest/process/changes.html
幾乎不可能,還是放棄吧

使用 USB 磁碟安裝

新機器很強,考慮直接在新機器用 USB 磁碟開機,再用 Vmware 的 VM 安裝 CentOS 6.9。USB 磁碟使用 240GB 的 SSD 就很足夠了,裝的是 Ubuntu 18。BIOS 的 CSM 要設成 Legacy,VTx 的 VM支援功能要 enable。然後就可以在新機器上直接進行上述的動作了。

另外,USB 上的 OS 要裝 ssh, xrdp, build-essential,其中 xrdp 可以透過 remote desk 來遠端操作。Ubuntu 要另外安裝 ssh 才能啟動 sshd 服務。Vmare 則需要 gcc 用來安裝 kernel module。

遠端 SSH 連線

無法連線,要加參數才行
ajax@aj-i9 ~ $ ssh ntu@10.161.91.142
Unable to negotiate with 10.161.91.142 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
ajax@aj-i9 ~ $ ssh  -o HostKeyAlgorithms\ ssh-rsa  ntu@10.161.91.142
The authenticity of host '10.161.91.142 (10.161.91.142)' can't be established.
RSA key fingerprint is SHA256:3VMP62P2ny4P0tOWMjXPGMOWBDhAbzb+pP91J0kcAm4.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.161.91.142' (RSA) to the list of known hosts.
ntu@10.161.91.142's password: 
Last login: Tue Jul  5 16:37:45 2022 from 10.161.91.142
[ntu@localhost ~]$




2021年9月10日 星期五

使用 PHP 控制檔案下載

使用 PHP 控制檔案下載

Windows 需要修改 php.ini,將 extension=php_fileinfo.dll 的註記拿掉

程式碼如下

// 檢查身分
if (檢查身分不通過) {
    echo "非合法使用者";
     exit;
}

$up_dir = "D:\upload_files\sel_petition";
$pdf_fname = $up_dir.'/'. Util::gen_up_fname($ser_no);
// echo "$pdf_fname<br>";
if (file_exists($pdf_fname)) {
    $mtype = mime_content_type($pdf_fname);
    // echo "Content-type: {$mtype} <br>\n"; exit;
    ob_clean();
    header("Content-type: {$mtype}");
    echo file_get_contents($pdf_fname);
}

ASP 的版本 How to download the files using vbscript in classic asp


網誌存檔