Linux tmpfs和mount --bind

Linux tmpfs作用及使用方法,首先了解下什么是tmpfs?

原文地址:http://www.iplaypy.com/linux/l6790.html

mpfs是一种虚拟内存文件系统,而不是块设备。是基于内存的文件系统,创建时不需要使用mkfs等初始化;
它最大的特点就是它的存储空间在VM(virtual memory),VM是由linux内核里面的vm子系统管理的。

linux下面VM的大小由RM(Real Memory)和swap组成,RM的大小就是物理内存的大小,而Swap的大小是由自己决定的。

Swap是通过硬盘虚拟出来的内存空间,因此它的读写速度相对RM(Real Memory)要慢许多。
当一个进程申请一定数量的内存时,如内核的vm子系统发现没有足够的RM时,就会把RM里面的一些不常用的数据交换到Swap里面,如果需要重新使用这些数据再把它们从Swap交换到RM里面。如果有足够大的物理内存,可以不划分Swap分区。

关于SWAP的增加详见:VM由RM+Swap两部分组成,因此tmpfs最大的存储空间可达(The size of RM + The size of Swap)。

但是对于tmpfs本身而言,它并不知道自己使用的空间是RM还是Swap,这一切都是由内核的vm子系统管理的。
tmpfs默认的大小是RM的一半,假如你的物理内存是1024M,那么tmpfs默认的大小就是512M。一般情况下,是配置的小于物理内存大小的。

tmpfs配置的大小并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有100M文件,那剩余的900M仍然可为其它应用程序所使用,但它所占用的100M内存,是不会被系统回收重新划分的。

当删除tmpfs中文件,tmpfs 文件系统驱动程序会动态地减小文件系统并释放 VM 资源。

tmpfs的用途是什么?

例如:
中的Automatic Memory Management特性就使用了/dev/shm。
LINUX中可以把一些程序的临时文件放置在tmpfs中,利用tmpfs比硬盘速度快的特点提升系统性能。

调整tmpfs大小大致有以下三种方法:

1.直接挂载到需要的目录--比如系统的临时目录-可以根据实际需要挂载某个程序的临时文件的目录

[root@bys3 ~]# mount -t tmpfs -o size=20m tmpfs /tmp
[root@bys3 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 16G 10G 4.7G 69% /
/dev/sda1 99M 21M 74M 22% /boot
tmpfs 502M 0 502M 0% /dev/shm
tmpfs 20M 0 20M 0% /tmp
由于没有挂载之前/tmp目录下的文件也许正在被使用,因此挂载之后系统也许有的程序不能正常工作。可以写入/etc/fstab,这样重启后也有效。

2./etc/fstab文件来修改/dev/shm的容量(增加size=100M选项即可),修改后,重新挂载即可:

[root@bys3 ~]# cat /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults,size=600M 0 0
tmpfs /tmp tmpfs defaults,size=25M 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda3 swap swap defaults 0 0
/dev/sda5 swap swap defaults 0 0
[root@bys3 ~]# mount -a --测试/etc/fstab无错误,重启OS系统
[oracle@bys3 ~]$ df -h --重启后的信息如下,tmpfs文件系统的对应条目已经改变为配置的
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 16G 10G 4.7G 69% /
/dev/sda1 99M 21M 74M 22% /boot
tmpfs 600M 0 600M 0% /dev/shm
tmpfs 25M 0 25M 0% /tmp

3./dev/shm建一个tmp目前,并与/tmp绑定。 --这方法有点烦琐,不如方法1方便快捷。

[root@bys3 ~]# mkdir /dev/shm/tmp
[root@bys3 ~]# chmod 1777 /dev/shm/tmp
[root@bys3 ~]# mount --bind /dev/shm/tmp /tmp -注意mount --bind 这里bind前是两个-
[root@bys3 ~]# ls -ld /tmp

drwxrwxrwt 2 root root 40 Dec 8 12:15 /tmp
[root@bys3 ~]# df -h

Filesystem Size Used Avail Use% Mounted on
/dev/sda2 16G 10G 4.7G 69% /
/dev/sda1 99M 21M 74M 22% /boot
tmpfs 600M 0 600M 0% /dev/shm
tmpfs 600M 0 600M 0% /tmp ----可以看到/tmp使用到了 /dev/shm的空间。

以上为Linux tmpfs作用及使用方法。

 

mount --bind

在固件开发过程中常常遇到这样的情况:为测试某个新功能,必需修改某个系统文件。而这个文件在只读文件系统上(总不能为一个小小的测试就重刷固件吧),或者是虽然文件可写,但是自己对这个改动没有把握,不愿意直接修改。这时候mount --bind就是你的好帮手。

假设我们要改的文件是/etc/hosts,可按下面的步骤操作:

1. 把新的hosts文件放在/tmp下。当然也可放在硬盘或U盘上。
2. mount --bind /tmp/hosts /etc/hosts

测试完成了执行 umount /etc/hosts 断开绑定。

如果我需要在/etc下面增加一个exports文件怎么办?原来没有这个文件,不能直接bind。我们有两个方法:

方法1:绑定整个/etc目录,绑定前先复制/etc

# cp -a /etc /tmp
# mount --bind /tmp/etc /etc

此时的/etc目录是可写的,所做修改不会应用到原来的/etc目录,可以放心测试。

方法2:挂载ramfs到/etc,同样要先复制/etc

挂载ramfs
# mkdir /tmp/etc
# mount -t ramfs none /tmp/etc

复制/etc,这里我们不能用cp -a,改用tar
# cd /etc
# tar cf - . |(cd /tmp/etc; tar xf -)
# cd /

覆盖/etc
# mount --move /tmp/etc /etc

测试完了记着 umount /etc

`mount` 是 Linux/Unix 系统中用于**挂载文件系统**的核心命令,允许将存储设备(如硬盘分区、ISO 镜像、网络共享等)连接到目录树的指定位置。以下是详细解析: --- ### **1. 基本语法** ```bash mount [选项] <设备或资源> <挂载点> ``` - **设备或资源**:可以是磁盘分区(如 `/dev/sda1`)、ISO 文件、NFS 共享等。 - **挂载点**:目标目录(如 `/mnt/data`),需提前创建。 - **常用选项**:`-t`(指定文件系统类型)、`-o`(挂载选项)、`-a`(挂载 `/etc/fstab` 中所有条目)。 --- ### **2. 核心功能** #### **(1) 挂载磁盘分区** ```bash sudo mount /dev/sdb1 /mnt/data ``` - 将 `/dev/sdb1` 挂载到 `/mnt/data` 目录。 #### **(2) 挂载 ISO 镜像** ```bash sudo mount -o loop ubuntu.iso /mnt/iso ``` - `-o loop`:将普通文件(如 ISO)作为块设备挂载。 #### **(3) 挂载 NFS 共享** ```bash sudo mount -t nfs 192.168.1.100:/shared /mnt/nfs ``` - `-t nfs`:指定文件系统类型为 NFS。 #### **(4) 挂载临时文件系统(tmpfs)** ```bash sudo mount -t tmpfs -o size=1G tmpfs /mnt/ramdisk ``` - 在内存中创建 1GB 大小的临时存储。 #### **(5) 重新挂载为只读** ```bash sudo mount -o remount,ro / ``` - 将根文件系统重新挂载为只读模式(用于修复系统)。 --- ### **3. 关键选项详解** | 选项 | 作用 | |---------------|----------------------------------------------------------------------| | `-t type` | 指定文件系统类型(如 `ext4`、`xfs`、`ntfs`、`nfs`)。 | | `-o options` | 挂载选项(如 `ro`、`rw`、`noatime`、`sync`),多个选项用逗号分隔。 | | `-a` | 挂载 `/etc/fstab` 中定义的所有文件系统。 | | `-n` | 不写入 `/etc/mtab`(用于修复只读文件系统)。 | | `-v` | 显示详细输出。 | | `--bind` | 绑定挂载(将目录挂载到另一个目录,如 `mount --bind /old /new`)。 | --- ### **4. 常用挂载选项 (`-o`)** | 选项 | 作用 | |---------------|----------------------------------------------------------------------| | `ro`/`rw` | 只读或读写模式。 | | `noatime` | 禁止更新访问时间(提升性能)。 | | `sync`/`async` | 同步或异步写入数据。 | | `exec`/`noexec` | 允许或禁止执行二进制文件。 | | `user_xattr` | 支持扩展文件属性(如 SELinux 标签)。 | | `discard` | 启用 SSD 的 TRIM 功能(需文件系统支持)。 | | `uid=N,gid=N` | 指定挂载后文件的属主属组(如 `uid=1000,gid=1000`)。 | --- ### **5. 高级用法** #### **(1) 自动挂载(`/etc/fstab`)** 编辑 `/etc/fstab` 文件,添加如下行: ```plaintext /dev/sdb1 /mnt/data ext4 defaults,noatime 0 2 ``` - 字段含义:`设备` `挂载点` `文件系统` `选项` `dump备份` `fsck顺序`。 - 之后运行 `sudo mount -a` 加载所有条目。 #### **(2) 绑定挂载(目录复用)** ```bash sudo mount --bind /var/www /mnt/webroot ``` - 将 `/var/www` 的内容同时暴露在 `/mnt/webroot`。 #### **(3) 共享挂载(propagation)** ```bash sudo mount --make-rprivate / sudo mount --rshared /mnt/shared ``` - 控制挂载点的传播行为(用于容器或嵌套挂载场景)。 #### **(4) 挂载时加密** ```bash sudo mount -t ecryptfs /secure /mnt/secure -o key=passphrase ``` - 使用 `ecryptfs` 加密目录内容。 --- ### **6. 实用命令** #### **(1) 查看已挂载的文件系统** ```bash mount # 显示所有挂载点 df -h # 显示磁盘使用情况(含挂载点) lsblk -f # 查看块设备及其文件系统类型 ``` #### **(2) 卸载文件系统** ```bash sudo umount /mnt/data # 通过挂载点卸载 sudo umount /dev/sdb1 # 或通过设备卸载 ``` - **注意**:卸载前需确保没有进程访问该目录(可用 `lsof +f -- /mnt/data` 检查)。 #### **(3) 强制卸载(当设备忙时)** ```bash sudo umount -l /mnt/data # 延迟卸载(lazy unmount) sudo umount -f /mnt/data # 强制卸载(可能损坏数据,慎用!) ``` --- ### **7. 注意事项** 1. **权限问题**: - 挂载操作通常需要 `root` 权限(使用 `sudo`)。 - 普通用户可通过 `/etc/fstab` 配置 `user` 选项实现无需 `sudo` 的挂载。 2. **文件系统兼容性**: - NTFS 需安装 `ntfs-3g` 驱动:`sudo mount -t ntfs-3g /dev/sdX1 /mnt/ntfs`。 - exFAT 需安装 `exfat-fuse`。 3. **数据安全**: - 卸载前避免突然断电或强制拔除设备,可能导致文件系统损坏。 - 对关键操作建议先挂载为 `ro`(只读)测试。 4. **性能调优**: - SSD 建议添加 `discard,noatime` 选项。 - 高并发目录可禁用访问时间记录:`noatime,nodiratime`。 --- ### **8. 常见问题** #### **Q1: 如何挂载 LVM 或 RAID 设备?** - LVM 需先激活卷组: ```bash sudo vgscan sudo vgchange -ay sudo mount /dev/vg0/lv_data /mnt/data ``` - RAID 需确保阵列已组装: ```bash sudo mdadm --assemble /dev/md0 /dev/sd[bc]1 sudo mount /dev/md0 /mnt/raid ``` #### **Q2: 挂载时提示 `wrong fs type` 怎么办?** - 安装对应的文件系统驱动(如 `ext4`、`xfs`、`ntfs-3g`)。 - 使用 `-t auto` 自动检测类型(不推荐,可能误判)。 #### **Q3: 如何挂载 Windows 共享(SMB/CIFS)?** ```bash sudo mount -t cifs //192.168.1.100/share /mnt/smb -o username=user,password=pass ``` #### **Q4: 挂载后文件名乱码?** - 指定字符编码(如中文 GBK): ```bash sudo mount -o iocharset=gbk /dev/sdX1 /mnt/data ``` #### **Q5: 如何禁止用户卸载特定挂载点?** - 在 `/etc/fstab` 中添加 `nounmount` 选项(需内核支持)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值