linux c挂载(mount)和卸载(unmount)

2018-05-25 16:21:20

读者可以打开linux命令系列-mount(挂载),unmount(卸载),两边对照着阅读。

通过linux专有的虚拟文件 /proc/mounts,可查看当前已挂载的文件系统列表。

其实/proc/mounts 和 /etc/mtab 是指向 /proc/self/mounts 的软连接,而 /proc/self 又是指向 /proc/PID 的软连接,所以查看 /proc/mounts 、 /etc/mtab 、/proc/self/mounts、/proc/PID/mounts 是等同的。

cat /proc/self/mounts

rootfs / rootfs rw 0 0
sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=490124k,nr_inodes=122531,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0
devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0
tmpfs /sys/fs/cgroup tmpfs ro,seclabel,nosuid,nodev,noexec,mode=755 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0
configfs /sys/kernel/config configfs rw,relatime 0 0
/dev/sda3 / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=25,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0
mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0
/dev/sda1 /boot xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
tmpfs /run/user/0 tmpfs rw,seclabel,nosuid,nodev,relatime,size=100000k,mode=700 0 0

而 /etc/fstab 是开机自动挂载的配置文件。

cat /etc/fstab

UUID=7470460a-47a7-41a8-a4f0-7bcdb39b3506 /                       xfs     defaults        0 0
UUID=c7c2cf29-2f94-4bb6-a334-7604c0c7c291 /boot                   xfs     defaults        0 0
UUID=2156bb3d-de11-4dd5-8599-70b16d3ef6b5 swap                    swap    defaults        0 0

这些文件的格式相同,每行记录包含6个字段

1.已挂载设备名,允许3中形式,直接指定设备名、LABEL=<label> 或者 UUID=<uuid>。
2.设备的挂载点
3.文件系统类型
4.挂载的标志,也可以叫做文件系统的参数,rw代表读写
5.能否被dump备份指令作用,dump 是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会,直接输入 0 就好了!
5.是否已fsck校验扇区,早期开机的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整。不过这个方式使用的主要是通过fsck去做的,我们现在用的 xfs 文件系统就没有办法适用,因为 xfs 会自己进行检验,不需要额外进行这个动作!所以直接填 0 就好了。


挂载文件系统:mount()

#include <sys/mount.h>

int mount(const char *source, const char *target, const char *fstype, 
           unsigned long mountflags, const void *data);

//成功返回0,失败返回-1

source一般为设备名,当然也可以是文件或目录名,target 为目标文件或目录名。fstype为文件系统类型比如,ext4,xfs。data为特定文件系统特有的标志,mountflags为挂载的标志。下面对此标志对应表,读者可以参考

 标记用途 
 MS_BIND 绑定挂载(始于linux 2.4),可以吧一个目录挂载到另一个目录,如果指定了该标志,则忽略fstype、data参数以及mountflags中除了MS_REC之外的标志
 MS_DIRSYNC 同步更新路径(始于linux 2.6),类似于open()的O_SYNC,但只针对路径。后面介绍的MS_SYNCHRONOUS,可同时同步更新文件和目录。
 MS_MANDLOCK 允许强制文件锁定记录
 MS_MOVE 以原子操作将source指定的挂载点移到target指定的位置,与mount(8)命令的--move选项相对应。实际上这等同于先卸载前面的挂载,然后重新挂载到另一个位置。使用了这个标志,mount()将忽略fstype、data参数,以及mountflags中的其他标志
 MS_NOATIME 不更新文件的最后访问时间,使用此标志意在消除额外的磁盘访问,避免在每次访问文件时都去更新文件i节点。对默写应用程序来说,维护这一时间戳意义不大,而放弃这一做法还能显著提升性能。
 MS_NODEV 不允许访问文件系统的块设备和字符设备文件,主要是为了安全,规避如下情况:假设用户插入了可移动硬盘,而硬盘中又包含了可随意访问系统设备的专有文件。
 MS_NODIRATIME 不更新目录的最后访问时间,类似 MS_NOATIME
 MS_NOEXEC 不允许在此文件系统上有程序执行,为了安全。
 MS_NOSUID 禁用set-user-ID和set-group-ID程序运行,同样为了安全,防止用户从可移动磁盘上运行可以获取特殊权限的程序。
 MS_RDONLY 只读方式挂载
 MS_REC 递归挂载,跟MS_BIND配合
 MS_RELATIME 只有当最后访问时间早于最后修改时间或最后状态变更时间时,才对前者进行更新。自linux 2.6.30以后,系统会默认提供 MS_RELATIME(除非明确指定了MS_NOATIME标志),要获取传统行为,必须使用 MS_STRICTATIME。此外,只要文件最后访问时间戳距今超过了24小时,即便其大于最近修改和状态改变时间戳,系统仍会更新该文件的最后访问时间戳。
 MS_REMOUNT 重新挂载,改变其mountflag和data。例如将只读的文件系统改成可读写。使用该标志时,source和target参数应该和之前相同,而fstype参数将忽略。使用该标志可以避免对磁盘进行卸载和重新挂载,因为在某些场合是做不到的(比如想卸载系统的根目录 / 再重新挂载就不可能)。使用 MS_REMOUNT的另一场景是tmpfs(基于内存)文件系统,一旦卸载了,其内容便会丢失。并非所有的mountflag都是可修改的,具体信息请参考mount(2)手册。
 MS_STRICTATIME 总是更新最后访问时间(始于linux 2.6.30),定义了此,那么MS_NOATIME和MS_RELATIME将会忽略。
 MS_SYNCHRONOUS 使得所有文件和目录同步更新,就如同O_SYNC标志调用open()来打开文件一样。


卸载文件系统:umount()和umount2()

#include <sys/mount.h>

int umount(const char *target);

//成功返回0,失败返回-1

内核为2.2以及更早的系统可以用两种方式来标识文件系统1.挂载点,2.设备名。自内核版本2.4后不允许用设备名来标识,因为如今可以在多个位置挂载单个文件系统。

无法卸载正在使用中的文件系统,比如有文件打开或者进程的当前工作目录驻留在此文件系统。umount()会返回EBUSY错误。

#include <sys/mount.h>

int umount2(const char *target, int flags);

//成功返回0,失败返回-1

umount2() 是umount()的扩展版,多了个flags标志位,如下

 标志 描述
 MNT_DETACH 始于linux 2.4.11,执行懒卸载。对挂载点加以标记,一方面允许使用了该挂载点的进程得以继续使用,同时静止了其他任何进程对该挂载点发起新的访问。当所有进程都不再使用时,系统会卸载相应的文件系统。
 MNT_EXPIRE 将挂载点标记为到期。若首次调用umount2()时指定了该标志,且挂载点处于空闲状态,返回EAGAIN错误,标记挂载点为到期。如果挂载点处于在用状态,返回EBUSY错误,但不会标记过期。在标记为到期状态后,只要无任何后续进程发起对该挂载点的访问,该挂载点将会一直保持到期状态。再度调用umount2()时,如指定了MNT_EXPIRE标志,将卸载到期的挂载点。这就提供了一种机制,来卸载某段时间内未用的文件系统。该标志不能与MNT_DETACH或MNT_FORCE标志一并使用。
 MNT_FORCE 只对NFS挂载有效,即便文件系统处于在用状态,依然将其强行卸载,可能造成数据丢失。
 UMOUNT_NOFOLLOW 始于linux 2.6.34,若target为符号链接,则不对其进行解引用。该标志专为set-user-ID-root程序而设计。因为此类程序允许非特权用户卸载,意在避免安全性问题的发生。


在多个挂载点挂载文件系统
在内核版本2.4之前,一个文件系统只能挂载于单个挂载点。从内核2.4开始,允许多个挂载点。

#创建2个目录
mkdir /testfs
mkdir /demo

#挂载
mount /dev/sda12 /testfs
mount /dev/sda12 /demo

#校验
mount | grep sda12 Verify the setup
#/dev/sda12 on /testfs type ext3 (rw)
#/dev/sda12 on /demo type ext3 (rw)

#在/testfs里新建文件,/demo里也能看到
touch /testfs/myfile
ls /demo
#lost+found myfile


多次挂载同一挂载点(堆叠挂载)
在内核版本2.4之前,一个挂载点只能使用一次。从内核2.4开始,允许针对同一挂载点执行多次挂载。每次挂载会叠加,然后隐藏之前的目录。卸载最后一次挂载,那么前一次的目录会显示出来。

mount /dev/sda12 /testfs
touch /testfs/myfile

#叠加挂载,那么sda12分区的内容将隐藏,sda13分区内容显示
mount /dev/sda13 /testfs
mount | grep testfs Verify the setup

#/dev/sda12 on /testfs type ext3 (rw)
#/dev/sda13 on /testfs type reiserfs (rw)272 Chapter 14

touch /testfs/newfile
ls /testfs View files in this subtree
#newfile

#卸载sda13分区,那么之前的sda12分区的内容就会再次显示
umount /testfs
mount | grep testfs
#/dev/sda12 on /testfs type ext3 (rw) Now only one mount on /testfs

ls /testfs Previous mount is now visible
#lost+found myfile

在现有且在用的挂载点上执行新的挂载操作是此类叠加挂载的用法之一。持有打开文件描述符的进程、建立chroot监禁区(jail)的进程,以及工作目录位于老挂载点之下的进程将继续在旧有的挂载下运行。而针对挂载点发起的新访问的进程将使用新挂载。结合MNT_DETACH标志下的unmount操作,则无需将文件系统置为单用户模式,即可为其提供平滑迁移。

不同挂载点设置不同的挂载标志

mount /dev/sda12 /testfs
mount -o noexec /dev/sda12 /demo
cat /proc/mounts | grep sda12
#/dev/sda12 /testfs ext3 rw 0 0
#/dev/sda12 /demo ext3 rw,noexec 0 0

cp /bin/echo /testfs
/testfs/echo "Art is something which is well done"
#Art is something which is well done

#由于设置了noexec标志,所以该挂载点不允许执行文件
/demo/echo "Art is something which is well done"
#bash: /demo/echo: Permission denied

绑定挂载
内核从2.4开始,linux支持了创建绑定挂载。绑定挂载(由MS_BIND标志的mount()的调用来创建)是指文件系统目录层级的另一处挂载目录或文件。这将导致文件或目录在两处同时可见。类似于硬链接,但存在2处差异:

1.绑定挂载可以跨越多个文件系统挂载点,甚至不拘于chroot监禁区。
2.可针对目录执行绑定挂载。

下面这个例子在另一处绑定挂载了一个目录,并展示了在一处目录中所创建的文件,对另一处目录同样可见。


pwd    #查看当前所在的目录
#/testfs

mkdir d1
touch d1/x

mkdir d2
mount --bind d1 d2
ls d2
#x

touch d2/y Create second file in directory d2
ls d1 Verify that this change is visible via d1
#x y


第二个例子会在另一处挂载文件,并展示了在一处挂在下,可以看见另一处挂载下对文件所做的改变。

echo 'http://www.freecls.com' > f1
touch f2
mount --bind f1 f2

cat f2
#http://www.freecls.com

echo 'freecls' >> f2
cat f1
#http://www.freecls.com
#freecls

mount -l | grep f2
#/dev/sda3 on /root/f2 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

rm -f f2
#rm: cannot remove ‘f2’: Device or resource busy

umount f2
rm -f f2

绑定挂载的应用场景之一是创建chroot监禁区。将会在目录与链接这一文来讲解。

递归绑定挂载
默认情况下,如果使用MS_BIND为某个目录创建了绑定挂载,那么只会将该目录挂载到新位置。假设源目录下还存在子挂载,则不会将这些子挂载复制到target之下。linux2.4.11添加了MS_REC标志,若与MS_BIND并存作为标志传递个mount(),则会将子挂载复制到挂载目标下。mount(8)命令 --rbind 选项完成相同的任务。

mkdir top
mkdir src1
touch src1/aaa
mount --bind src1 top
mkdir top/sub
mkdir src2
touch src2/bbb
mount --bind src2 top/sub
find top

:<<eof

top
top/aaa
top/sub This is the submount
top/sub/bbb

eof

现在以top作为源目录,另行创建挂载dir1,由于属于非递归操作,新挂载不会复制子挂载。

mkdir dir1
mount --bind top dir1
find dir1

#输出如下
dir1
dir1/aaa
dir1/sub

输出中并未发现dir1/sub/bbb,这表明并未复制子挂载。再以top作为源目录来创建递归绑定挂载。

mkdir dir2
mount --rbind top dir2
find dir2

#输出如下
dir2
dir2/aaa
dir2/sub
dir2/sub/bbb

从输出可以看出,已经复制了子挂载。


虚拟内存文件系统:tmpfs

到目前为止,本章己论及的所有文件系统均驻留在磁盘之上。然而, Linux 同样支持驻留于内存中的虚拟文件系统。对应用程序来说,此类文件系统看起来与任何其他文件系统别无二致--可施以相同操作( open()、read()、write()、 link() 、mkdir()等.不过,二者之间还是存在一个重要差别:由于不涉及磁盘访问,虚拟文件系统的文件操作速度极快。

在Linux上,己经开发出了林林总总基于内存的文件系统。迄今为止,其中最为复杂的则非 tmpfs 文件系统莫属,该系统在 Linux2.4中首度出现。较之于其他基于内存的文件系统,其独特之处在于它属于虚拟内存文件系统。这意味着,该文件系统不但使用 RAM ,而且在 RAM 耗尽的情况下,还会利用交换空间。(虽然此处描述的tmpfs文件系统为 Linux 所专有,但大多数 UNIX 实现都提供某种形式的基于内存的文件系统。

要创建tmpfs文件系统,请使用如下形式的命令:

mount -t tmpfs source target

 其中source 可以是任意名称,其唯一的意义是在/proc/mounts中显示一下,并通过 mount 和 df 命令显示出来。与往常一样,target是该文件系统的挂载点。请注意,无需使用mkfs预先创建一个文件系统,内核会将此视为 mount()系统调用的一部分自动加以执行。

作为使用tmpfs的例子之一,可采用叠加挂载(无需估计/tmp目录目前是否处于在用状态)。

mount -t tmpfs test /tmp
mount -l | grep test
#test on /tmp type tmpfs (rw,relatime,seclabel)

umount /tmp

有时候会使用如上命令来改善应用程序,比如编译器的性能,此类应用程序因需要创建临时性文件而频繁使用/tmp目录。

默认情况下,允许将tmpfs文件系统的大小提高到RAM 容量的一半,当然也可以在挂载时手动指定,mount size=nbytes来设置。

一旦卸载tmpfs文件系统或者遭遇到系统崩溃,那么数据将丢失。tmpfs正是因此得名。
除了用户用户应用程序外,tmpfs文件系统还有以下两个特殊用途。

1.由内核内部挂载的隐形tmpfs文件系统,用户实现system v共享内存和共享匿名内存映射。
2.挂载于/dev/shm的tmpfs文件系统,为glibc用以实现POSIX共享内存和POSIX信号量。

获得与文件系统有关的信息

利用statvfs 系统调用可以获取到文件系统的使用情况(磁盘空间的使用情况)。

#include <sys/statvfs.h>

struct statvfs {
    unsigned long f_bsize; /* File-system block size (in bytes) */
    unsigned long f_frsize; /* Fundamental file-system block size(in bytes) */
    fsblkcnt_t f_blocks; /* Total number of blocks in file
    system (in units of 'f_frsize') */
    fsblkcnt_t f_bfree; /* Total number of free blocks */
    fsblkcnt_t f_bavail; /* Number of free blocks available to
    unprivileged process */
    fsfilcnt_t f_files; /* Total number of i-nodes */
    fsfilcnt_t f_ffree; /* Total number of free i-nodes */
    fsfilcnt_t f_favail; /* Number of i-nodes available to unprivileged process (set to 'f_ffree' on Linux) */
    unsigned long f_fsid; /* File-system ID */
    unsigned long f_flag; /* Mount flags */
    unsigned long f_namemax; /* Maximum length of filenames on this file system */
};

int statvfs(const char *pathname, struct statvfs *statvfsbuf);
int fstatvfs(int fd, struct statvfs *statvfsbuf);
//Both return 0 on success, or –1 on error


statfs例子

#include <sys/statfs.h>
#include <stdio.h>

int
main(int argc, char *argv[]){
    struct statfs sfs;

    if (argc != 2 || strcmp(argv[1], "--help") == 0){
        printf("%s path\n", argv[0]);
        return 1;
    }

    if (statfs(argv[1], &sfs) == -1){
        printf("statfs");
        return 1;
    }

    printf("File system type:              %#lx\n",
            (unsigned long) sfs.f_type);
    printf("Optimal I/O block size:        %lu\n",
            (unsigned long) sfs.f_bsize);
    printf("Total data blocks:             %lu\n",
            (unsigned long) sfs.f_blocks);
    printf("Free data blocks:              %lu\n",
            (unsigned long) sfs.f_bfree);
    printf("Free blocks for nonsuperuser:  %lu\n",
            (unsigned long) sfs.f_bavail);
    printf("Total i-nodes:                 %lu\n",
            (unsigned long) sfs.f_files);
    printf("File system ID:                %#x, %#x\n",
            (unsigned) sfs.f_fsid.__val[0], (unsigned) sfs.f_fsid.__val[1]);
    printf("Free i-nodes:                  %lu\n",
            (unsigned long) sfs.f_ffree);
    printf("Maximum file name length:      %lu\n",
            (unsigned long) sfs.f_namelen);

    return 0;
}
./a.out /boot

#输出如下
File system type:              0x58465342
Optimal I/O block size:        4096
Total data blocks:             259584
Free data blocks:              226044
Free blocks for nonsuperuser:  226044
Total i-nodes:                 524288
File system ID:                0x801, 0
Free i-nodes:                  523958
Maximum file name length:      255

df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1        1038336  134160    904176  13% /boot

df -i
Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/sda1       524288   330  523958    1% /boot

df显示的块数有1038336个1K的块,而上面显示的是259584个4k的块,大小是一样的。

statvfs例子 

#include <sys/statvfs.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
    struct statvfs sb;

    if (argc != 2 || strcmp(argv[1], "--help") == 0){
        printf("%s path\n", argv[0]);
        return 1;
    }
        

    if (statvfs(argv[1], &sb) == -1){
        printf("statvfs");
        return 1;
    }
        

    printf("Block size                       %lu\n", sb.f_bsize);
    printf("Fundamental block size           %lu\n", sb.f_frsize);
    printf("Total blocks (in above units)    %lu\n",
            (unsigned long) sb.f_blocks);
    printf("Free blocks for priv. proc.      %lu\n",
            (unsigned long) sb.f_bfree);
    printf("Free blocks for unpriv. proc.    %lu\n",
            (unsigned long) sb.f_bavail);
    printf("Total number of i-nodes          %lu\n",
            (unsigned long) sb.f_files);
    printf("Free i-nodes for priv. proc.     %lu\n",
            (unsigned long) sb.f_ffree);
    printf("Free i-nodes for nonpriv. proc.  %lu\n",
            (unsigned long) sb.f_favail);
    printf("File system ID                   %#lx\n", sb.f_fsid);
    printf("Flags                            %#lx\n", sb.f_flag);
    printf("Maximum filename length          %lu\n", sb.f_namemax);

    return 0;
}
./a.out /boot

#输出如下
Block size                       4096
Fundamental block size           4096
Total blocks (in above units)    259584
Free blocks for priv. proc.      226044
Free blocks for unpriv. proc.    226044
Total number of i-nodes          524288
Free i-nodes for priv. proc.     523958
Free i-nodes for nonpriv. proc.  523958
File system ID                   0x801
Flags                            0x1000
Maximum filename length          255


总结

本文对linux挂载相关知识做了详细的介绍,如果有疑问可以给我留言。


备注
1.编译器版本gcc4.8,运行环境centos7 64位
2.原文地址http://www.freecls.com/a/2712/35

©著作权归作者所有
收藏
推荐阅读
  • err
    linux文件io缓冲

    出于速度和效率考虑,系统io调用(即内核)和标准 C语言库的io函数(即 stdin 函数)在操作磁盘文件时会对数据进行缓冲。read(),write()系统调用在操作磁...

  • err
    linux系统和进程信息(/proc)

    为了更方便的访问内核信息,许多现代的unix实现提供了/proc虚拟文件系统。其包含的文件和子目录并未存储在磁盘上,而是由内核进程访问此类信息动态的创建而成,都存储在内存...

  • err
    linux c时间

    日历时间#include &lt;sys/time.h&gt; struct timeval{ time_t tv_sec; /*自1970-01...

  • linux进程凭证(权限)

    每个进程都有一套用数字表示的用户id和组id,这些id决定了进程执行时具体的权限。实际用户id和实际组id这2个id决定了进程所属的用户和组。假设我们用root用户登录,那么我们在shell中创建的新...

  • linux用户和组

    linux上每个用户都拥有一个唯一的用户名和一个相对应的用户id(uid),用户可以隶属于一个或多个组。每个组也拥有一个唯一的组名和组id(gid)。用户和组主要是用来控制资源访问权限的。记录用户相关...

  • nginx模块 ngx_http_headers_module

    ngx_http_headers_module 模块是用来增加 Expires 和 Cache-control,或者是任意的响应头。Syntax: add_header name value [alw...

  • nginx模块 ngx_http_gunzip_module、ngx_http_gzip_module、ngx_http_gzip_static_module

    ngx_http_gunzip_module 模块将文件解压缩后并在响应头加上 "Content-Encoding: gzip" 返回给客户端。为了解决客户端不支持gzip压缩。编译的时候带上 --w...

  • nginx模块 ngx_http_flv_module、ngx_http_mp4_module

    ngx_http_flv_module模块提供了对 flv 视频的伪流支持。编译的时候带上 --with-http_flv_module。它会根据指定的 start 参数来指定跳过多少字节,并在返回数...

  • nginx模块 ngx_http_fastcgi_module

    ngx_http_fastcgi_module 模块使得nginx可以与 fastcgi 服务器通信。比如目前要使得 nginx 支持 php 就得使用 fastcgi技术,在服务器上装上 nginx...

  • nginx模块 ngx_http_autoindex_module

    ngx_http_autoindex_module 模块可以将uri以 / 结尾时,列出里面的文件和目录。Syntax: autoindex on | off; Default: autoindex ...

简介
天降大任于斯人也,必先苦其心志。