我正在尝试使用自定义选择的包创建 Linux 映像。
我想要做的是手工制作我将在 XO 笔记本电脑上使用的包,因为在真正的 XO 硬件上编译包需要很长时间,如果我可以构建我需要的所有包并且只刷图像到XO,我可以节省时间和空间。
当我尝试安装某些软件包时,由于缺少 proc、sys、dev 目录而无法配置。所以,我从其他地方了解到我需要将主机 proc、... 目录“挂载”到我的 chroot 环境中。
我看到了两种语法,但不确定使用哪一种。
在主机中:
mount --bind /proc <chroot dir>/proc
Run Code Online (Sandbox Code Playgroud)
和另一种语法(在 chroot 环境中):
mount -t proc none /proc
Run Code Online (Sandbox Code Playgroud)
我应该使用哪一种,有什么区别?
这个问题与经常被问到的问题有关。该程序经常被提及或链接到异地,但通常没有清楚和正确地说明。为了将有用的信息集中在一个地方,这个问题旨在为这个程序提供一个清晰、正确的参考。
为恢复过程准备chroot环境的正确步骤是什么?
在许多 情况下,最好在安装中修复损坏的 Linux 安装。但是如果系统无法启动,您如何从内部修复它?
让我们假设您设法引导到备用系统。到达那里后,您需要访问损坏的安装以修复它。许多恢复 入门指南推荐使用的chroot才能,如果你是真正引导到碎安装运行程序。
由于这是社区 Wiki,请随时编辑此问题以对其进行改进。
使用 init 脚本(或使用 openrc)我总是可以从不同的安装根运行服务。
但是当我跑步时,chroot /somepath/to_root /usr/bin/systemctl start someservice我得到了:
Running in chroot, ignoring request.
Run Code Online (Sandbox Code Playgroud)
有没有办法强制systemd运行服务?
更新:
我忘了说我的主机系统运行 init 脚本或 openrc,但从来没有使用 systemd,而且我使用 chroot 来对 Unix 系统进行故障排除,这些系统甚至无法启动最小的 shell。
我对我尝试部署的这个设置感到困惑。我希望你们当中有人能帮我一把:非常感谢。
背景资料
服务器是Debian 6.0,ext3,前面是Apache2/SSL和Nginx作为反向代理。我需要提供对 Apache 根目录 (/var/www) 的 sftp 访问权限,确保 sftp 用户以 RWX 权限被 chroot 到该路径。
所有这一切都没有修改 /var/www 中的任何默认权限。
drwxr-xr-x 9 root root 4096 Nov 4 22:46 www
Run Code Online (Sandbox Code Playgroud)
里面 /var/www
-rw-r----- 1 www-data www-data 177 Mar 11 2012 file1
drwxr-x--- 6 www-data www-data 4096 Sep 10 2012 dir1
drwxr-xr-x 7 www-data www-data 4096 Sep 28 2012 dir2
-rw------- 1 root root 19 Apr 6 2012 file2
-rw------- 1 root root 3548528 Sep 28 2012 file3
drwxr-x--- 6 www-data www-data 4096 …Run Code Online (Sandbox Code Playgroud) 当我运行时,chroot /somepath /usr/bin/startx我得到了一些看起来像 evdev 问题的东西...... (我正确地 --bind 安装了 /dev/ /dev/pts /dev/shm /proc /sys /tmp )
屏幕显示和程序正常运行,除了我没有鼠标和键盘,我无法切换到本地终端,迫使我硬重启。
这是什么原因?
是否有任何解决方案可以让服务器运行?
重现的可能步骤(适用于所有发行版):
将 Linux 发行版的根目录复制到您运行发行版的文件夹中。
正确绑定挂载所有内容(/dev/pts /var/run /dev/shm /sys/kernel/debugfs...)
使用chroot命令运行 shell 。
确保没有任何 X11 服务器已经在运行,然后启动xinit /usr/bin/some X11 program
您现在可以硬重启您的计算机!(如果您没有设置任何远程访问)
所以,我很确定这是真的,但我还没有找到直接回答我的问题的具体详细的独立参考。问题是:
如何添加对 chroot 环境之外的资源的访问权限?
我已经使用 OpenSSH 的新 ChrootDirectory 指令设置了 chroot SFTP。
不幸的是,在我的环境中,我无法将 chroot 直接限制到某些用户资源所在的主目录。所以我创建了一个单独的 chroot 区域,并且正在链接所需的资源。
我尝试使用符号链接来做到这一点。例如
ln -s /path/to/resource /chroot/dir/resource
Run Code Online (Sandbox Code Playgroud)
但这有一个“无法规范未找到的目录”错误
所以我的解决方案是使用绑定安装:
mount --bind /path/to/resource /chroot/dir/resource
Run Code Online (Sandbox Code Playgroud)
那奏效了。
真的,我只是想确认符号链接不起作用。指向描述此内容的良好参考的链接也很好。
我有一个网站,我想添加一些对子文件夹的限制访问。为此,我决定将 CHROOT 与 SFTP 一起使用(我主要遵循此链接:http : //shapeshed.com/chroot_sftp_users_on_ubuntu_intrepid/)
现在,我已经创建了一个用户 (sio2104) 和一个组 (magento)。按照指南操作后,我的文件夹列表如下所示:
-rw-r--r-- 1 root root 27 2012-02-01 14:23 index.html
-rw-r--r-- 1 root root 21 2012-02-01 14:24 info.php
drwx------ 15 root root 4096 2012-02-25 00:31 magento
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我已经 chown root:root 文件夹 magento 我想监禁在用户和......顺便说一句。同样在 magento 文件夹中,我 chown sio2104:magento 一切,以便他们可以访问他们想要的东西。最后,我已将此添加到 sshd_config 文件中:
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group magento
ChrootDirectory /usr/share/nginx/www/magento
ForceCommand internal-sftp
AllowTCPForwarding no
X11Forwarding no
PasswordAuthentication yes
#UsePAM yes
Run Code Online (Sandbox Code Playgroud)
结果是……好吧,我可以输入我的登录名、密码,然后一切都以“管道损坏”错误结束。
$ sftp sio2104@10.20.0.50
[....some debug....]
sio2104@10.20.0.50's password:
debug1: …Run Code Online (Sandbox Code Playgroud) 我正在尝试配置 rsnapshot(使用 rsync)来备份 Windows 服务器,但是我遇到了 rsync 无法跟踪要备份的服务器上的符号链接的问题。
我使用以下脚本创建指向最新卷影副本卷的链接,以便 rsync 可以访问它:
#!/bin/sh
# Mount the latest shadow copy for the specified volume
VOLUME="D:"
LINK_NAME="E:\\latest-data-shadow-copy"
SHADOW_VOLUME=`vssadmin list shadows /for=$VOLUME | grep "Shadow Copy Volume:" | tail -1 | tr -s ' ' | cut -d ' ' -f5`
SHADOW_VOLUME+="\\" …Run Code Online (Sandbox Code Playgroud)据我所知,ptrace 只能通过 PTRACE_SYSCALL 获取系统调用号,但是 x86 和 x64 中的系统调用号是不同的。那么有没有办法找出这个系统调用的真正起源?
我现在正在编写一个程序来通过系统调用号限制其他一些系统调用,我知道 x86 和 x64 上的系统调用号,但是一些程序使用“int 80h”而不是“系统调用”,这样他们就可以做危险的事情我限制在 x64 上。例如,我在 x64 上禁止了 fork(),他们可以使用 'int 80h(2)'(fork()) 而我认为他们正在使用 'syscall(2)'(open()),因此他们可以打破限制. 尽管 ptrace 可以跟踪它们并获取系统调用号,但我无法区分系统调用实际来自何处。
我已经用 chroot 到一个外部磁盘sudo chroot /mnt/disk,但几乎我所做的一切(登录、tab 完成、less输入文件,...)都会导致一个错误提到/dev/null: Permission denied,即使命令似乎有效。
/dev/null 具有正确的权限 (666),并file表示它是一个字符设备,所以它不像任何东西已经用常规文件覆盖它或更改了权限。
我能做些什么来解决这个问题?
以下是制表符补全(of ls /u)的结果:
$ ls /ubash: /dev/null: Permission denied
bash: _upvars: `-a2': invalid number specifier
bash: /dev/null: Permission denied
bash: _upvars: `-a0': invalid number specifier
Run Code Online (Sandbox Code Playgroud)