FreeBSD和Linux如何互相访问文件系统

一、如何mount Linux Ext2文件系统

经常有人在问,强大的FreeBSD为什么不能使用牛B的Linux ext文件系统呢?得到的回答通常是:“能,当然能了”。可是,太多的人习惯了使用mount_xxx来工作,这时会发现mount_只有这样的列表:

mount           mount_mfs       mount_nfs       mount_ntfs      mount_nwfs      mount_smbfs     mount_unionfs
mount_cd9660    mount_msdosfs   mount_nfs4      mount_nullfs    mount_portalfs  mount_udf       mountd

千万不要灰心,强大的FreeBSD还有很多你所不知道的东东,请使用:

mount -t ext2fs

来mount牛B的Linux ext文件系统罢。对了,小小的提示,ext3也可以使用ext2来mount的。

需要注意的是,尽量不要以读写方式挂接 ext2/ext3 文件系统。尽管 FreeBSD 支持在 ext2/3 文件系统中写入数据,但是这种做法是容易导致问题的。如果希望做系统迁移,比较理想的做法是使用 NFS 将数据复制过来。

二、如何在linux中mount ufs2文件系统

FreeBSD的默认文件系统是ufs2。 可以用:

mount -r -t ufs -o ufstype=ufs2 /dev/hda10 /mnt

这样的命令来挂载。

前提:Linux内核中必须启用ufs和bsd disk label支持. 即

CONFIG_BSD_DISKLABEL=y
CONFIG_UFS_FS=y
CONFIG_UFS_FS_WRITE=y

原文链接:http://wiki.freebsdchina.org/faq/filesystem/e/mount_ext2fs
http://wiki.freebsdchina.org/faq/filesystem/e/mount_ufs2_in_linux

FreeBSD下文件和目录操作

FreeBSD下文件和目录操作

一、目录操作

新建目录

如果是当前路径下

mkdir 目录名

如果是在别的已有目录下

mkdir 目标路径/目录名

如果目标路径不存在

mkdir -p 目标路径/目录名

重命名目录/移动目录

本质上,重命名目录和移动目录是一样的,都可以这样实现:

#移动
mv 源目录 目标目录
#重命名
mv 原名 目标名

删除目录

有两个办法:

rmdir 目录名

或者

rm -r 目录名

二、文件操作

新建文件

如果是当前路径下

touch 文件名

如果是在别的已有文件下

touch 目标路径/文件名

如果目标路径不存在,需要先创建目录:

mkdir -p 目标路径

请注意,这时候生成的文件本身为空,请选择工具对文件进行处理

重命名文件/移动文件

本质上,重命名文件和移动文件是一样的,都可以这样实现:

#移动
mv 源文件 目标文件
#重命名
mv 原名 目标名

删除文件

rm 文件名

复制文件

cp 源文件 目标文件

三、更改所有者

针对文件而言,很简单:

# 语法
# chown 用户名 目标文件
# 例子:
chown playername /usr/local/www/data/index.html

如果是目录

# 语法
# chown -R 用户名 目标文件
# 例子:
chown -R playername /usr/local/www/data

如果你想改一个目录的用户组也不难:

# 语法
# chgrp 组名 目标文件
# 例子:
chgrp playername /usr/local/www/data/index.html

如果是目录

# 语法
# chgrp -R 组名 目标文件
# 例子:
chgrp -R playername /usr/local/www/data

如果想用户和组起改,哪么使用chown一次就可以:

# 语法
# chown 用户名:组名 目标文件
# 例子:
chown playername:playername /usr/local/www/data/index.html

如果是目录

# 语法
# chown -R 用户名:组名 目标文件
# 例子:
chown -R playername:playername /usr/local/www/data

四、更改权限

在了解如何更改文件/目录的权限之前,您需要先行了解FreeBSD下文件权限的相关概念,点击这里[URL:http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/permissions.html]。

用于改变文件/目录权限的文件的命令是:

chmod

chmod 有两种风格,数字化(使用0~8)的和字符方式(使用 a,u,g 标识)的,如下: 给所有用户加上读权限:

chmod a+r 目标文件
chmod 444 目标文件

给所有用户加上执行权限

chmod a+x 目标文件
chmod 777 目标文件

让所有用户完全控制

chmod 777 目标文件

更加复杂的文件权限分配请参看man page

需要注意的是: 对于普通用户而言(也就是对root无效),
目录的x权限一旦去除,用户将无法进入目录;
目录的r权限一旦去除,用户将无法列出目录清单

原文链接:http://wiki.freebsdchina.org/faq/file_and_directory/directory_management
http://wiki.freebsdchina.org/faq/file_and_directory/file_management
http://wiki.freebsdchina.org/faq/file_and_directory/change_owner
http://wiki.freebsdchina.org/faq/file_and_directory/change_mode

在远程FreeBSD服务器上运行VirtualBox

VirtualBox可以在远程运行,并把界面通过 ssh 的 X11 转发放到管理员的桌面。

在 FreeBSD 上可以用 port 来安装 VirtualBox:

# portsnap fetch update
# cd /usr/ports/emulators/virtualbox-ose
# make install clean

接着配置 VirtualBox 所需要的内核模块:

echo ‘vboxdrv_load="YES"’ >> /boot/loader.conf
echo ‘vboxnet_enable="YES"’ >> /etc/rc.conf.local

将需要使用VirtualBox的用户添加到vboxusers组:

# pw groupmod vboxusers -m delphij

安装 xauth:

# cd /usr/ports/x11/xauth
# make install clean

重启系统,或手工加载模块之后,就可以从远程 ssh 进来运行 VirtualBox 了:

desktop% ssh -Y vsvc.example.com # 【注1】
vsvc% VirtualBox

VirtualBox的管理界面会出现在客户端系统上(当然,在列出文件时仍然是服务器端的文件)。

在安装、调试之后,就可以用VBoxHeadless来启动远程的虚拟机了。

【注1】这里使用的是"Trusted Forwarding",如果远程主机不可信,这样做会提高安全风险。

原文链接:https://blog.delphij.net/2010/10/freebsdvirtualb.html

FreeBSD的单用户模式

FreeBSD的单用户模式

什么是单用户模式

FreeBSD 在正常运行时处于多用户模式 (multi-user mode)。此时系统资源全部可用,文件系统都被挂载并可读写。系统中各个用户都可登录或执行特定命令,以及等等。而单用户 (single-user mode) 则相反。进入单用户模式后,系统资源不是全部可用,只有根文件系统 (root filesystem) 被挂载,而且只能读不能写。系统只有一个用户,也就是超级用户 root。单用户模式一般是超级用户用来执行系统维护,修复等工作的。

什么时候需要单用户模式

文件系统有不可自动修复的错误时

进入单用户模式,可以运行 fsck (或者 fsck -y),来修复文件系统。

编译安装系统时

我们需要在单用户模式下来 make installworld,以避免在升级系统和配置时造成不必要的错误。

执行其他维护,升级,修复等操作时

单用户模式下如何让根分区可读写

很简单,执行 mount -uw / 就可以了。

单用户模式下如何启动 ZFS

依次执行两个命令就行了。

#/etc/rc.d/hostid start

#/etc/rc.d/zfs start

如何进入单用户模式

当系统启动到菜单时,按下数字键 4,就能进入单用户模式。如果是老版本的 FreeBSD,或禁止了 beastie 菜单,则需要在出现 boot 提示符的时候按下任意键,然后输入 boot -s 才能启动到单用户模式。

原文链接:http://wiki.freebsdchina.org/faq/boot_and_shutdown/single_user_mode

为OpenSSH添加chroot功能

目标

为 OpenSSH 的 sshd 添加将登录用户 chroot 的功能。

原理介绍

OpenSSH 的 sshd 本身没有提供 chroot 的功能,所以必须依靠一些其他的方法来提供 chroot 的功能。而 OpenSSH 所提供的 sshd 拥有使用 Pluggable Authentication Module(简称为 PAM,下同)的能力,因而我们可以利用这个东西来提供这样的功能。正好 FreeBSD 同时提供了一个叫做 pam_chroot(8) 的 PAM 模块,这个模块的作用就是提供 chroot 的功能。于是通过 FreeBSD 已有的代码,我们可以为 OpenSSH 的 sshd 提供 chroot 的功能。

软件需求

FreeBSD 7.0-RELEASE(实际上未必需要这么新,但是其他的版本我没有测试过)。

实现过程

配置 /etc/ssh/sshd_config

设置 UsePAM 为 yes。

配置 /etc/pam.d/sshd

pam_chroot(8) 的简介

PAM 模块可以提供 4 种功能,分别是 authentication、account management、session management 和 password management。而 pam_chroot(8) 本身只提供了 session management 的功能。这个 PAM 模块可以有 4 个参数 also_root,always,cwd,dir,以下逐一解释。

also_root

如果设置了 also_root,那么即使是 root 登录上来,也会被 chroot。

always

always 告诉 pam_chroot(8) 无论如何都要 chroot,如果找不到合适的 root directory,那么 pam_chroot(8) 模块就报告失败。如果不设置这个选项,查找合适的 root directory 失败之后,pam_chroot(8) 模块报告的就是成功。

dir

dir 是默认的 root directory,如果用户的 home directory 在 passwd 中的描述不符合 pam_chroot(8) 的要求,那么用户就会被 dir 就将是用户的 root directory。

cwd

cwd 提供一个默认的 working directory 给 pam_chroot(8),如果用户的 home directory 在 passwd 中的描述不符合 pam_chroot(8) 的要求,那么将会 chdir 到这个目录,该参数默认为 /。

配置合适的参数

由于 pam_chroot(8) 只有 session management 功能,那么 /etc/pam.d/sshd 这个文件的 session 部分的第一行加上

session         requisite       pam_chroot.so      dir=/tmp cwd=/

这一行代码告诉 PAM,如果 pam_chroot(8) 模块失败了,那么 PAM 系统宣告管理失败,那么将会导致用户不能登录,并且用户默认会被丢在 /tmp 里面。

准备必须的文件

chroot 发生在 sshd 内,而后续创建的进程的 root directory 已经是被 chroot 过了的,此时如果在新的 root directory 中没有合适的文件,那么最终 sshd 将无法启动程序(譬如用户的 shell 等)。
按照上面的例子,用户将会被 chroot 到 /tmp,则需要在 /tmp 中安装合适的文件:
cp -pR /bin /tmp/bin
cp -pR /lib /tmp/lib
cp -pR /libexec /tmp/libexec
mkdir /tmp/etc
mkdir -p /tmp/usr/share/misc
cp /usr/share/misc/termcap /tmp/usr/share/misc

这里假设登录的用户使用了系统附带的 shell 之一。

优点与缺点

优点

与单独启 jail 把用户锁在固定的目录相比,这样做可以避免启动很多 jail,也就省下了很多 IP 地址,并且总共只启动了一个 sshd 进程用于监听 22 端口。

缺点

因为 pam_chroot(8) 非常简陋,所以导致了某些事情做出来让人很不爽:

1、必须对几乎所有的用户 chroot

严格的说并不是这样,但是一般情况下是几乎是一旦在 sshd 的 PAM 配置中启用 pam_chroot(8),那么所有用户都会被 chroot 掉。有个很丑的方法可以改善这种状况,就是使用 pam_ftpusers(8)跳过某些用户。但是 pam_ftpusers(8) 的实现也很简陋,它必须使用 /etc/ftpusers 来指定用户名称,于是……

2、pam_chroot(8) 要求登录的用户必须在 passwd 里面有对应的条目

根据 pam_chroot(8) 的代码,如果登录的用户在 passwd 里面不存在对应的条目,那么 pam_chroot(8) 将返回失败,于是登录也将失败……这样就限制了从其他途径通过认证的用户的使用了。

3、为了使用 pam_chroot(8) 可能要修改 passwd 中对用户 home directory 的描述

pam_chroot(8) 要求当用户的 home directory 中间有 ”/./” 这样的字符串时,前面部分会成为用户所属的 sshd 的 root directory,而后面部分会成为用户的 working directory。但是默认情况下有谁会特意设置这样的 home directory 呢?而且根据 pam_chroot(8) 的代码,如果你不这样设置,并且你没有给 pam_chroot(8) 传递 dir 参数,那么 pam_chroot(8) 会一直失败或总是成功。

4、要装一堆文件

这个没办法,只能这样了……谁让 sshd 本身不是个 shell 呢?

原文链接:http://wiki.freebsdchina.org/howto/c/chrootssh