linux里read amount read是什么意思思

linux(47)
c/c++(24)
嵌入式系统(15)
在linux下编写终端程序时,有规范模式 ,非规范模式(原始模式特殊的非规范模式)之分。不用于终端,而是在串口这种使用情况下,一般设置为原始模式(非规范的一种特殊情况)。但用read()函数,希望从串口接收指定的数量的字符时,往往接收到的实际字符数,都与指定的不同。如本人用read()希望接收
10 bytes的数据,但实验后发现,分了几次才接收到,俩次接收2bytes ,两次接收3bytes。
查阅相关资料得知:
一般地串口的读写模式有直接模式和缓存模式,在直接模式下,串口的读写都是单字节的,也就是说一次的read或write只能操作一个字节;
&&&&&&& 但是大部份串口芯片都支持缓存模式,缓存模式一般同时支持中断聚合和超时机制,也就是说在有数据时,当缓存满或者超时时间到时,都会触发读或写中断。写的时候可以将要操作的数据先搬到缓存里,然后启动写操作,芯片会自动将一连串的数据写出,在读的时候类似,一次读到的是串口芯片缓存里的数据。串口设备的缓存一般有限,一次能read到的最大字节数就是缓存的容量。所以串口芯片的缓存容量决定了你一次能收到的字节数。本人用一个usb转232来充当串口接收时,发现一次可以接收8个bytes。
&&&&&&& 对于具体一次传输多少字节也不去追究了,总之通讯过程中无法保证一次发送的数据肯定是一次接收的,所以必须写代码 来一次一次的接收,直到接收满足预定的为止,当然在此过程中得使用select/poll来避免超时接收。
即从通讯的角度来说,接受方必须自己解决如何识别一个祯的问题。
(操作串口相当于操作物理层,OSI/ISO模型中的第一层,解决祯同步问题是第二层的任务,所以我们需要自己搭一个第二层。
也就是说:我们需要通过定义通讯协议,规定数据的内容自己分析什么时候收完了一次需要的数据。因为通讯过程中无法保证一次发送的数据肯定是一次接收的)
下面来解决识别帧的问题:
&&&&&&&&&& 不是编写终端,我们一帮都采用原始模式;进行简单的串口编程,一般设置成阻塞模式,便可以了。但是在大多数应用场合,把串口设置成阻塞模式是很不实用的,如read()时,如果没有数据发来,这程序一直会阻塞在这里(除非用多线程)。因此一般把其设置为非阻塞模式。一般是需要用串口读取指定长度的数据,但是read函数实际读取的数据长度,往往会与指定的不同,所以必须自己编写一个读写N字节数据的函数:
&&&&&&&&&&&& 很快想到用个循环,但是循环中必须有 ‘即使一直没有收到指定长度的数据但在一定时间后也必须跳出循环’的机制,否则就与阻塞模式的没有区别了(也就是让函数一直等,等到指定长度数据接收为止)。参考下APUE的程序清单14-11的readn()函数,此函数看似很好,但是它不适合用于串口的读取,因为它一旦if(nread
= read(fd, ptr, nleft) & 0) 就立刻会跳出循环,没有丝毫的时间上的容限,而串口的接收必然没有这么快,如若波特率为1200,是比较慢的。俩个字节传输的间隔,其都会被判断为错误而跳出。当然该函数对于读写文件是非常好用的。
ssize_t&&&&&&&&&&&& /* Read &n& bytes from a descriptor& */
readn(int fd, void *ptr, size_t n)
&ssize_t&&
&while (nleft & 0) {
&&if ((nread = read(fd, ptr, nleft)) & 0) {
&&&if (nleft == n)
&&&&return(-1); /* error, return -1 */
&&&&&&&&& /* error, return amount read so far */
&&} else if (nread == 0) {
&&&&&&&&&&&& /* EOF */
&&nleft -=
&&ptr&& +=
&return(n - nleft);&&&&& /* return &= 0 */
&&&&&&&& 再次参考下APUE的tread() 和treadn()函数,这组函数结合了select函数,使得在放弃之前,有了个时间来阻塞。有了一定的时间容限。例如把select中的tv.tv_sec = 1;这样就不会把 原本正常的俩个字节的时间间隔,误判为错误了。
实际应用如:
某个串口通信协议一帧为10个字节,linux 必须接收1帧后去解析该帧的命令。波特率1200 。在linux中必须有个读取一帧数据的函数,该函数不能‘一直等待接收10个字节’,而必须在一定时间内没有收到完整的一帧就放弃该帧,这样才能防止对方发送错误或者通信中的错误带来的问题。
利用treadn()很好的配合该思路的实现。可以定时限为10ms。如果超过10ms(可以设置长点)这treadn()也会返回,这时判断如果实际收到的数据小于10,则丢弃即可。本人用1200的波特率,tv设置成了500us,工作的很好。
最后贴一个经典的串口编程基础:
1.串口操作需要的头文件
#include &stdio.h&&&&&&&&&&//标准输入输出定义
#include &stdlib.h&&&&&&&&&//标准函数库定义
#include &unistd.h&&&&&&&&//Unix标准函数定义
#include &sys/types.h&
#include &sys/stat.h&
#include &fcntl.h&&&&&&&&&& //文件控制定义
#include &termios.h&&&&&&//POSIX中断控制定义
#include &errno.h&&&&&&&&&//错误号定义
2.打开串口
串口位于/dev中,可作为标准文件的形式打开,其中:
串口1&/dev/ttyS0
串口2&/dev/ttyS1
代码如下:
fd&=&open(“/dev/ttyS0”,&O_RDWR);
if(fd&==&-1)
&&&&Perror(“串口1打开失败!”);
&&&&//fcntl(fd,&F_SETFL,&FNDELAY);
除了使用O_RDWR标志之外,通常还会使用O_NOCTTY和O_NDELAY这两个标志。
O_NOCTTY:告诉Unix这个程序不想成为“控制终端”控制的程序,不说明这个标志的话,任何输入都会影响你的程序。
O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。
3.设置波特率
最基本的串口设置包括波特率、校验位和停止位设置,且串口设置主要使用termios.h头文件中定义的termios结构,如下:
struct termios
&&&tcflag_t&&c_&&&//输入模式标志
&&&tcflag_t&&c_&&//输出模式标志
&&&tcflag_t&&c_&&//控制模式标志
&&&tcflag_t&&c_&& //本地模式标志
&&&cc_t&&&c_&&&&&&&&&&&&& //line discipline
&&&cc_t&&&c_cc[NCC];&&&&//control characters
代码如下:
int&speed_arr[]&=&{&B38400,&B19200,&B9600,&B4800,&B2400,&B1200,&B300,&B38400,&B19200,&B9600,&B4800,&B2400,&B1200,&B300,&};
int&name_arr[]&=&{38400,&19200,&9600,&4800,&2400,&1200,&300,&38400,&19200,&9600,&4800,&2400,&1200,&300,&};
void&SetSpeed(int&fd,&int&speed)
&&&&int&i;
&&&&struct&termios&O&&&&//定义termios结构
&&&&if(tcgetattr(fd,&&Opt)&!=&0)
&&&&&&&&perror(“tcgetattr&fd”);
&&&&&&&&return;
&&&&for(i&=&0;&i&&&sizeof(speed_arr)&/&sizeof(int);&i++)
&&&&&&&&if(speed&==&name_arr[i])
&&&&&&&&&&&&tcflush(fd,&TCIOFLUSH);
&&&&&&&&&&&&cfsetispeed(&Opt,&speed_arr[i]);
&&&&&&&&&&&&cfsetospeed(&Opt,&speed_arr[i]);
&&&&&&&&&&&&if(tcsetattr(fd,&TCSANOW,&&Opt)&!=&0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&perror(“tcsetattr&fd”);
&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&}
&&&&&&&&&&&&tcflush(fd,&TCIOFLUSH);
注意tcsetattr函数中使用的标志:
TCSANOW:立即执行而不等待数据发送或者接受完成。
TCSADRAIN:等待所有数据传递完成后执行。
TCSAFLUSH:Flush input and output buffers and make the change
4.设置数据位、停止位和校验位
以下是几个数据位、停止位和校验位的设置方法:(以下均为1位停止位)
8位数据位、无校验位:
Opt.c_cflag &= ~PARENB;
Opt.c_cflag &= ~CSTOPB;
Opt.c_cflag &= ~CSIZE;
Opt.c_cflag |= CS8;
7位数据位、奇校验:
Opt.c_cflag |= PARENB;
Opt.c_cflag |= PARODD;
Opt.c_cflag &= ~CSTOPB;
Opt.c_cflag &= ~CSIZE;
Opt.c_cflag |= CS7;
7位数据位、偶校验:
Opt.c_cflag |= PARENB;
Opt.c_cflag &= ~PARODD;
Opt.c_cflag &= ~CSTOPB;
Opt.c_cflag &= ~CSIZE;
Opt.c_cflag |= CS7;
7位数据位、Space校验:
Opt.c_cflag &= ~PARENB;
Opt.c_cflag &= ~CSTOPB;
Opt.c_cflag &= ~CSIZE;
Opt.c_cflag |= CS7;
代码如下:
int&SetParity(int&fd,&int&databits,&int&stopbits,&int&parity)
&&&&struct&termios&O
&&&&if(tcgetattr(fd,&&Opt)&!=&0)
&&&&&&&&perror(&tcgetattr&fd&);
&&&&&&&&return&FALSE;
&&&Opt.c_cflag&|=&(CLOCAL&|&CREAD);&&&&&&&&//一般必设置的标志
&&&&switch(databits)&&&&&&&&//设置数据位数
&&&&case&7:
&&&&&&&&Opt.c_cflag&&=&~CSIZE;
&&&&&&&&Opt.c_cflag&|=&CS7;
&&&&&&&&break;
&&&&case&8:
&&&&&&&&Opt.c_cflag&&=&~CSIZE;
&&&&&&&&Opt.c_cflag&|=&CS8;
&&&&default:
&&&&&&&&fprintf(stderr,&&Unsupported&data&size.\n&);
&&&&&&&&return&FALSE;
&&&&switch(parity)&&&&&&&&&&&&//设置校验位
&&&&case&'n':
&&&&case&'N':
&&&&&&&&Opt.c_cflag&&=&~PARENB;&&&&&&&&//清除校验位
&&&&&&&&Opt.c_iflag&&=&~INPCK;&&&&&&&&//enable&parity&checking
&&&&&&&&break;
&&&&case&'o':
&&&&case&'O':
&&&&&&&&Opt.c_cflag&|=&PARENB;&&&&&&&&//enable&parity
&&&&&&&&Opt.c_cflag&|=&PARODD;&&&&&&&&//奇校验
&&&&&&&&Opt.c_iflag&|=&INPCK&&&&&&&&&&&&//disable&parity&checking
&&&&&&&&break;
&&&&case&'e':
&&&&case&'E':
&&&&&&&&Opt.c_cflag&|=&PARENB;&&&&&&&&//enable&parity
&&&&&&&&Opt.c_cflag&&=&~PARODD;&&&&&&&&//偶校验
&&&&&&&&Opt.c_iflag&|=&INPCK;&&&&&&&&&&&&//disable&pairty&checking
&&&&&&&&break;
&&&&case&'s':
&&&&case&'S':
&&&&&&&&Opt.c_cflag&&=&~PARENB;&&&&&&&&//清除校验位
&&&&&&&&Opt.c_cflag&&=&~CSTOPB;&&&&&&&&//??????????????
&&&&&&&&Opt.c_iflag&|=&INPCK;&&&&&&&&&&&&//disable&pairty&checking
&&&&&&&&break;
&&&&default:
&&&&&&&&fprintf(stderr,&&Unsupported&parity.\n&);
&&&&&&&&return&FALSE;&&&&
&&&&switch(stopbits)&&&&&&&&//设置停止位
&&&&case&1:
&&&&&&&&Opt.c_cflag&&=&~CSTOPB;
&&&&&&&&break;
&&&&case&2:
&&&&&&&&Opt.c_cflag&|=&CSTOPB;
&&&&&&&&break;
&&&&default:
&&&&&&&&fprintf(stderr,&&Unsupported&stopbits.\n&);
&&&&&&&&return&FALSE;
&&&&opt.c_cflag&|=&(CLOCAL&|&CREAD);
&&&&opt.c_lflag&&=&~(ICANON&|&ECHO&|&ECHOE&|&ISIG);
&&&&opt.c_oflag&&=&~OPOST;
&&&&opt.c_oflag&&=&~(ONLCR&|&OCRNL);&&&&//添加的
&&&&opt.c_iflag&&=&~(ICRNL&|&INLCR);
&&&&opt.c_iflag&&=&~(IXON&|&IXOFF&|&IXANY);&&&&//添加的
&&&&tcflush(fd,&TCIFLUSH);
&&&&Opt.c_cc[VTIME]&=&0;&&&&&&&&//设置超时为15sec
&&&&Opt.c_cc[VMIN]&=&0;&&&&&&&&//Update&the&Opt&and&do&it&now
&&&&if(tcsetattr(fd,&TCSANOW,&&Opt)&!=&0)
&&&&&&&&perror(&tcsetattr&fd&);
&&&&&&&&return&FALSE;
&&&&return&TRUE;
5.某些设置项
在第四步中我们看到一些比较特殊的设置,下面简述一下他们的作用。
c_cc数组的VSTART和VSTOP元素被设定成DC1和DC3,代表ASCII标准的XON和XOFF字符,如果在传输这两个字符的时候就传不过去,需要把软件流控制屏蔽,即:
Opt.c_iflag &= ~ (IXON | IXOFF | IXANY);
有时候,在用write发送数据时没有键入回车,信息就发送不出去,这主要是因为我们在输入输出时是按照规范模式接收到回车或换行才发送,而更多情况下我们是不必键入回车或换行的。此时应转换到行方式输入,不经处理直接发送,设置如下:
Opt.c_lflag &= ~ (ICANON | ECHO | ECHOE | ISIG);
还存在这样的情况:发送字符0X0d的时候,往往接收端得到的字符是0X0a,原因是因为在串口设置中c_iflag和c_oflag中存在从NL-CR和CR-NL的映射,即串口能把回车和换行当成同一个字符,可以进行如下设置屏蔽之:
Opt.c_iflag &= ~ (INLCR | ICRNL | IGNCR);
Opt.c_oflag &= ~(ONLCR | OCRNL);
6.读写串口
发送数据方式如下,write函数将返回写的位数或者当错误时为-1。
char buffer[1024];
nByte = write(fd, buffer, length);
读取数据方式如下,原始数据模式下每个read函数将返回实际串口收到的字符数,如果串口中没有字符可用,回叫将会阻塞直到以下几种情况:有字符进入;一个间隔计时器失效;错误发送。
在打开串口成功后,使用fcntl(fd, F_SETFL, FNDELAY)语句,可以使read函数立即返回而不阻塞。FNDELAY选项使read函数在串口无字符时立即返回且为0。
char buffer[1024];
readByte = read(fd, buffer, len);
注意:设置为原始模式传输数据的话,read函数返回的字符数是实际串口收到的字符数。Linux下直接用read读串口可能会造成堵塞,或者数据读出错误,此时可使用tcntl或者select等函数实现异步读取。用select先查询com口,再用read去读就可以避免上述错误。
7.关闭串口
串口作为文件来处理,所以一般的关闭文件函数即可:
close(fd);
这个例子中,需要打开串口1,设置9600波特率、8位数据位、1位停止位以及空校验,之后利用while语句循环判断串口中是否可以读出数据,将串口中数据连续读出后重新写回到串口中。
该程序可与minicom联合测试。
#include&&&&&&stdio.h&
#include&&&&&&stdlib.h&&
#include&&&&&&unistd.h&&&
#include&&&&&&sys/types.h&
#include&&&&&&sys/stat.h&
#include&&&&&&fcntl.h&&
#include&&&&&&termios.h&
#include&&&&&&errno.h&
&&&&int&i;
&&&&int&n&=&0;&&&&&&
&&&&char&read_buf[256];
&&&&char&write_buf[256];
&&&&struct&termios&&
&&&&fd&=&open(&/dev/ttyS0&,&O_RDWR&|&O_NOCTTY);&&&&//默认为阻塞读方式
&&&&if(fd&==&-1)
&&&&&&&&perror(&open&serial&0\n&);
&&&&&&&&exit(0);
&&&&tcgetattr(fd,&&opt);&&&&&&
&&&&cfsetispeed(&opt,&B9600);
&&&&cfsetospeed(&opt,&B9600);
&&&&if(tcsetattr(fd,&TCSANOW,&&opt)&!=&0&)
&&&&{&&&&&
&&&&&&&perror(&tcsetattr&error&);
&&&&&&&return&-1;
&&&&opt.c_cflag&&=&~CSIZE;&&
&&&&opt.c_cflag&|=&CS8;&&&
&&&&opt.c_cflag&&=&~CSTOPB;&
&&&&opt.c_cflag&&=&~PARENB;&
&&&&opt.c_cflag&&=&~INPCK;
&&&&opt.c_cflag&|=&(CLOCAL&|&CREAD);
&&&&opt.c_lflag&&=&~(ICANON&|&ECHO&|&ECHOE&|&ISIG);
&&&&opt.c_oflag&&=&~OPOST;
&&&&opt.c_oflag&&=&~(ONLCR&|&OCRNL);&&&&//添加的
&&&&opt.c_iflag&&=&~(ICRNL&|&INLCR);
&&&&opt.c_iflag&&=&~(IXON&|&IXOFF&|&IXANY);&&&&//添加的
&&&&opt.c_cc[VTIME]&=&0;
&&&&opt.c_cc[VMIN]&=&0;
&&&&tcflush(fd,&TCIOFLUSH);
&&&&printf(&configure&complete\n&);
&&&&if(tcsetattr(fd,&TCSANOW,&&opt)&!=&0)
&&&&&&&&perror(&serial&error&);
&&&&&&&&return&-1;
&&&&printf(&start&send&and&receive&data\n&);
&&&&while(1)
&&&&&&&&n&=&0;
&&&&&&&&len&=&0;
&&&&&&&&bzero(read_buf,&sizeof(read_buf));&&&&//类似于memset
&&&&&&&&bzero(write_buf,&sizeof(write_buf));
&&&&&&&&while(&(n&=&read(fd,&read_buf,&sizeof(read_buf)))&&&0&)
&&&&&&&&&&&&for(i&=&&i&&&(len&+&n);&i++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&write_buf[i]&=&read_buf[i&-&len];
&&&&&&&&&&&&}
&&&&&&&&&&&&len&+=&n;
&&&&&&&&write_buf[len]&=&'\0';
&&&&&&&&&&&&&&
&&&&&&&&printf(&Len&%d&\n&,&len);
&&&&&&&&printf(&%s&\n&,&write_buf);
&&&&&&&&n&=&write(fd,&write_buf,&len);
&&&&&&&&printf(&write&%d&chars\n&,n);
&&&&&&&&sleep(2);
c_cflag用于设置控制参数,除了波特率外还包含以下内容:&
EXTA&&&&&&&&&External rate clock
EXTB&&&&&&&&&External rate clock
CSIZE&&&&&&&&&Bit mask for data bits
CS5&&&&&&&&&5个数据位
CS6&&&&&&&&&6个数据位
CS7&&&&&&&&&7个数据位
CS8&&&&&&&&&8个数据位
CSTOPB&&&&&&&&&2个停止位(清除该标志表示1个停止位
PARENB&&&&&&&&&允许校验位
PARODD&&&&&&&&&使用奇校验(清除该标志表示使用偶校验)
CREAD&&&&&&&&&Enable receiver
HUPCL&&&&&&&&&Hangup (drop DTR) on last close
CLOCAL&&&&&&&&&Local line – do not change “owner” of port
LOBLK&&&&&&&&&Block job control outpu
c_cflag标志可以定义CLOCAL和CREAD,这将确保该程序不被其他端口控制和信号干扰,同时串口驱动将读取进入的数据。CLOCAL和CREAD通常总是被是能的。
c_lflag用于设置本地模式,决定串口驱动如何处理输入字符,设置内容如下:
ISIG&&&&&&&&&&&&Enable SIGINTR, SIGSUSP, SIGDSUSP, and SIGQUIT signals&
ICANON&&&&&&&&&Enable canonical input (else raw)&
XCASE&&&&&&&&&Map uppercase \lowercase (obsolete)&
ECHO&&&&&&&&&Enable echoing of input characters&
ECHOE&&&&&&&&&Echo erase character as BS-SP-BS&
ECHOK&&&&&&&&&Echo NL after kill character&
ECHONL&&&&&&&&&Echo NL&
NOFLSH&&&&&&&&&Disable flushing of input buffers after interrupt or quit characters&
IEXTEN&&&&&&&&&Enable extended functions&
ECHOCTL&&&&&&&&&Echo control characters as ^char and delete as ~?&
ECHOPRT&&&&&&&&&Echo erased character as character erased&
ECHOKE&&&&&&&&&BS-SP-BS entire line on line kill&
FLUSHO&&&&&&&&&Output being flushed&
PENDIN&&&&&&&&&Retype pending input at next read or input char&
TOSTOP&&&&&&&&&Send SIGTTOU for background output
c_iflag用于设置如何处理串口上接收到的数据,包含如下内容:
INPCK&&&&&&&&&Enable parity check&
IGNPAR&&&&&&&&&Ignore parity errors&
PARMRK&&&&&&Mark parity errors&
ISTRIP&&&&&&&&&Strip parity bits&
IXON&&&&&&&&&Enable software flow control (outgoing)&
IXOFF&&&&&&&&&Enable software flow control (incoming)&
IXANY&&&&&&&&&Allow any character to start flow again&
IGNBRK&&&&&&&&&Ignore break condition&
BRKINT&&&&&&&&&Send a SIGINT when a break condition is detected&
INLCR&&&&&&&&&Map NL to CR&
IGNCR&&&&&&&&&Ignore CR&
ICRNL&&&&&&&&&Map CR to NL&
IUCLC&&&&&&&&&Map uppercase to lowercase&
IMAXBEL&&&&&&Echo BEL on input line too long
c_oflag用于设置如何处理输出数据,包含如下内容:
OPOST&&&&&&&&&Postprocess output (not set = raw output)&
OLCUC&&&&&&&&&Map lowercase to uppercase&
ONLCR&&&&&&&&&Map NL to CR-NL&
OCRNL&&&&&&&&&Map CR to NL&
NOCR&&&&&&&&&No CR output at column 0&
ONLRET&&&&&&NL performs CR function&
OFILL&&&&&&&&&Use fill characters for delay&
OFDEL&&&&&&&&&Fill character is DEL&
NLDLY&&&&&&&&&Mask for delay time needed between lines&
NL0&&&&&&&&&&&&No delay for NLs&
NL1&&&&&&&&&&&&Delay further output after newline for 100 milliseconds&
CRDLY&&&&&&Mask for delay time needed to return carriage to left column&
CR0&&&&&&&&&&&&No delay for CRs&
CR1&&&&&&&&&&&&Delay after CRs depending on current column position&
CR2&&&&&&&&&&&&Delay 100 milliseconds after sending CRs&
CR3&&&&&&&&&&&&Delay 150 milliseconds after sending CRs&
TABDLY&&&&&&Mask for delay time needed after TABs&
TAB0&&&&&&&&&&&&No delay for TABs&
TAB1&&&&&&&&&Delay after TABs depending on current column position&
TAB2&&&&&&&&&Delay 100 milliseconds after sending TABs&
TAB3&&&&&&&&&Expand TAB characters to spaces&
BSDLY&&&&&&Mask for delay time needed after BSs&
BS0&&&&&&&&&No delay for BSs&
BS1&&&&&&&&&Delay 50 milliseconds after sending BSs&
VTDLY&&&&&&Mask for delay time needed after VTs&
VT0&&&&&&&&&No delay for VTs&
VT1&&&&&&&&&Delay 2 seconds after sending VTs&
FFDLY&&&&&&Mask for delay time needed after FFs&
FF0&&&&&&&&&No delay for FFs&
FF1&&&&&&&&&Delay 2 seconds after sending FFs
c_cc定义了控制字符,包含以下内容:
VINTR&&Interrupt&&CTRL-C&
VQUIT&&Quit &&&CTRL-Z&
VERASE &&Erase &&&Backspace (BS)&
VKILL &&Kill-line &&CTRL-U&
VEOF &&End-of-file &&CTRL-D&
VEOL &&End-of-line &&Carriage return (CR)&
VEOL2 &&Second &&&end-of-line Line feed (LF)&
VMIN &&Minimum number of characters to read &
VSTART &&Start flow &&CTRL-Q (XON)&
VSTOP &&Stop flow &&CTRL-S (XOFF)&
VTIME &&Time to wait for data (tenths of seconds)&
注意:控制符VTIME和VMIN之间有复杂的关系。VTIME定义要求等待的时间(百毫米,通常是unsigned char变量),而VMIN定义了要求等待的最小字节数(相比之下,read函数的第三个参数指定了要求读的最大字节数)。
如果VTIME=0,VMIN=要求等待读取的最小字节数,read必须在读取了VMIN个字节的数据或者收到一个信号才会返回。
如果VTIME=时间量,VMIN=0,不管能否读取到数据,read也要等待VTIME的时间量。
如果VTIME=时间量,VMIN=要求等待读取的最小字节数,那么将从read读取第一个字节的数据时开始计时,并会在读取到VMIN个字节或者VTIME时间后返回。
如果VTIME=0,VMIN=0,不管能否读取到数据,read都会立即返回。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13602次
排名:千里之外
原创:30篇
转载:43篇
(3)(7)(6)(4)(5)(6)(4)(1)(1)(1)(2)(7)(1)(4)(2)(4)(12)(2)(1)(5)shalou1993 的BLOG
用户名:shalou1993
文章数:89
访问量:12741
注册日期:
阅读量:5863
阅读量:12276
阅读量:348270
阅读量:1047724
51CTO推荐博文
大纲一、硬盘物理结构及相关结构二、硬盘逻辑结构及相关概念三、Ext2文件系统逻辑结构四、读取、创建、删除、复制、剪切过程五、软链接与硬链接联系与区别六、虚拟文件系统六、文件系统管理相关命令一、硬盘物理结构及相关概念1.硬盘内部视角实物图2.硬盘内部视角逻辑图3.扇区、磁道、柱面图&&&磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头,实现数据的存取&磁道(track):当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道,从外边缘的0开始编号,根据磁化方向来存数数据0和1柱面(cylinder):不同盘片的相同编号的磁道构成的圆柱面就被称之为柱面,磁盘的柱面数与一个盘面上的磁道数是相等的扇区(sector):每个磁道都别切分成很多扇形区域,每个磁道的扇区数量相同,每个扇区大小为512字节圆盘(platter):就是硬盘的盘片,为实现大容量,一般都是多个硬盘的容量=柱面数×磁头数×扇区数×512(字节数)二、硬盘逻辑结构及相关概念1.整体逻辑结构图2.MBR(Master Boot Record)硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成:硬盘主引导程序(BootLoader)、硬盘分区表DPT(Disk Partition table)和魔数(Magic Number)。Boot Loader:主引导程序,启动操作系统的一段代码,占446个字节DPT:占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中Magic Number:占2个字节,固定为0xAA55或0x55AA,这取决于处理器类型,如果是小端模式处理器(如Intel系列),则该值为0xAA55;如果是大端模式处理器(如Motorola6800),则该值为0x55AA3.主分区、扩展分区、逻辑分区示意图①主分区+扩展分区&=4②扩展分区最多只有一个③要么是三主一扩展,要么是四个主分区,那么剩余未分区的空间将无法使用4.Ext2文件系统逻辑结构一个分区最开始处是Boot Sector,然后就是多个块组每个块组又可以细分为如下组成部分:Super Block:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;由于super block很重要 ,在每个 block group都会存一份进行备份.GDT:Group Descriptor Table,块组描述符,由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝Block Bitmap:块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用inode Bitmap:和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用inode Table:一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls-l命令看到的那些信息,这些信息存在inode中而不是数据块中,每个文件都有一个inode,一个块组中的所有inode组成了inode表,inode表占多少个块在格式化时就要决定并写入块组描述符中Data Blocks:对于常规文件,文件的数据存储在数据块中,对于目录,该目录下的所有文件名和目录名存储在数据块中,文件名保存在它所在目录的数据块中,除文件名之外,ls -l命令看到的其它信息都保存在该文件的inode中,目录也是一种文件,是一种特殊类型的文件,对于符号链接,如果目标路径名较短则直接保存在inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存设备文件、FIFO和socket等特殊文件没有数据块,设备文件的主设备号和次设备号保存在inode中Inode Table目录文件注:①其实文件名和文件类型都是在目录中存放,而文件的其他元数据信息则是在Inode中存放②文件系统各分区之间物理视角上是并行的,逻辑视角上必须得有上下级关系,所有的文件都必须直接或间接从根开始四、读取、创建、删除、复制、剪切过程1、读取文件:例如/etc/httpd/httpd.conf首先根是自引用的,也就是根的Inode号是已知的,再根据Inode Table可以知道根的Inode号对应的Block号,然后找到对应的block,block里面有个目录项,也即Dentry,每个目录项记录了根下所有直接子目录的Inode与文件名的对应关系(也包括文件类型等),例如var对应的Inode号为2883585,etc对应的Inode号为1507329等等,此时找到etc文件对应的Inode号,再通过查找Inode Table可以得知etc文件对应的Block,再通过读取Block里面的Dentry可以得知httpd文件对应的Inode,再查找Inode Table可以查到httpd文件对应的Block,再在对应的Block里面查询Dentry可以得知httpd.conf文件对应的Inode号,再次查询Inode Table可以找到对应的Block,于是数据就可以读取了2、创建文件:例如/etc/testfile.txt想要创建一个文件,首先得先给这个文件分配Inode和Block。首先扫描Inode Bitmap查找空闲Inode,再去Inode Table中写入想要创建文件的元数据,例如权限、属主属组、大小、时间戳、以及这个Inode对应所占据的Block。然后再找到根的Inode,找到根对应的Block,里面Dentry记录了etc及其对应的Inode,再通过Inode Table找到etc文件对应的Block,于是在Dentry里面添加一条记录,testfile.txt与其对应的Inode号,文件类型等信息。到此一个文件便创建了。3、删除文件:例如/etc/fstab删除文件直接上级目录(etc)里面的那条Dentry记录,Inode Bitmap里面把文件(fstab)原先对应的Inode号标记为未使用,Block Bitmap中把文件(fstab)原先对应的Block标记为未使用。删除文件本身并没有删除文件所对应的Block和Inode,也就是说Block上的数据并没有被抹除,除非后面向其Block中覆盖数据4、复制文件复制文件本质就是新建一个文件,并填充源文件数据的过程,详细可参考上面的创建和读取文件过程5、剪切文件在同一个分区下,剪切速度非常快,这是因为其本质也只是将Dentry记录换一个目录而已,所以根本就不涉及什么耗时的操作。而跨分区剪切文件的过程其实就是在另外一个分区上创建一个新文件,并复制,复制完成之后再删除原先分区上数据的一个过程。五、软连接与硬链接联系与区别1、软连接(符号链接)与硬链接联系软连接本质:在Inode Table中本该存储Block号信息的地方存储了一个路径,如:/etc/httpd/httpd.conf,所以软连接文件的大小都是其对应的文件路径的字符个数硬链接本质:Inode号相同的文件彼此都可称为硬链接,只是再另外一个目录中添加的Dentry记录为同一个Inode而已ln&-&make&links&between&files&&&&#&给文件创建链接
&&&&&&&ln&[-s&-v]&SRC&DEST
&&&&&&&&-s:创建软链接
&&&&&&&&-v:显示创建详细过程
[root@soysauce&test]#&ll&/etc/rc.sysinit&&&&&&&&&&&&&#&权限为777,并且大小为所指向的字符个数
lrwxrwxrwx.&1&root&root&15&Aug&28&10:32&/etc/rc.sysinit&-&&rc.d/rc.sysinit
[root@soysauce&test]#&ln&-s&inittab&inittab_soft&&&&&&&&#&创建软连接
[root@soysauce&test]#&ln&&inittab&inittab_hard&&&&&&&&&#&创建硬链接
[root@soysauce&test]#&ll&-i
265301&-rw-r--r--&2&root&root&884&Nov&23&13:25&inittab&&&&
265301&-rw-r--r--&2&root&root&884&Nov&23&13:25&inittab_hard&&&&&#&硬链接inode号与源文件相同
265310&lrwxrwxrwx&1&root&root&&&7&Nov&23&13:55&inittab_soft&-&&inittab
[root@soysauce&test]#&ll&-i
265301&-rw-r--r--&2&root&root&884&Nov&23&13:25&inittab&&&&&&&&#&此时硬链接次数都为2
265301&-rw-r--r--&2&root&root&884&Nov&23&13:25&inittab_hard
265310&lrwxrwxrwx&1&root&root&&&7&Nov&23&13:55&inittab_soft&-&&inittab
[root@soysauce&test]#&rm&-f&inittab&&&&&&&&&&&&&&&&&&&&&&&&&&&#&删除源文件
[root@soysauce&test]#&ll&-i
265301&-rw-r--r--&1&root&root&884&Nov&23&13:25&inittab_hard&&&&#&此时硬链接次数变为了1
265310&lrwxrwxrwx&1&root&root&&&7&Nov&23&13:55&inittab_soft&-&&inittab&&&&#&此时软连接也一直在闪烁
[root@soysauce&test]#&head&-3&inittab_hard&&&&&&&&&&&&&&&&&#&因为篇幅原因,顾只查看3行
#&inittab&is&only&used&by&upstart&for&the&default&runlevel.
#&ADDING&OTHER&CONFIGURATION&HERE&WILL&HAVE&NO&EFFECT&ON&YOUR&SYSTEM.2、软连接(符号链接)与硬链接区别硬链接:&&&&①只能对文件创建,不能应用于目录&&&&②不能跨文件系统&&&&③创建硬链接会增加文件被链接的次数&&&&④硬链接次数为1时,再删除就是彻底删除了&&&&⑤删除源文件不会影响链接文件软链接:&&&&①可应用于目录&&&&②可以跨文件系统&&&&③不会增加被链接文件的链接次数&&&&④其大小为指定的路径所包含的字符个数&&&&⑤删除源文件会影响链接文件3.硬链接与复制的区别互为硬链接的两文件inode号肯定是相同的,对应的block号也是相同的;而复制的文件inode号和block号也肯定不相同,只是block里面存储的数据是一样而已六、虚拟文件系统虚拟文件系统又称虚拟文件系统转换(Virual Filesystem Switch&,简称VFS)。说它虚拟,是因为它所有的数据结构都是在运行以后才建立,并在卸载时删除,而在磁盘上并没有存储这些数据结构,显然如果只有VFS,系统是无法工作的,因为它的这些数据结构不能凭空而来,只有与实际的文件系统,如Ext2、Minix、MSDOS、VFAT等相结合,才能开始工作,所以VFS并不是一个真正的文件系统。与VFS相对,我们称Ext2、Minix、MSDOS等为具体文件系统。&&&&VFS与内核其它子系统之间关系注:以上内容都是摘自第8章第一节VFS概述七、文件系统管理相关命令1、fdiskfdisk&-&Partition&table&manipulator&for&Linux&&&&#&Linux分区表操作工具软件
&&&&&&&fdisk&[-uc]&[-b&sectorsize]&[-C&cyls]&[-H&heads]&[-S&sects]&device
交互式命令&&&
&&&&m:显示帮助信息&
&&&&p:&显示当前硬件的分区,包括没保存的改动
n:&创建新分区,e:&扩展分区,p:&主分区
d:&删除一个分区
w:&保存退出
q:&不保存退出
t:&修改分区类型,L:&查看所有支持的分区类型
l:&显示所有支持的分区类型
[root@soysauce&~]#&fdisk&/dev/sdb&&&&&&&&&&&&
WARNING:&DOS-compatible&mode&is&deprecated.&It's&strongly&recommended&to
&&&&&&&&&switch&off&the&mode&(command&'c')&and&change&display&units&to
&&&&&&&&&sectors&(command&'u').
Command&(m&for&help):&p&&&&&&&&&&&&&&&&&&&&#&显示所有的分区
Disk&/dev/sdb:&21.5&GB,&&bytes
255&heads,&63&sectors/track,&2610&cylinders
Units&=&cylinders&of&16065&*&512&=&8225280&bytes
Sector&size&(logical/physical):&512&bytes&/&512&bytes
I/O&size&(minimum/optimal):&512&bytes&/&512&bytes
Disk&identifier:&0x84c99918
&&&Device&Boot&&&&&&Start&&&&&&&&&End&&&&&&Blocks&&&Id&&System
/dev/sdb1&&&&&&&&&&&&&&&1&&&&&&&&&262&&&&&2104483+&&83&&Linux
Command&(m&for&help):&n&&&&&&&&&&&&&&&&&&&&&&&&#&新建一个分区
Command&action
&&&e&&&extended
&&&p&&&primary&partition&(1-4)
p&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#&建立主分区
Partition&number&(1-4):&2&&&&&&&&&&&&&&&&&&&&&&#&指定分区号
First&cylinder&(263-2610,&default&263):&&&&&&&&&#&分区起始柱面,默认即可
Using&default&value&263
Last&cylinder,&+cylinders&or&+size{K,M,G}&(263-2610,&default&2610):&+3G&#&分区结束柱面,可直接指定大小
Command&(m&for&help):&t&&&&&&&&&&&&&&&&&&&&&&&&#&修改分区类型
Partition&number&(1-4):&2
Hex&code&(type&L&to&list&codes):&L&&&&&&&&&&&&&#&输入t之后是L选项,如果直接查看则是l
&0&&Empty&&&&&&&&&&&24&&NEC&DOS&&&&&&&&&81&&Minix&/&old&Lin&bf&&Solaris&&&&&&&&
&1&&FAT12&&&&&&&&&&&39&&Plan&9&&&&&&&&&&82&&Linux&swap&/&So&c1&&DRDOS/sec&(FAT-
&2&&XENIX&root&&&&&&3c&&PartitionMagic&&83&&Linux&&&&&&&&&&&c4&&DRDOS/sec&(FAT-
&3&&XENIX&usr&&&&&&&40&&Venix&80286&&&&&84&&OS/2&hidden&C:&&c6&&DRDOS/sec&(FAT-
&4&&FAT16&&32M&&&&&&41&&PPC&PReP&Boot&&&85&&Linux&extended&&c7&&Syrinx&&&&&&&&&
&5&&Extended&&&&&&&&42&&SFS&&&&&&&&&&&&&86&&NTFS&volume&set&da&&Non-FS&data&&&&
&6&&FAT16&&&&&&&&&&&4d&&QNX4.x&&&&&&&&&&87&&NTFS&volume&set&db&&CP/M&/&CTOS&/&.
&7&&HPFS/NTFS&&&&&&&4e&&QNX4.x&2nd&part&88&&Linux&plaintext&de&&Dell&Utility&&&
&8&&AIX&&&&&&&&&&&&&4f&&QNX4.x&3rd&part&8e&&Linux&LVM&&&&&&&df&&BootIt&&&&&&&&&
&9&&AIX&bootable&&&&50&&OnTrack&DM&&&&&&93&&Amoeba&&&&&&&&&&e1&&DOS&access&&&&&
&a&&OS/2&Boot&Manag&51&&OnTrack&DM6&Aux&94&&Amoeba&BBT&&&&&&e3&&DOS&R/O&&&&&&&&
&b&&W95&FAT32&&&&&&&52&&CP/M&&&&&&&&&&&&9f&&BSD/OS&&&&&&&&&&e4&&SpeedStor&&&&&&
&c&&W95&FAT32&(LBA)&53&&OnTrack&DM6&Aux&a0&&IBM&Thinkpad&hi&eb&&BeOS&fs&&&&&&&&
&e&&W95&FAT16&(LBA)&54&&OnTrackDM6&&&&&&a5&&FreeBSD&&&&&&&&&ee&&GPT&&&&&&&&&&&&
&f&&W95&Ext'd&(LBA)&55&&EZ-Drive&&&&&&&&a6&&OpenBSD&&&&&&&&&ef&&EFI&(FAT-12/16/
10&&OPUS&&&&&&&&&&&&56&&Golden&Bow&&&&&&a7&&NeXTSTEP&&&&&&&&f0&&Linux/PA-RISC&b
11&&Hidden&FAT12&&&&5c&&Priam&Edisk&&&&&a8&&Darwin&UFS&&&&&&f1&&SpeedStor&&&&&&
12&&Compaq&diagnost&61&&SpeedStor&&&&&&&a9&&NetBSD&&&&&&&&&&f4&&SpeedStor&&&&&&
14&&Hidden&FAT16&&3&63&&GNU&HURD&or&Sys&ab&&Darwin&boot&&&&&f2&&DOS&secondary&&
16&&Hidden&FAT16&&&&64&&Novell&Netware&&af&&HFS&/&HFS+&&&&&&fb&&VMware&VMFS&&&&
17&&Hidden&HPFS/NTF&65&&Novell&Netware&&b7&&BSDI&fs&&&&&&&&&fc&&VMware&VMKCORE&
18&&AST&SmartSleep&&70&&DiskSecure&Mult&b8&&BSDI&swap&&&&&&&fd&&Linux&raid&auto
1b&&Hidden&W95&FAT3&75&&PC/IX&&&&&&&&&&&bb&&Boot&Wizard&hid&fe&&LANstep&&&&&&&&
1c&&Hidden&W95&FAT3&80&&Old&Minix&&&&&&&be&&Solaris&boot&&&&ff&&BBT&&&&&&&&&&&&
1e&&Hidden&W95&FAT1
Hex&code&(type&L&to&list&codes):&82
Changed&system&type&of&partition&2&to&82&(Linux&swap&/&Solaris)
Command&(m&for&help):&w&&&&&&&&&&&&&&&&&&&&&&&&#&保存退出
The&partition&table&has&been&altered!
Calling&ioctl()&to&re-read&partition&table.
WARNING:&Re-reading&the&partition&table&failed&with&error&16:&Device&or&resource&busy.
The&kernel&still&uses&the&old&table.&The&new&table&will&be&used&at
the&next&reboot&or&after&you&run&partprobe(8)&or&kpartx(8)
Syncing&disks.
[root@soysauce&~]#&cat&/proc/partitions&&&&&#&查看当前内核已识别的分区
major&minor&&#blocks&&name
&&&8&&&&&&&&0&&&&sda
&&&8&&&&&&&&1&&&&&512000&sda1
&&&8&&&&&&&&2&&&&sda2
&&&8&&&&&&&16&&&&sdb
&&&8&&&&&&&17&&&&2104483&sdb1
&253&&&&&&&&0&&&&dm-0
&253&&&&&&&&1&&&&2031616&dm-1
[root@soysauce&~]#&partx&-a&/dev/sdb&&&#&通知内核重读分区表信息,RHEL5或者CentOS上一般是partprobe命令
BLKPG:&Device&or&resource&busy
error&adding&partition&1
[root@soysauce&~]#&cat&/proc/partitions&
major&minor&&#blocks&&name
&&&8&&&&&&&&0&&&&sda
&&&8&&&&&&&&1&&&&&512000&sda1
&&&8&&&&&&&&2&&&&sda2
&&&8&&&&&&&16&&&&sdb
&&&8&&&&&&&17&&&&2104483&sdb1
&&&8&&&&&&&18&&&&3156772&sdb2&&&&&&&&&&&&&&&&#&此时sdb2已经读取到了
&253&&&&&&&&0&&&&dm-0
&253&&&&&&&&1&&&&2031616&dm-1
[root@soysauce&~]#&mkswap&-L&MYDATA/dev/sdb2&&&&&&&&&&&&&&&&#&格式化交换分区
Setting&up&swapspace&version&1,&size&=&3156768&KiB
LABEL=MYDATA,&UUID=2f0ca25b-e6f8-45ae-a239-00f5b38f7275
[root@soysauce&~]#&free&-m
&&&&&&&&&&&&&total&&&&&&&used&&&&&&&free&&&&&shared&&&&buffers&&&&&cached
Mem:&&&&&&&&&&&988&&&&&&&&176&&&&&&&&812&&&&&&&&&&0&&&&&&&&&67&&&&&&&&&37
-/+&buffers/cache:&&&&&&&&&71&&&&&&&&917
Swap:&&&&&&&&&1983&&&&&&&&&&0&&&&&&&1983&&&&&&&&&&&&#&此时还未启用刚才创建的那个交换分区
[root@soysauce&~]#&swapon&/dev/sdb2&&&&&&&&&&&&&&&&&#&启用刚刚创建的交换分区
[root@soysauce&~]#&free&-m
&&&&&&&&&&&&&total&&&&&&&used&&&&&&&free&&&&&shared&&&&buffers&&&&&cached
Mem:&&&&&&&&&&&988&&&&&&&&178&&&&&&&&810&&&&&&&&&&0&&&&&&&&&67&&&&&&&&&37
-/+&buffers/cache:&&&&&&&&&73&&&&&&&&915
Swap:&&&&&&&&&5066&&&&&&&&&&0&&&&&&&5066&&&&&&&&&&&&#&此时可以看到已然生效
[root@soysauce&~]#&swapoff&/dev/sdb2&&&&&&&&&&&&&&&&#&关闭交换分区
[root@soysauce&~]#&free&-m
&&&&&&&&&&&&&total&&&&&&&used&&&&&&&free&&&&&shared&&&&buffers&&&&&cached
Mem:&&&&&&&&&&&988&&&&&&&&176&&&&&&&&812&&&&&&&&&&0&&&&&&&&&67&&&&&&&&&37
-/+&buffers/cache:&&&&&&&&&71&&&&&&&&917
Swap:&&&&&&&&&1983&&&&&&&&&&0&&&&&&&1983&&&&&&&&&&&&#&此时可以看到已然关闭2、mke2fsmke2fs&-&create&an&ext2/ext3/ext4&filesystem&&&&#&创建ext2/ext3/ext4文件系统
&&&&&&&mke2fs&[options]&DEVICE
&&&&-j:创建ext3类型文件系统
-b&BLOCK_SIZE:指定块大小,默认为4096;可用取值为或4096
-L&LABEL:指定分区卷标
-m&#:指定预留给超级用户的块数百分比,默认值为%5
-i&#:用于指定为多少字节的空间创建一个inode,默认为8192;应为block的2^n倍
-t&FSTYPE:指定文件系统类型
-N&#:指定inode个数
-F:强制创建文件系统,不管其是否处于挂载状态
-E:用户指定额外文件系统属性
-q:执行时不显示任何信息,常用于脚本
-c:检查是否有损坏的区块
[root@soysauce&~]#&fdisk&/dev/sdb&&&&&&&&&&&&&#&创建一个分区完整过程
Device&contains&neither&a&valid&DOS&partition&table,&nor&Sun,&SGI&or&OSF&disklabel
Building&a&new&DOS&disklabel&with&disk&identifier&0x84c99918.
Changes&will&remain&in&memory&only,&until&you&decide&to&write&them.
After&that,&of&course,&the&previous&content&won't&be&recoverable.
Warning:&invalid&flag&0x0000&of&partition&table&4&will&be&corrected&by&w(rite)
WARNING:&DOS-compatible&mode&is&deprecated.&It's&strongly&recommended&to
&&&&&&&&&switch&off&the&mode&(command&'c')&and&change&display&units&to
&&&&&&&&&sectors&(command&'u').
Command&(m&for&help):&n&&&&&&&&&&&&&&&&#&新建一个分区
Command&action
&&&e&&&extended
&&&p&&&primary&partition&(1-4)
Partition&number&(1-4):&1&&&&&&&&&&&&&&&&#&自己选择分区号,1-4中选
First&cylinder&(1-2610,&default&1):&
Using&default&value&1
Last&cylinder,&+cylinders&or&+size{K,M,G}&(1-2610,&default&2610):&+2G
Command&(m&for&help):&w&&&&&&&&&&&&&&&&&#&保存创建的分区并退出
The&partition&table&has&been&altered!
Calling&ioctl()&to&re-read&partition&table.
Syncing&disks.
[root@soysauce&~]#&cat&/proc/partitions&&&&&&&&&#&查看当前内核已经读取到的分区信息
major&minor&&#blocks&&name
&&&8&&&&&&&&0&&&&sda
&&&8&&&&&&&&1&&&&&512000&sda1
&&&8&&&&&&&&2&&&&sda2
&&&8&&&&&&&16&&&&sdb
&&&8&&&&&&&17&&&&2104483&sdb1&#&我这里内核已经读取到了sdb1,而在CentOS5上可能需要执行prartprobe命令&&
&253&&&&&&&&0&&&&dm-0
&253&&&&&&&&1&&&&2031616&dm-1
[root@soysauce&~]#&mke2fs&-j&/dev/sdb1&&&&&&&&&#&创建ext3格式的文件系统
mke2fs&1.41.12&(17-May-2010)
Filesystem&label=
OS&type:&Linux
Block&size=4096&(log=2)
Fragment&size=4096&(log=2)
Stride=0&blocks,&Stripe&width=0&blocks
131648&inodes,&526120&blocks
26306&blocks&(5.00%)&reserved&for&the&super&user
First&data&block=0
Maximum&filesystem&blocks=
17&block&groups
32768&blocks&per&group,&32768&fragments&per&group
7744&inodes&per&group
Superblock&backups&stored&on&blocks:&
Writing&inode&tables:&done&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Creating&journal&(16384&blocks):&done
Writing&superblocks&and&filesystem&accounting&information:&done
This&filesystem&will&be&automatically&checked&every&24&mounts&or
180&days,&whichever&comes&first.&&Use&tune2fs&-c&or&-i&to&override.
[root@soysauce&~]#&mke2fs&-t&ext4&/dev/sdb1&&&&&&&&#&创建ext4格式的文件系统
mke2fs&1.41.12&(17-May-2010)
Filesystem&label=
OS&type:&Linux
Block&size=4096&(log=2)
Fragment&size=4096&(log=2)
Stride=0&blocks,&Stripe&width=0&blocks
131648&inodes,&526120&blocks
26306&blocks&(5.00%)&reserved&for&the&super&user
First&data&block=0
Maximum&filesystem&blocks=
17&block&groups
32768&blocks&per&group,&32768&fragments&per&group
7744&inodes&per&group
Superblock&backups&stored&on&blocks:&
Writing&inode&tables:&done&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Creating&journal&(16384&blocks):&done
Writing&superblocks&and&filesystem&accounting&information:&done
This&filesystem&will&be&automatically&checked&every&20&mounts&or
180&days,&whichever&comes&first.&&Use&tune2fs&-c&or&-i&to&override.3、blkidblkid&-&command-line&utility&to&locate/print&block&device&attributes&#&定位或打印块设备属性信息
&&&&&&&blkid&[options]&[DEVICE]
&&&&-s&&tag&:显示指定信息,默认显示所有信息
&&&&-o&format:指定显示格式,常用list
[root@soysauce&~]#&blkid&
/dev/sda1:&UUID="7a79d653-e9b7-43f2-a2c1-e41af29b3f5d"&TYPE="ext4"&
/dev/sda2:&UUID="aNiMxY-uTa4-IcVC-1FD7-i2S9-kwnV-lF4BMS"&TYPE="LVM2_member"&
/dev/mapper/vg_centos6-lv_root:&UUID="09b-4be3-9dc8-"&TYPE="ext4"&
/dev/mapper/vg_centos6-lv_swap:&UUID="2a88de6d--b13e-117bbf60c5d6"&TYPE="swap"&
[root@soysauce&~]#&blkid&-o&device&&&&&&&&&&&&#&只显示设备名
/dev/mapper/vg_centos6-lv_root
/dev/mapper/vg_centos6-lv_swap
[root@soysauce&~]#&blkid&-s&UUID&/dev/sda1&&&&&&&#&只显示/dev/sda1的UUID
/dev/sda1:&UUID="7a79d653-e9b7-43f2-a2c1-e41af29b3f5d"4、e2lablee2label&-&Change&the&label&on&an&ext2/ext3/ext4&filesystem&&&&#&改变ext2/ext3/ext4文件系统的卷标
&&&&&&&e2label&device&[&new-label&]
[root@soysauce&~]#&e2label&/dev/sdb1&SOYSAUCE&&&&&&&&&&#&修改/dev/sdb1卷标
[root@soysauce&~]#&e2label&/dev/sdb1&&&&&&&&&&&&&#&查看/dev/sdb1卷标
SOYSAUCE5、tune2fstune2fs&-&adjust&tunable&filesystem&parameters&on&ext2/ext3/ext4&filesystems&#&调整文件系统参数信息
&&&&&&&tune2fs&&[options]&&&DEVICE
&&&&-j:不损害原有数据,将ext2升级至ext3
-L&LABEL:设定或修改卷标
-m&#:调整预留百分比
-r&#:指定预留块数
-o:设定默认挂载选项,常用的acl
-c&#:指定挂载次数达到#次之后进行自检,0或-1表关闭此功能
-C&#:指定文件系统已经被挂载的次数
-i&#:每挂载使用多少天后进行自检;0或-1表示关闭此功能
-l:显示超级块中的信息
[root@soysauce&~]#&tune2fs&-j&/dev/sdb1&&&&#&无损升级至ext3文件系统
tune2fs&1.41.12&(17-May-2010)
Creating&journal&inode:&done
This&filesystem&will&be&automatically&checked&every&22&mounts&or
180&days,&whichever&comes&first.&&Use&tune2fs&-c&or&-i&to&override.
[root@soysauce&~]#&blkid&/dev/sdb1
/dev/sdb1:&UUID="79d72bb3-9b67-45cd-8e77-2b37349db88c"&SEC_TYPE="ext2"&TYPE="ext3"&
[root@soysauce&~]#&tune2fs&-m&8&/dev/sdb1&&&&#&调整预留块百分比为%8
tune2fs&1.41.12&(17-May-2010)
Setting&reserved&blocks&percentage&to&8%&(42089&blocks)
[root@soysauce&~]#&tune2fs&-l&&/dev/sdb1&&&&#&查看超级块信息
tune2fs&1.41.12&(17-May-2010)
Filesystem&volume&name:&&&&none&
Last&mounted&on:&&&&&&&&&&&not&available&
Filesystem&UUID:&&&&&&&&&&79d72bb3-9b67-45cd-8e77-2b37349db88c
Filesystem&magic&number:&&0xEF53
Filesystem&revision&#:&&&&1&(dynamic)
Filesystem&features:&&&&&has_journal&ext_attr&resize_inode&dir_index&filetype&sparse_super&large_file
Filesystem&flags:&&&&&&&&&signed_directory_hash&
Default&mount&options:&&&&(none)
Filesystem&state:&&&&&&&&&clean
Errors&behavior:&&&&&&&&&&Continue
Filesystem&OS&type:&&&&&&&Linux
Inode&count:&&&&&&&&&&&&&&131648
Block&count:&&&&&&&&&&&&&&526120
Reserved&block&count:&&&&&42089
Free&blocks:&&&&&&&&&&&&&&500671
Free&inodes:&&&&&&&&&&&&&&131637
First&block:&&&&&&&&&&&&&&0
Block&size:&&&&&&&&&&&&&&&4096
Fragment&size:&&&&&&&&&&&&4096
Reserved&GDT&blocks:&&&&&&128
Blocks&per&group:&&&&&&&&&32768
Fragments&per&group:&&&&&&32768
Inodes&per&group:&&&&&&&&&7744
Inode&blocks&per&group:&&&484
Filesystem&created:&&&&&&&Mon&Nov&23&20:24:17&2015
Last&mount&time:&&&&&&&&&&n/a
Last&write&time:&&&&&&&&&&Mon&Nov&23&20:26:43&2015
Mount&count:&&&&&&&&&&&&&&0
Maximum&mount&count:&&&&&&22
Last&checked:&&&&&&&&&&&&&Mon&Nov&23&20:24:17&2015
Check&interval:&&&&&&&&&&&&months)
Next&check&after:&&&&&&&&&Sat&May&21&20:24:17&2016
Reserved&blocks&uid:&&&&&&0&(user&root)
Reserved&blocks&gid:&&&&&&0&(group&root)
First&inode:&&&&&&&&&&&&&&11
Inode&size: &&&&&&&&&&256
Required&extra&isize:&&&&&28
Desired&extra&isize:&&&&&&28
Journal&inode:&&&&&&&&&&&&8
Default&directory&hash:&&&half_md4
Directory&Hash&Seed:&&&&&&98e59dee-37cb-4cf4-96bb-47ab22e61c0d
Journal&backup:&&&&&&&&&&&inode&blocks 6、dumpe2fsdumpe2fs&-&dump&ext2/ext3/ext4&filesystem&information&&&&#&显示文件系统超级块信息和块组描述符
&&&&&&&&dumpe2fs&&[options]&&DEVICE
&&&&&&&&&&&
&&&&-h:查看超级块信息,但不包括GDT(块组描述表)
[root@soysauce&~]#&dumpe2fs&-h&/dev/sdb1&&&&&&#&查看超级块信息,不显示GDT
dumpe2fs&1.41.12&(17-May-2010)
Filesystem&volume&name:&&&&none&
Last&mounted&on:&&&&&&&&&&&not&available&
Filesystem&UUID:&&&&&&&&&&79d72bb3-9b67-45cd-8e77-2b37349db88c
Filesystem&magic&number:&&0xEF53
Filesystem&revision&#:&&&&1&(dynamic)
Filesystem&features:&&&&&&has_journal&ext_attr&resize_inode&dir_index&filetype&sparse_super&large_file
Filesystem&flags:&&&&&&&&&signed_directory_hash&
Default&mount&options:&&&&(none)
Filesystem&state:&&&&&&&&&clean
Errors&behavior:&&&&&&&&&&Continue
Filesystem&OS&type:&&&&&&&Linux
Inode&count:&&&&&&&&&&&&&&131648
Block&count:&&&&&&&&&&&&&&526120
Reserved&block&count:&&&&&42089
Free&blocks:&&&&&&&&&&&&&&500671
Free&inodes:&&&&&&&&&&&&&&131637
First&block:&&&&&&&&&&&&&&0
Block&size:&&&&&&&&&&&&&&&4096
Fragment&size:&&&&&&&&&&&&4096
Reserved&GDT&blocks:&&&&&&128
Blocks&per&group:&&&&&&&&&32768
Fragments&per&group:&&&&&&32768
Inodes&per&group:&&&&&&&&&7744
Inode&blocks&per&group:&&&484
Filesystem&created:&&&&&&&Mon&Nov&23&20:24:17&2015
Last&mount&time:&&&&&&&&&&n/a
Last&write&time:&&&&&&&&&&Mon&Nov&23&20:26:43&2015
Mount&count:&&&&&&&&&&&&&&0
Maximum&mount&count:&&&&&&22
Last&checked:&&&&&&&&&&&&&Mon&Nov&23&20:24:17&2015
Check&interval:&&&&&&&&&&&&months)
Next&check&after:&&&&&&&&&Sat&May&21&20:24:17&2016
Reserved&blocks&uid:&&&&&&0&(user&root)
Reserved&blocks&gid:&&&&&&0&(group&root)
First&inode:&&&&&&&&&&&&&&11
Inode&size: &&&&&&&&&&256
Required&extra&isize:&&&&&28
Desired&extra&isize:&&&&&&28
Journal&inode:&&&&&&&&&&&&8
Default&directory&hash:&&&half_md4
Directory&Hash&Seed:&&&&&&98e59dee-37cb-4cf4-96bb-47ab22e61c0d
Journal&backup:&&&&&&&&&&&inode&blocks
Journal&features:&&&&&&&&&(none)
Journal&size:&&&&&&&&&&&&&64M
Journal&length:&&&&&&&&&&&16384
Journal&sequence:&&&&&&&&&0x
Journal&start:&&&&&&&&&&&&07、fsckfsck&-&check&and&repair&a&Linux&file&system&&&&#&检查并修复Linux文件系统
&&&&-a:自动修复
&&&&-t&FSTYPE:指定文件系统类型,可以不指,但一定不能指错
[root@soysauce&~]#&fsck&/dev/sdb1&&&&&&&&#&我这里文件系统是clean状态,所以没有检查
fsck&from&util-linux-ng&2.17.2
e2fsck&1.41.12&(17-May-2010)
/dev/sdb1:&clean,&11/131648&files,&&blocks8、e2fscke2fsck&-&check&a&Linux&ext2/ext3/ext4&file&system&&&&#&检查并修复ext系列文件系统
&&&&&&&e2fsck&&[options]&&DEVICE
&&&&-f:强制检查
&&&&-p:自动修复
&&&&&&&&&&&&&
[root@soysauce&~]#&e2fsck&/dev/sdb1&&&&&&&&&&&&
e2fsck&1.41.12&(17-May-2010)
/dev/sdb1:&clean,&11/131648&files,&&blocks
[root@soysauce&~]#&e2fsck&&-f&/dev/sdb1&&&&&&&&#&强制检查文件系统
e2fsck&1.41.12&(17-May-2010)
Pass&1:&Checking&inodes,&blocks,&and&sizes
Pass&2:&Checking&directory&structure
Pass&3:&Checking&directory&connectivity
Pass&4:&Checking&reference&counts
Pass&5:&Checking&group&summary&information
/dev/sdb1:&11/131648&files&(0.0%&non-contiguous),&&blocks9、mountmount&-&mount&a&filesystem&&&&&&&&#&挂载文件系统
&&&&&&&&&&&&mount&[options]&[-o&options]&DEVICE&MOUNT_POINT&
&&&&&&&&&&&&&&&&&&
&&&&-a:表示挂载/etc/fstab文件中定义的所有文件系统
&&&&-n:默认情况下,mount命令每挂载一个设备,都会把挂载的设备信息保存至/etc/mtab文件;使用―n选项意味着挂载设备时,不把信息写入此文件
-t&FSTYPE:指定正在挂载设备上的文件系统的类型;不使用此选项时,mount会调用blkid命令获取对应文件系统的类型
-r:只读挂载,挂载光盘时常用此选项
-w:读写挂载
-o:指定额外的挂载选项,也即指定文件系统启用的属性;
remount:重新挂载当前文件系统
ro:挂载为只读
rw:读写挂载
&&&&&&&&loop:挂载本地回环设备
挂载:将新的文件系统关联至当前根文件系统
卸载:将某文件系统与当前根文件系统的关联关系预以移除
[root@soysauce&~]#&mount&&&&&&&&&&#&不带任何参数的mount命令可以显示当前已挂载的文件系统
/dev/mapper/vg_centos6-lv_root&on&/&type&ext4&(rw)
proc&on&/proc&type&proc&(rw)
sysfs&on&/sys&type&sysfs&(rw)
devpts&on&/dev/pts&type&devpts&(rw,gid=5,mode=620)
tmpfs&on&/dev/shm&type&tmpfs&(rw)
/dev/sda1&on&/boot&type&ext4&(rw)
none&on&/proc/sys/fs/binfmt_misc&type&binfmt_misc&(rw)
[root@soysauce&~]#&mount&-o&ro&/dev/sdb1&/mnt/&&&&#&以只读方式挂载
[root@soysauce&~]#&echo&"hello"&&&&/mnt/a.txt
-bash:&/mnt/a.txt:&Read-only&file&system&&&&&&&&&&&#&不能写文件
[root@soysauce&~]#&mount&-o&remount,rw&&/mnt/&&&&&&&#&以可读写方式重新挂载
[root@soysauce&~]#&echo&"hello"&&&&/mnt/a.txt&&&&&&&&
[root@soysauce&~]#&cd&/mnt/
[root@soysauce&mnt]#&ls
a.txt&&lost+found
[root@soysauce&mnt]#&cat&a.txt&&&&&&&&&&&&#&写入成功
[root@soysauce&~]#&cat&/etc/fstab
LABEL=/&/&ext3&defaults,barrier=0&1&1
tmpfs&&&&&&&&&&&&&&&&&&&/dev/shm&&&&&&&&&&&&&&&&tmpfs&&&defaults&&&&&&&&0&0
devpts&&&&&&&&&&&&&&&&&&/dev/pts&&&&&&&&&&&&&&&&devpts&&gid=5,mode=620&&0&0
sysfs&&&&&&&&&&&&&&&&&&&/sys&&&&&&&&&&&&&&&&&&&&sysfs&&&defaults&&&&&&&&0&0
proc&&&&&&&&&&&&&&&&&&&&/proc&&&&&&&&&&&&&&&&&&&proc&&&&defaults&&&&&&&&0&0
要挂载的设备&&&&&&挂载点&&&&&&文件系统类型&&&&&挂载选项&&&&&转储频率(每多少天做一次完全备份)&&&&&文件系统检测次序(只有根可以为1) 10、fuserfuser&-&identify&processes&using&files&or&sockets&&&&#&报告进程使用的文件或是网络套接字
&&&&&&&fuser&&[options]&&DEVICE
&&&&-v:查看某文件上正在运行的进程
-k:杀死正在访问某文件的进程
-m:显示访问挂载点的进程
[root@soysauce&~]#&mount&/dev/sdb1&/mnt/&&&&#&挂载/dev/sdb1至/mnt目录下
[root@soysauce&~]#&cd&/mnt/&&&&&&&&&&&&&&&&#&切换进/mnt目录
[root@soysauce&mnt]#&umount&/mnt/&&&&&&&&#&此时我就站在/mnt目录下,卸载肯定卸不掉
umount:&/mnt:&device&is&busy.
&&&&&&&&(In&some&cases&useful&info&about&processes&that&use
&&&&&&&&&the&device&is&found&by&lsof(8)&or&fuser(1))
[root@soysauce&mnt]#&fuser&-km&/mnt/&&&&&&#&强行结束正在访问/mnt挂载点的进程,然后直接把我踢下线了...
/mnt/:&&&&&&&&&&&&&&&&1860c
Connection&closed&by&foreign&host.
Disconnected&from&remote&host(CentOS6.5)&at&22:20:33.
Type&`help'&to&learn&how&to&use&Xshell&prompt. 11、freefree&-&Display&amount&of&free&and&used&memory&in&the&system&&&&#&显示系统中已用的和未用的内存总和
&&&&&&&free&[-b&|&-k&|&-m]&[-o]&[-s&delay&]&[-t]&[-l]&[-V]
&&&&&&&&-m:以M为单位来显示
[root@soysauce&~]#&free&-m
&&&&&&&&&&&&&total&&&&&&&used&&&&&&&free&&&&&shared&&&&buffers&&&&&cached
Mem:&&&&&&&&&&&988&&&&&&&&176&&&&&&&&812&&&&&&&&&&0&&&&&&&&&67&&&&&&&&&37
-/+&buffers/cache:&&&&&&&&&71&&&&&&&&917&&&&
Swap:&&&&&&&&&1983&&&&&&&&&&0&&&&&&&1983&&&&&&&&
第一行:内存总大小、已使用空间大小、剩余空间大小、共享内存、缓冲数据大小、缓存数据大小
第二行:UsedMem-(buffers+cached)为真实使用空间、FreeMem+(buffers+cached)为真实剩余空间
第三行:总交换分区大小、已使用交换分区大小、剩余交换分区大小12、dudu&-&estimate&file&space&usage&&&&&&&&#&报告磁盘空间使用情况
&&&&&&&du&[OPTION]...&[FILE]...
&&&&&&&du&[OPTION]...&--files0-from=F
&&&&-s:仅显示总计,只列出最后加总的值
&&&&-h:做单位换算的
[root@soysauce&~]#&du&-sh&/root/&&&&&&&&#&统计总大小
1.3M /root/&&&&
[root@soysauce&~]#&du&-h&/root/&&&&&&&&&#&统计目录下每单个文件大小
4.0K /root/.pki/nssdb
8.0K /root/.pki
4.0K /root/.ansible/cp
8.0K /root/.ansible
8.0K /root/test
36K /root/.vim/syntax
48K /root/.vim
20K /root/.ssh
136K /root/scripts
1.3M /root/13、dfdf&-&report&file&system&disk&space&usage&&&&&&&&#&报告文件系统磁盘空间的使用情况
&&&&&&&df&[OPTION]...&[FILE]...
&&&&-a:查看所有的文件系统
&&&&-h:做单位换算
&&&&-i:显示inode使用情况
&&&&-P:以POSIX风格显示
&&&&-T:显示文件系统类型
[root@soysauce&~]#&df&-ihT&&&&&&&&&&&&#&显示Inode使用情况
Filesystem&&&&&&&&&&&&&&&&&&&&&Type&&Inodes&IUsed&IFree&IUse%&Mounted&on
/dev/mapper/vg_centos6-lv_root&ext4&&&&1.1M&&&40K&&1.1M&&&&4%&/
tmpfs&&&&&&&&&&&&&&&&&&&&&&&&&&tmpfs&&&124K&&&&&1&&124K&&&&1%&/dev/shm
/dev/sda1&&&&&&&&&&&&&&&&&&&&&&ext4&&&&126K&&&&38&&125K&&&&1%&/boot
/dev/sdb1&&&&&&&&&&&&&&&&&&&&&&ext3&&&&129K&&&&12&&129K&&&&1%&/mnt
[root@soysauce&~]#&df&-hT&&&&&&&&&&&&#&显示磁盘空间使用情况
Filesystem&&&&&&&&&&&&&&&&&&&&&Type&&&Size&&Used&Avail&Use%&Mounted&on
/dev/mapper/vg_centos6-lv_root&ext4&&&&18G&&2.3G&&&15G&&14%&/
tmpfs&&&&&&&&&&&&&&&&&&&&&&&&&&tmpfs&&495M&&&&&0&&495M&&&0%&/dev/shm
/dev/sda1&&&&&&&&&&&&&&&&&&&&&&ext4&&&485M&&&33M&&427M&&&8%&/boot
/dev/sdb1&&&&&&&&&&&&&&&&&&&&&&ext3&&&2.0G&&&68M&&1.8G&&&4%&/mnt14、dddd&-&convert&and&copy&a&file&&&&&&&&#&复制文件并对原文件进行转化和格式化处理
&&&&&&&dd&[OPERAND]...
&&&&&&&dd&OPTION
&&&&if=数据来源
of=数据存储目录
bs=#:指定块大小,单位默认为字节,也可以指定M、G等
count=#:指定读取的块数
seek=#:创建数据文件时,跳过的空间大小
[root@soysauce&~]#&dd&if=/dev/sda&of=/root/mbr.back&bs=512&count=1&&&&#&备份mbr
1+0&records&in
1+0&records&out
512&bytes&(512&B)&copied,&0.&s,&758&kB/s
[root@soysauce&~]#&dd&if=/dev/zero&of=/root/zerofile&bs=1M&count=1&seek=1023&&&&#&跳过前面1023M,创建一个假的1G文件
1+0&records&in
1+0&records&out
1048576&bytes&(1.0&MB)&copied,&0.&s,&162&MB/s
[root@soysauce&~]#&ll&-h&/root/zerofile&&&&&#&ls看到的是假的1G
-rw-r--r--&1&root&root&1.0G&Nov&24&11:07&/root/zerofile
[root@soysauce&~]#&du&-sh&/root/zerofile&&&&&#&du看到的是真实的大小,为1M
1.0M /root/zerofile15、mknodmknod&-&make&block&or&character&special&files&&&&&&&&#&创建块设备文件或字符设备文件
&&&&&&&mknod&[OPTION]...&NAME&TYPE&[MAJOR&MINOR]
&&&&-m:设置权限
&&&&-Z:设置安全的上下文
[root@soysauce&~]#&mknod&/dev/mydev&b&65&0&&&&&&&&#&创建一个主设备号为65&次设备号为0的块设备文件
[root@soysauce&~]#&ll&/dev/mydev&
brw-r--r--&1&root&root&65,&0&Nov&24&11:34&/dev/mydev
[root@soysauce&~]#&mknod&-m&600&/dev/mysdev&b&65&1&&&&#&-m指定权限为600
[root@soysauce&~]#&ll&/dev/mysdev&
brw-------&1&root&root&65,&1&Nov&24&11:36&/dev/mysdev本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 amount是什么意思 的文章

 

随机推荐