Linux系統裁減之,製作一個極度精簡的Linux-4-使用mingetty繞開/bin/login

4 使用mingetty繞開登錄程序/bin/login


在閱讀這篇博文之前,建議先閱讀我的前3篇博文,而且最好按順序閱讀:(不然可能會覺得我寫得不知所云,呵呵!)

第1篇:Linux系統裁減之,製作一個極度精簡的Linux-1 http://blog.51cto.com/linuxprince/2045703

第2篇:Linux系統裁減之,製作一個極度精簡的Linux-2-用腳本實現自動拷貝命令和依賴庫文件 http://blog.51cto.com/linuxprince/2046142

第3篇:Linux系統裁減之,製作一個極度精簡的Linux-3-爲精簡的系統增加網絡功能和關機重啓功能 http://blog.51cto.com/linuxprince/2047373


4.1下載mingettylogin程序源碼

本文使用的CentOS 5.11的源代碼都在官方源碼網站http://vault.centos.org可以下載,

http://vault.centos.org/5.11/os/SRPMS/查找mingettylogin程序,如下圖:

 2017-12-09_14-28-18.png


2017-12-09_14-31-20.png

 

mingettylogin程序分別屬於mingetty-1.07-5.2.2util-linux-2.13-0.59.el5_8軟件包:

[root@CentOS5lsrv01 ~]# rpm -qf /sbin/mingetty

mingetty-1.07-5.2.2

[root@CentOS5lsrv01 ~]# rpm -qf /bin/login

util-linux-2.13-0.59.el5_8

提示:login登錄程序在這篇文章暫時不使用!!下篇博文將會重新編譯login程序!!敬請繼續關注!!^_^

 

4.2使用mingetty爲miniLinux打開兩個終端並直接運行/bin/bash

            紅帽Linux(RedHat 5.x)在啓動過程中執行完/etc/rc.d/rc.sysinit腳本後會根據/etc/inittab的配置運行mingetty實現生成6個終端和圖形界面,用戶看到的“主機名 logon:“登錄提示符就是由mingetty程序拋出的,用戶輸入用戶名和密碼後還會通過/bin/login處理。

這裏我通過mingetty直接生成兩個終端並繞過登錄程序/bin/login直接打開/bin/bash,這些步驟都在源主機(CentOS5lsrv01)做。

1步:修改miniLinux系統下的/etc/inittab文件,修改成以下內容:

[root@CentOS5lsrv01 ~]# cat /mnt/sysroot/etc/inittab

id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc.halt

l6:6:wait:/etc/rc.d/rc.reboot

 

1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

提示:mingetty有一個參數“--login-prog=/bin/login”,貌似是可以指定登錄程序的,但經過驗證添加“--login-prog=/bin/bash”是無效的,必須修改minigetty源代碼。

 

2步:安裝mingetty源代碼包,下載的源碼rpm包我放在源系統的/root/Softwares/Source/目錄下:

[root@CentOS5lsrv01 ~]# ll /root/Softwares/Source/

total 2892

-rw-r--r-- 1 root root   19624 Apr  9  2007 mingetty-1.07-5.2.2.src.rpm

-rw-r--r-- 1 root root 2933601 Nov  9  2012 util-linux-2.13-0.59.el5_8.src.rpm

[root@CentOS5lsrv01 ~]# cd Softwares/Source/

[root@CentOS5lsrv01 Source]# rpm -ivh mingetty-1.07-5.2.2.src.rpm

 

紅帽的源碼包默認安裝在/usr/src/redhat/SOURCE目錄下:

[root@CentOS5lsrv01 Source]# cd /usr/src/redhat/SOURCES/

[root@CentOS5lsrv01 SOURCES]# ll | grep mingetty-1.07

-rw-rw-r--  1 root root   13435 Nov 17  2006 mingetty-1.07.tar.gz

 

3步:解壓mingetty-1.07.tar.gz並進入mingetty的源碼目錄:

[root@CentOS5lsrv01 SOURCES]# tar xf mingetty-1.07.tar.gz

[root@CentOS5lsrv01 SOURCES]# cd mingetty-1.07

[root@CentOS5lsrv01 mingetty-1.07]# ll

total 84

-rw-rw-r-- 1 2455 2459 17983 Feb 14  1996 COPYING

-rw-rw-r-- 1 2455 2459   276 May 25  2003 Makefile

-rw-rw-r-- 1 2455 2459  3993 Feb 21  2003 mingetty-0.9.4-autologin.patch

-rw-rw-r-- 1 2455 2459  2806 May 14  2003 mingetty.8

-rw-rw-r-- 1 2455 2459 10295 Dec  2 10:40 mingetty.c

-rw-rw-r-- 1 2455 2459 10264 Jan  3  2004 mingetty.c.bak    <--修改前先備份一下文件,養成良好習慣

-rw-r--r-- 1 root root 10672 Dec  2 10:17 mingetty.o

 

4步:修改 源代碼文件mingetty.c實現打開兩個終端並直接打開/bin/bash

[root@CentOS5lsrv01 mingetty-1.07]# vi mingetty.c

    此處省略了部分源碼…………

    53 /* login program invoked */

54 static char *loginprog = "/bin/login";  ß把這行修改成:static char *loginprog = "/bin/bash";    

    此處省略了部分源碼………………

    409 /*      if (autologin) {        */

    410 /*              do_prompt (0);  */

    411 /*              printf ("login: %s (automatic login)\n", autologin);    */

    412 /*              logname = autologin;    */

    413 /*      } else  */

    414 /*              while ((logname = get_logname ()) == 0)         */

415                         /* do nothing */ ;

    409行到415行全部註釋掉

    416

    417         if (ch_root)

    418                 chroot (ch_root);

    419         if (ch_dir)

    420                 chdir (ch_dir);

    421         if (priority)

    422                 nice (priority);

    423

    424         execl (loginprog, loginprog, autologin? "-f" : "--", logname, NULL);

    425         error ("%s: can't exec %s: %s", tty, loginprog, strerror (errno));

    426         sleep (5);

    427         exit (EXIT_FAILURE);

428 }

 

修改完後保存退出,然後直接編譯生成mingetty二進制文件:

[root@CentOS5lsrv01 mingetty-1.07]# make

gcc -O2 -Wall -W -pipe -D_GNU_SOURCE   -c -o mingetty.o mingetty.c

mingetty.c:294: warning: ‘get_logname’ defined but not used

mingetty.c: In function ‘main’:

mingetty.c:424: warning: ‘logname’ is used uninitialized in this function

gcc   mingetty.o   -o mingetty ß生成了mingetty文件

[root@CentOS5lsrv01 mingetty-1.07]# ll

total 84

-rw-rw-r-- 1 2455 2459 17983 Feb 14  1996 COPYING

-rw-rw-r-- 1 2455 2459   276 May 25  2003 Makefile

-rwxr-xr-x 1 root root 16122 Dec  2 12:57 mingetty    <--mingetty二進制可執行文件

-rw-rw-r-- 1 2455 2459  3993 Feb 21  2003 mingetty-0.9.4-autologin.patch

-rw-rw-r-- 1 2455 2459  2806 May 14  2003 mingetty.8

-rw-rw-r-- 1 2455 2459 10295 Dec  2 10:40 mingetty.c

-rw-rw-r-- 1 2455 2459 10264 Jan  3  2004 mingetty.c.bak

-rw-r--r-- 1 root root 10672 Dec  2 12:57 mingetty.o

 

5步:把重新編譯出來的mingetty文件拷貝到miniLinux/sbin/目錄下,並拷貝依賴的庫文件:

[root@CentOS5lsrv01 mingetty-1.07]# cp mingetty /mnt/sysroot/sbin/

[root@CentOS5lsrv01 mingetty-1.07]# ldd /sbin/mingetty     ß查看源系統的mingetty依賴的庫文件

        linux-vdso.so.1 =>  (0x00007fff923d9000)

        libc.so.6 => /lib64/libc.so.6 (0x0000003977400000)

        /lib64/ld-linux-x86-64.so.2 (0x0000003977000000)

 

利用之前寫的拷貝庫文件的函數“libcp“完成拷貝庫文件的過程:

[root@CentOS5lsrv01 ~]# cd /root

[root@CentOS5lsrv01 ~]# source bincp.sh

Input command what you want to copy to miniLinux:q          ß直接退出就可以了,目的是獲取libcp函數

[root@CentOS5lsrv01 ~]# [root@CentOS5lsrv01 ~]# libcp /lib64/libc.so.6

Copy lib file /lib64/libc.so.6 Finished.

[root@CentOS5lsrv01 ~]# libcp /lib64/ld-linux-x86-64.so.2

Copy lib file /lib64/ld-linux-x86-64.so.2 Finished.

 

6步:修改miniLinux系統中文/etc/rc.d/rc.sysinit文件爲以下內容:

[root@CentOS5lsrv01 ~]# cat /mnt/sysroot/etc/rc.d/rc.sysinit

#!/bin/bash

#

echo -e "\tWelcome to \033[31mMy team \033[0m Linux."

insmod /lib/modules/e1000.ko

ifconfig eth0 192.168.0.91 netmask 255.255.255.0

ifconfig eth0 up

/bin/bash            ß刪除原來的這行

 

7步:修改完成,掛起源系統(CentOS5lsrv01),啓動過miniLinux系統測試:

Linux系統裁減-5-重新編譯mingetty-有水印.jpg


Linux系統裁減-6-重新編譯mingetty-有水印.jpg

提示:測試終端的tty命令也要先移植到miniLinux哦。


看到吧,這就是Linux,開源的系統,什麼都能按你的意願修改,前提是你足夠了解它!!

小結:

1. 成功打開了兩個終端,並且兩個終端都是直接打開/bin/bash,沒有登錄過程的!!

2. 之前的做法是在 /etc/rc.d/rc.sysinit文件中直接打開/bin/bash的,這次是用/sbin/mingetty程序生成兩個終端並直接打開/bin/bash


下一篇博文將會講講如何爲系統添加用戶登錄功能,歡迎繼續關注我的技術博客!!

Linux系統裁減之,製作一個極度精簡的Linux-5-重新編譯login去除對pam模塊的依賴

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章