linux權限--普通用戶使用livecd模式

目標

linux管理員希望有些用戶操作該系統不寫入磁盤(或者說重啓之後恢復到他登陸之前的狀態),從而屏蔽用戶對系統的修改。

想法

可以簡單的把linux權限歸納爲2個種類,一爲root權限,其餘則爲普通用戶。root權限對於所有操作有寫入磁盤的權限,其餘則是有寫入權限但是不寫入磁盤。因此感覺對於普通的用戶來說,該系統就是livecd的模式。
由此想到一種可能實現:使用內存作爲根目錄的掛載點。
如果要從文件系統入手,則需要對於文件系統分層,由此想到另外一種可能的實現:分層的文件系統–AUFS。

難點

  • 使用內存
    受限於內存大小
  • 使用分層文件系統
  • 共同的難點
    如何區分用戶權限,並執行寫入。

使用aufs測試分層文件系統

所有操作全部處於根目錄下

$mkdir aufs
$mkdir mhj

$vi /mhj/aufs.read
#!/usr/bin/env python
print 'Read function of aufs!'

$vi /mhj/aufs.write
#!/usr/bin/env python
import os

f = open('hello','w')
f.write("This is write function of aufs")
f.close()

for root,dirs,files in os.walk('.'):
        print '----------directory <' + root + '> -----------'
        for d in dirs:
                print d
        for f in files:
                print f

$mount -t aufs -o dirs=/aufs=rw:/mhj=ro aufs /aufs
$chmod +x aufs/aufs.write
$cd aufs&&./aufs.write

之後umount之後會發現在mhj目錄下沒有生成hello文件,而在aufs這個目錄下生成了相應的hello文件

研究linux運行在內存上

要想搞定linux運行的方式,必須先了解linux的啓動流程

linux啓動詳解

1.加電
2.BIOS檢查硬件設施(加電自檢POST power on self test),讀取啓動設備的第一個扇區(512K)即MRB
3.MRB由3部分組成(代碼446B,分區記錄表64B,檢查MRB狀態2B)
4.啓動引導程序GRUB/Lilo
5.加載vmlinuz和initrd,initrd會在內核啓動前加載到內存中去,vmlinuz是被加載到內存中去,並執行head.S進行解壓,得到vmlinux(elf可執行文件,並執行),之後運行vmlinux執行內核初始化。
6.內核初始化流程—-start_kernel()->reset_init()->kernel_init(在這個方法中會執行initrd中的init文件)->init_post()
7.initrd中init文件加載一些必要的設備,準備好系統根目錄,並chroot轉換到準備好的根目錄下,運行系統的init進程
8.init進程執行啓動項,完成啓動。

因此要把linux運行在內存上可能需要修改initrd和根文件目錄。initrd有2種實現方式一種是ramdisk(initrd)一種是ramfs(initramfs)。前者較老,需要在內存中獨立的開闢一個空間作爲塊設備使用;後者較新,是一種基於內存的文件系統,可以動態的擴容。本文基本ramfs研究。

initrd研究

$file initrd.img-3.2.0-4-amd64
initrd.img-3.2.0-4-amd64: gzip compressed data, from Unix, last modified: Fri Nov  1 01:50:32 2013

$gunzip -c initrd.img-3.2.0-4-amd64 > initrd.cpio
$mkdir initrd
$cd initrd&&cpio -ivmd < ../initrd.cpio

#把創建一個新的initrd文件
$find . | cpio -o -H newc | gzip > ../image.cpio.gz

initrd的核心就是init文件,init文件主要幹這麼幾件事
1.創建目錄
2.掛載設備
3.切換運行根目錄
總而言之就是爲了內核準備可以接管的運行環境。
試想我們使用tmpfs創建一個目錄,把根文件中的數據拷貝到該目錄下,然後讓init腳本中switch_root到該目錄下,即可。
switch_root必須在init進程中才能運行,同時做了這麼幾件事情:chroot,執行init。
因此我們需要製作一個根目錄,我可以使用busybox來實現。

busybox製作根目錄

1.創建目錄,設置權限

$mkdir {bin,etc,dev,home,lib,mnt,opt,proc,root,sbin,sys,tmp,usr,var}
$chmod 1777 tmp
$mkdir usr/bin usr/lib usr/sbin lib/modules
$mkdir var/lib var/lock var/log var/run var/tmp
$chmod 1777 var/tmp/
$cd dev/
$mknod -m 600 console c 5 1
$mknod -m 666 null c 1 3

2.下載busybox並且編譯到指定目錄

$make menuconfig
Busybox Setting ----->
    Build Options -----> 
        //1選擇將busybox進行靜態編譯 
        [*]Build BusyBox as a static binary (no shared libs) 
    General Configuration  --->
        //不要使用usr目錄
        [*] Don't use /usr (NEW)
    Installation Options ("make install" behavior)  --->
        //設置指定目錄
        (./_install) BusyBox installation prefix (NEW)

Miscellaneous Utilities  ---> 
    //取消taskset功能
    [ ] taskset (NEW)

保存退出
$make
$make install
$cp -rvf busybox-1.23.1/_install/* ./
busybox問題:
make menuconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 *** 
 *** Install ncurses (ncurses-devel) and try again.
 *** 
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2
提示缺少了ncurses 庫

apt-get install libncurses5-dev

這樣我們就獲取了一個最最基本的根目錄文件。
在修改了init中mountroot方法之後,成功讓系統運行在了內存上。但與此同時還是無法達到根據權限分離讀寫的效果,還需要進一步的研究。

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