2016年8月12日 星期五

CentOS 7 忘記密碼

CentOS 7 忘記root密碼,重設密碼方式如下
  1. 在 grub 開機選單出現時,按「e」,編輯開機選項
    找到「linux16」開頭這一行,
    例如:
    ...(略)...
    linux16 /vmlinuz-3.10.0-327.22.2.e17.x86_64 root=/dev/mapper/centos-root ro ...(略)...
    ...(略)...
    
    這一行到「ro」這個單詞位置,將「ro」改成「rw init=/sysroot/bin/sh」
    ...(略)...
    linux16 /vmlinuz-3.10.0-327.22.2.e17.x86_64 root=/dev/mapper/centos-root rw init=/sysroot/bin/sh ...(略)...
    ...(略)
    
  2. 接下來按「Ctrl+x」開機進入命令列環境,
    這個命令列環境不是原本真正的系統,原本系統在 /sysroot,所以先 chroot 到 /sysroot
    # chroot /sysroot
    
    修改root密碼
    # passwd root
    
  3. 最後,在系統根目錄建一個 .autorelabel 檔案,
    開機時,系統偵測到根目錄有這個檔,便會 relabel 系統的 SELinux 相關設定,
    否則若受 SELinux 影響,還是會沒辦法登入。
    # touch /.autorelabel
    


參考:
How To Reset Your Forgotten Root Password On CentOS 7 Servers – Liberian Geek
v7 變更密碼
45.2.2. Relabeling a File System
centos - What does the .autorelabel file do in Linux? - Server Fault


其他資料:http://dywang.csie.cyut.edu.tw/dywang/rhel7/node5.html
  • CentOS 7 開機不分層級,而是分成 4 個 target
    Target 說明
    graphical.target 多人模式,支援圖形及文字兩種方式登入,等效 v6 的層級 3 及 5。
    multi-user.target 多人模式,只支援文字登入方式,等效 v6 的層級 3。
    rescue.target sulogin (Single-user login),單人模式,等效 v6 的層級 1。
    emergency.target sulogin ,單人模式,完成 initramfs 載入且系統根目錄 / 掛載成唯讀,等效 v6 開機掛載不成功時的維修模式。



rsync 執行時出現 remote command not found

使用 rsync,要將遠端資料,複製到本地端時出現以下錯誤
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: remote command not found (code 127) at io.c(226) [Receiver=3.1.2]
原因是,本地端和遠端都要裝 rsync,
如果只有下指令的本地端有裝 rsync,遠端沒裝 rsync,便會出現上列錯誤訊息。

此時在遠端也安裝 rsync 即可
#yum install rsync


參考:
解决bash: rsync: command not found-web集结号


2016年8月8日 星期一

PHP 出現 mod_fcgid: read timeout from pipe 錯誤

PHP 使用 mod_fcgid 執行,畫面出現 Internal Server Error,
error log 錯誤訊息如下:
[warn] [client 127.0.0.1] mod_fcgid: read timeout from pipe
[error] [client 127.0.0.1] Premature end of script headers: index.php
可知是 PHP 執行時間超過系統設定。

若 PHP 執行時間是預期中的,則可將 mod_fcgid 的Timeout 時間設長一點
<IfModule mod_fcgid.c>
    .......
    #FcgidIOTimeout                  120
    #FcgidIdleTimeout                120
    #將時間改長
    FcgidIOTimeout                  1200
    FcgidIdleTimeout                1200
    ......
</IfModule>


參考:
php - fread timeout with 'mod_fcgid: read timeout from pipe' - Stack Overflow

 

PHP 將物件傳到 function 時,有用 & 和沒用 & 的差異

PHP 在 function 間傳遞物件時,沒用 & (pass by identifier)和 有用 & (pass by reference),兩者用起來雖然差不多,但嘗試將負責傳遞的物件變數,整個重新指定為其他東西時,會有不同的結果。

[ 沒用 & (使用識別符號傳遞) ]
[ pass by identifier(a reference to a reference) ]
class test{
    public $v = 123;
}

function change1($a){
    $a->v = 999;
}
function change2($a){
    $a = 222; //不能改變 $a = new test() 這個物件
}

$a = new test();
var_dump($a);

change1($a);
var_dump($a);

change2($a);
var_dump($a);
結果:
object(test)#1 (1) {
  ["v"]=>
  int(123)
}
object(test)#1 (1) {
  ["v"]=>
  int(999)
}
object(test)#1 (1) { //不能改變 $a = new test() 這個物件
  ["v"]=>
  int(999)
}



[ 用 & (使用參考傳遞) ]
[ pass by reference ]
class test{
    public $v = 123;
}

function change1(&$a){
    $a->v = 999;
}
function change2(&$a){ //可以改變 $a = new test() 這個物件
    $a = 222;
}

$a = new test();
var_dump($a);

change1($a);
var_dump($a);

change2($a);
var_dump($a);
結果:
object(test)#1 (1) {
  ["v"]=>
  int(123)
}
object(test)#1 (1) {
  ["v"]=>
  int(999)
}
int(222)  //可以改變 $a = new test() 這個物件


參考:
PHP: Passing by Reference - Manual
PHP: Objects and references - Manual
variables - How do you pass objects by reference in PHP 5? - Stack Overflow

2016年7月31日 星期日

PHP ini_set 設定 error_log 後無效

PHP 的 error_log 設定值,可修改範圍是 PHP_INI_ALL,所以可以使用 ini_set() 設定,
若設定後無效,可查看 php 設定檔,
是不是已經使用 php_admin_value 設定了 error_log 的值,
因為在設定檔中使用 php_admin_value、php_admin_flag 的方式指定設定值,
之後再使用 .htaccess 或 ini_set() ,也不能覆蓋 php_admin_value、php_admin_flag 設定的值。
php_admin_value、php_admin_flag 的效力比 .htaccess 、 ini_set() 大。

參考:
PHP: 运行时配置 - Manual
PHP: 配置可被设定范围 - Manual
PHP: How to change configuration settings - Manual