虚拟机chroot环境构建+openssh登录
  • 虚拟机chroot环境构建+openssh登录

     最近项目需要使用chroot环境,不了解chroot的可以自行google补脑,google做了一些了解后,发现一般有三种做法:
      1 使用宿主机系统现有的文件copy一个子系统出来,copy时容易遗漏重要的文件。

      2 使用makejail工具,快速生成一个chroot环境,初步了解了一下makejail工具,发现该工具是根据配置文件配置的服务生成一个环境,在软件包中自带了一些服务模版,应该可以生成能运行该服务的最小chroot环境吧。当然也可以利用多个配置文件生成一个复杂的环境。

      3 使用debootstrap工具,该工具是用来构建基本的debian系统的。也就是说利用该工具可以构建一个小型系统,那我们也就可以利用该软件快速的构建一个比较完整的chroot环境了。
      经过综合评估后,觉得第三种方法最适合我,虽然它构建的chroot环境会比较大,所以下面的实验就以debootstrap为基础来构建chroot环境。
    物理服务器:10.1.6.235  Ubuntu 12.10
    虚拟机:10.1.6.28  Ubuntu 12.10
    1 安装debootstrap,它会下载并安装基本的系统组成部分1
    apt-get -y install debootstrap2 安装schroot,它可以用来管理chroot环境 1
    apt-get -y install schroot3 /etc/default/schroot文件
      该文件是用来管理shcroot服务停止后的默认行为的,默认不需要修改。4 schroot配置文件目录结构:1
    /etc/schroot
    2
    ├── buildd
    3
    ├── chroot.d
    4
    ├── default
    5
    ├── desktop
    6
    ├── minimal
    7
    ├── sbuild
    8
    ├── schroot.conf
    9
    └── setup.d  /etc/schroot/schroot.conf 这是chroot环境定义文件 
      /etc/schroot/chroot.d 该目录是额外的chroot环境的配置文件存放目录 
      /etc/schroot/setup.d 该目录是chroot建立过程的setup文件目录 5 设置/etc/schroot/schroot.conf配置文件,在文件末尾追加如下:1
    [test]
    2
    description=user test chroot
    3
    type=directory
    4
    directory=/opt
    5
    users=test
    6
    groups=root
    7
    root-groups=root6 检查配置文件是否有错误1
    schroot -l
    可以看到名为test的chroot环境,说明是正确的。7 利用debootstrap构建ubuntu12.10的chroot环境1
    debootstrap --variant=buildd --arch=amd64 quantal /opt/ http://10.1.1.187/ubuntu  可以看到根据配置文件在/opt目录下已经有了一个类似小型系统的目录
    8 安装完成后,登入chroot环境1
    schroot -c test -u root
      schroot会自动执行/etc/schroot/setup.d/底下所找到的scripts,当chroot启动时会用档名顺序并且以setup-start选项执行,而离开chroot时会用相反顺序并以setup-stop选项执行。可以在现有的配置文件中增加你想进行的动作,也可以自己建立新的script。
    这样chroot环境就利用debootstrap安装完毕了,如果你认为这样就可以利用到生产环境,那就想的太简单了,我们还需要进行以下升级:1 修改schroot的配置文件,上面我们建立了一个名为test的chroot环境,这个环境要使用到生产环境中,还需要添加一些配置参数:01
    [test]
    02
    description=user test chroot
    03
    type=directory
    04
    directory=/opt
    05
    users=root,test,guol
    06
    root-users=root,guol
    07
    groups=root
    08
    root-groups=root
    09
    setup.copyfiles=default/copyfiles
    10
    setup.fstab=default/fstab
    11
    setup.nssdatabases=default/nssdatabases
    12
    shell=/bin/bash
    13
    preserve-environment=true简单的解释一下各个参数:

    [test]:是该chroot环境的名称
    description:是对该chroot环境的描述
    type:可为plain、directory、file、loopback、block-device、btrfs-snapshot、lvm-snapshot之一。其中plain和directory都是资料夹,差别在于directory 会自动执行预设的setup script和挂载一些目录,而plain什么都不会做。使用file可以直接把archive当成chroot 目标。
    directory:当type为plain或directory时,用来指定目标的位置。
    file:当type为file时,用来指定目标的位置。
    users:原系统中可以透过schroot进入此子系统的使用者。
    root-users:原系统中可以透过schroot进入此子系统并取得root权限的使用者。
    groups:原系统中可以透过schroot进入此子系统的group。
    root-groups:原系统中可以透过schroot进入此子系统并取得root权限的group。
    setup.copyfiles:指定每次进入子系统时,原系统中会被复制进子系统的文件。
    setup.fstab:指定原系统当中会被挂载进子系统的目录,格式和系统的/etc/fstab一样。 注意在预设的情况下schroot会自动把host的/home给bind 进来,如果对子系统的/home做变更,原系统也会受到影响。如果没有必要,建议注释掉该行。
    setup.nssdatabases:指定每次进入子系统时,原系统中会被复制进子系统的资料库,如passwd、shadow、group等等。注意每次进入都会重新复制一次,所以在子系统内对这些资料库做的变更都会被覆写掉。这个很重要,因为我们希望在原系统增加用户,然后让该用户登陆进chroot环境,所以如果你在chroot中增加一个用户后,再次进入chroot环境时,相关文件会被原系统的覆盖掉。
    shell:指定登录chroot环境后使用的shell。2 修改登入chroot环境时默认加载的文件:01
    #/etc/schroot/default/copyfiles
    02
    /etc/hosts
    03
    /etc/resolv.conf
    04
    /etc/network/interfaces
    05
    /etc/apt/sources.list
    06
    /etc/hostname
    07
    /etc/sudoers
    08
    #/etc/schroot/default/fstab
    09
    /proc   /proc   none  rw,bind   0   0
    10
    /sys  /sys  none  rw,bind   0   0
    11
    /dev   /dev  none  rw,bind   0   0
    12
    /dev/pts  /dev/pts  none  rw,bind  0   0
    13
    /tmp  /tmp  none  rw,bind  0  0
    14
    tmpfs   /dev/shm  tmpfs   defaults  0   0
    15
    /run  /run  none  rw,bind   0   0
    16
    /run/lock   /run/lock   none  rw,bind   0   0
    17
    /dev/shm  /dev/shm  none  rw,bind   0   0
    18
    /run/shm  /run/shm  none  rw,bind   0   0
    19
    #/etc/schroot/default/nssdatabases
    20
    passwd
    21
    shadow
    22
    group
    23
    gshadow
    24
    services
    25
    protocols
    26
    networks
    27
    hosts3 修改ssh配置,让普通用户通过ssh可以直接登录进ssh环境,在openssh 4.9版本后就支持该功能了。在配置文件末尾添加如下:1
    #/etc/ssh/sshd_config
    2
    Match User test
    3
      ChrootDirectory /opt/
    4
      ForceCommand internal-sftp
    5
      AllowTcpForwarding no
    6
    Match User guol
    7
      ChrootDirectory /opt
    8
      ForceCommand internal-sftp
    9
      AllowTcpForwarding no  为啥一定加到ssh配置文件的末尾呢,因为Match配置段的结束是以下一个Match配置开始为止的。Match除了可以匹配user还可以根据很多选项来匹配,具体信息可以man一下。

    我们先测试一下目前改进的配置
      1 先测试在本机直接登录chroot环境。分别用test和guol用户测试

    可以看到test用户登录进入怎么有warning提示,而guol用户登录却正常。根据提示使用--directory参数。man解释如下:1
    Change to directory inside the chroot before running the command or login shell.  If directory is not available, schroot will exit with an error status.
    2
    The default behaviour is as follows (all directory paths are inside the chroot).  A login shell is  run  in  the  current working  directory. If this is not available, it will try $HOME (when --preserve-environment is used), then the user's home directory, and / inside the chroot in turn.  A command is always run in the current  working  directory  inside  the chroot.  If none of the directories are available, schroot will exit with an error status.  根据解释,在登录chroot环境的shell时,会给你选择一个登入时的目录,如果没有设置,默认选择当前执行进入chroot环境的目录,如果当前目录不可用,则会寻找你的家目录、然后寻找根目录。看来执行schroot登录chroot时还和当前上下文有关系。chroot环境重肯定没有/etc/schroot目录了,并且我们在fstab的bind时把/home目录给取消掉了,所以在chroot环境中并没有相关用户的家目录。

    改进之后如下:

      2 测试通过ssh直接登陆进chroot环境


    这样基本的配置就已经操作完毕,各位可以根据具体需求对chroot环境进行深度定制。在chroot环境中使用apt-get时,遇到了以下一个错误:1
    dpkg: unrecoverable fatal error, aborting:
    2
     syntax error: unknown group 'ssl-cert' in statoverride file
    3
    E: Sub-process /usr/bin/dpkg returned an error code (2)  提示在使用dpkg时系统没有ssl-cert组,但是看了宿主系统的group文件,也没有该组,新键该组后就可以正常使用了。

     

  • 点这里复制本页地址发送给您QQ/MSN上的好友
  • 300*300广告