操作系统原理--Linux篇(摘录) 太多设计内核代码段,特别是数据结构相关,没有进行仔细阅读,仅挑了部分浅显易懂的部分记录,还需要加强学习。正在阅读《深入理解Linux内核》,不求能看懂多少,像看小说那样打发时间就挺好。 操作系统原理(Linux篇) LInux内核主要由5个子系统组成: 进程管理 存储管理 文件管理 网络管理 进程间通信 Linux进程组成: 正文段: 存放进程要执行的代码,只读。 用户数据段: 进程直接操作的所有数据,包括进程运行处理的数据段和进程使用的堆栈。 系统数据段: 存放一个反应进程状态和运行环境的所有数据,这些数据只能由内核访问和使用,在系统数据段中包括进程控制块PCB。(PCB是一个名为task_struct的结构体,成为任务结构体,task_struct大约1000B,成员和功能归纳为9个方面) 1. 进程状态标志state和flags 2. 进程的标识,标识进程标识的成员:pid、uid、gid等 3. 进程的族亲关系,p_opptr,p_pptr,p_vsptr,p_cptr,p_osptr 4. 进程间的链接信息:Next_test,Prev_task..... 5. 进程间调度信息 6. 进程间时间信息 7. 进程的虚拟信息 8. 进程的文件信息 9. 与进程通信有关的进程 进程的上下文: 进程的运行环境是动态变化的,在Linux中把进程的动态变化的环境总和成为进程上下文。 1. 当前进程 2. 进程切换 3. 上下文切换 4. 进程通过系统调用执行内核代码时,内核运行是为进程服务,所以此时内核运行在进程的上下文中。 系统上下文: 内核除了为进程服务,也需要为操作系统本身任务服务,如响应外部设备的中断,更新相关定时器,重新计算进程优先级等。故把系统在完成自身任务时的运行环境成为系统上下文。 Linux中的进程都是由当前进程使用系统调用fork()创建的,而实际上fork()中进一步调用内核函数do_fork()来完成。 Linux信号的作用和种类: 信号机制 采用信号机制在进程间通信时传送的只是一个成为信号的数据,他不能传递更多的其他信息。 1. 信号的主要作用是把系统中发生的某些事件通知给进程。 2. 信号的主要特征是它的异步性,即什么时候出现信号是不可预知的。 3. 信号的数量与机器平台等有关,它与硬件平台的字长对应,如80x86的字长为32位,则信号有32种。 4. 系统中的每个信号都是一个整数,称为信号值,Linux通过宏定义给每个信号量定义了一个符号常量,称为信号名,以SIG开头。 5. 进程可以同时处理多个信号。 6. 每种信号在signal中只有一位,故不能识别接收了一个还是多个信号。 7. 信号没有优先级,可以以任意顺序处理接收到的信号 进程接收到信号处理的两种方式: 1. 交给内核进行处理 2. 有进程自行处理 Linux管道的概念 管道是Linux进程间通信的手段,管道实际上就是一种共享文件,所以管道的机制是以文件系统为基础实现的,数据在管道中以先进先出的方式,并以字符流的形态传送。 管道有两种: 匿名管道:只能在父子进程间通信 匿名管道与一般的文件不同,它没有纳入文件系统的目录,不占用外存空间,仅适用内存作为数据传输的缓冲区。缓冲区的大小决定每次写入管道的字节数,该值由全局符号常量PIPEBUF确定,缺省值为一个物理页面。 命名管道:可以在任意进程间通信 对称FIFO管道,与匿名管道的区别是,命名管道有文件名,在文件系统中可见,可以实现任意进程间通信。 ~]# mkfifo myfifo #创建一个命名的管道文件 分页存储管理: 把进程的地址空间划分为大小相等的片段,成为页或页面,相应的内存空间也分为页面相同大小的若干块,成为物理块或帧。 内存页面大小必须适中,若页面太小,减少了内存碎片的总空间,有利于提高内存的利用率,但是会使每个进程要求较多的页面,从而引起页表过长,占用大量内存,此外还会降低页面换进换出的效率。若选择较大页面,虽然可以提高页面换进换出的效率,但是会使页面碎片增大,因此页面的大小选择适中,X86架构中默认是4K 页表: OS为每个进程建立一张页面与物理块号的对照表,以便实现地址映射。页表在内存中占有一块固定的存储区,页表的大小由进程或作业的长度决定。 用于控制和历内存的硬件机制成为存储器管理单元MMU(Memory manage Unit) 80x86具有两种存储管理模式 1. 实时地址模式 2. 受保护的虚拟地址模式 内存的最大容量由物理地址长度决定,80x86机器的地址总线为32bit,2^32约为4GB 文件与文件系统 文件:具有文件名的一组信息组合,包括两部分 文件体:文件本身的信息 文件说明:文件存储和管理信息;如文件名、文件内部标识、文件存储地址、访问权限、访问时间等 文件的种类: 1. 按用途分类: 系统文件 库文件 用户文件 2. 按保护级别分类(根据限定的使用文件的权限) 执行文件 只读文件 读写文件 3. 按信息流向分类(物理设备的特性决定了文件信息流向) 输入文件 输出文件 输入输出文件 4. 按文件的性质分类 普通文件 目录文件 块设备文件 5. 按文件的组织结构分类 由用户组织的文件称为逻辑文件:流式文件、记录文件 文件在存储介质上的组织方式称为文件的物理结构(物理文件)、顺序文件、链接文件、索引文件 文件系统的三个部分: 管理软件 被管理软件 相关的数据结构 文件的逻辑结构: 用户观察到的文件组织形式,是用户可以直接处理的数据结构,它独立于物理特性,又称为文件组织 分类: 1. 有结构记录式文件(数据库):包含若干顺序、排列的记录 变长记录:数据项、字段不同;数据项本身不同 定长记录:文件长度=记录总个数X记录长 2. 无结构字符流式文件:文件的信息不组成记录,文件的长度即为字符总个数(源程序、文本文件) 文件的物理结构: 物理结构:文件在外存上实际的组织形式 物理块:以物理块为基本单位分配和传输信息,物理块大小由存储设备和OS确定。 物理块的大小与逻辑记录大小之间不一定一致 文件物理结构的几种形式 1. 顺序结构(顺序文件或连续文件) 一个文件在逻辑上连续的信息被存储在磁盘上相邻的块上,逻辑记录与磁盘块的顺序相一致 #####优点 存取速度快,结构简单,支持顺序存取和随机存取。 #####存在的问题: 磁盘的存储空间利用率不高,容易产生磁盘碎片 对输出文件很难估计需要多少磁盘块 影响文件的扩展 2. 链接结构(链接文件或者串联文件) 基本思想:将文件存放在外存中若干个物理块中,这些块不必连续,每个块的最后一个单元用作指针指向下一个物理地址,最后块的指针使用特殊字符标识文件结束,从而将同一个文件的物理块链接起来。 优点:解决了顺序结构中的所有问题,监理文件不必考虑文件的长度,文件可以继续扩展,便于在文件的任何位置插入或删除一个记录。 缺点: 1. 采用随机存取的方式是低效的,文件只能按指针链接 2. 可靠性问题,如指针出错 3. 链接指针占用一定空间 4. 读一块信息时,应将其中的指针分离出来,保证用户信息的正确性。 3. 索引结构(索引文件) 基本思想:为每个文件建立一张索引表,每一表相记录文件所在的一个物理块。 优点:能方便的实现文件的扩展,记录的插入和删除。 缺点:必须增加索引表占用的空间和读写索引表的时间,索引表的查找策略对文件系统效率影响很大。 索引表的管理: 当索引表非常大的时候,需要多个磁盘块存放,个磁盘块之间可以使用指针串联起来,当随机存取某个记录时,可能要沿链接文件搜索才能找到该记录的存放地址,很费时间。 EXT2文件系统构造 一个文件系统一般使用块设备的一个独立逻辑分区。EXT2文件系统把它所用的磁盘逻辑分区划分为若干块组(Block Group),并从0开始编号,每个块组包含若干数据块,每个块组除了数据块之外,包括5种用于管理和控制的信息块:超级块、组描述符表、块位图、inode位图、inode表。这些信息位于块组的前部,后面是文件的数据块。 EXT2的超级块(Super Block)用来描述EXT2文件系统整体信息的数据结构,主要描述文件在逻辑分区中的静态分布情况,以及描述文件系统的各个组成结构的尺寸、数量等。所有块组中包含块的内容是需要把超级块的内容复制到内存缓冲区内。 EXT2超级块由两部分组成 1. 基本超级块:EXT2文件系统的整体静态信息 2. 扩充块:反应所在块组的某些动态特性 超级块本身占用一个物理块1024B 基本块占84B 扩充块占20B 剩余的920B定义为元素长度为4B的数组reserved[230],作为备用 组描述符 记录每个块组的描述信息(在文件分配磁盘空间时需要使用到这些信息),这些组描述符集中在一起就形成了组描述符表。组描述符表可能占用多个物理块,和超级块一样的是,每个快中组块中,块组描述符的信息是完全相同的,而且它的内容也要读入内存。 块位图:记录块组的数据块的使用情况,它占用一个物理块。 因此,一个块组中数据块的最大数量是一个物理块的8倍,对于1024的物理块而言,其块位图就有1024*8位,表示8K个数据块,也就是说,一个块组的数据区最大容量是8M,如果EXT2文件系统使用的逻辑分区为100M,则它可以划分为12个块组,系统运行后,块位图装载进一个高速缓冲中,但是由于高速缓存空间有限,故只能装入常用的8块(缺省值)位图。 inode表和inode位图 inode表:一个块组的所有文件的inode集合,他可能占据多个物理块,每个块组可以包含的inode数目由超级块成员项s_inoders_per_group给出。 inode位图:反应了inode表中各项的使用情况,它的每一位表示inode表的一项,1为使用,0为空闲,与块位图相似。inode位图也装入一个高速缓冲中。 EXT2文件系统的物理结构 EXT2文件系统系统默认的物理块尺寸为1K,EXT2的块地址长度4B,所以每个间接块的索引表可以包括1024/4=256个物理地址。 直接地址:允许文件不大于12K 一次间接地址:当文件大于12K时使用,允许文件长达256K+12K 二次间接地址:当文件大于256K+12K时使用,允许的文件长达256*256K+256K+12K 三次间接地址:当文件大于256*256*K+256K+12K时使用,允许文件长达256*256*256K+256*256K+256K+12K=16G+64M+256K+12K 实际上,32bit操作系统单个文件最大支持到4G EXT2文件系统按照文件的逻辑块号为索引值查找数据块,逻辑块依次从0开始编号。 虚拟文件系统VFS(虚拟文件转换技术) VFS屏蔽了各种文件系统的差异,为处理各种不同文件系统提供了统一的接口,在VFS的管理下,Linux能访问各种文件系统而且实现了各种文件系统间的互访。 VFS的工作原理 物理文件系统:Linux支持各种文件系统如minix、ext2、ISO、nfs等被称为物理文件系统。 虚拟转换机制(VFS) 不同的物理文件系统有不同的组织结构和不同的处理方式,为了能够处理各种不同的物理文件系统,操作系统需要把他们的特性进行抽象,把各种不同物理文件系统转换为一个具有统一共性的虚拟机文件系统,这种转换机制称为虚拟文件系统转换,即VFS。 VFS不是实际的文件系统,它提供了处理各种物理文件系统的公共接口,通过这个接口使得不同的文件系统看起来都是相同的。 VFS超级块和VFS inode结构 1. VFS超级块的作用是把在各种文件系统中的表示文件在逻辑分区中的静态分布情况转换成统一的格式。 2. VFS inode作用是吧不同文件系统的活动文件管理信息,如文件类型、文件尺寸等转成统一的格式。 3. 公共操作函数接口,当进程向系统发出文件操作请求时,该文件可能是某个物理文件系统中的一个文件,内核通过VFS公共操作函数接口转换到该文件系统的相应操作函数。 VFS超级块 VFS超级块是在文件系统安装时由系统在内存中建立的,对于每一种已安装的文件系统,在内存中都有与其对应的VFS超级块,各种文件系统的超级块都是一个super_block结构体。里面的数据是在安装时由读取超级块的例程read_super()把某种文件系统的管理信息写入它的VFS超级块中。 VFS超级块主要包含以下几种信息 1. 文件系统的组织信息,如文件系统所在的设备号、块大小、块位数、文件系统署名等。 2. 文件系统的注册和安装信息 3. VFS超级块的前面各个成员项表示的是各种文件系统的公共信息,不同文件系统的特有信息则由联合体u的各个成员表示。 4. 指向对超级块进行操作的函数指针。 I/O控制方式 CPU控制方式 1. 程序直接控制方式 CPU一直对控制干预 2. 中断控制方式 CPU以字节为单位对I/O控制干预 3. DMA方式(Direct Memory Access) CPU以一组数据块干预I/O控制 DMA方式又称为直接存取方式 其基本思想是在外围设备和内存之间开辟直接的数据交换通道,在DMA方式中,I/O控制器具有比中断方式和程序直接控制方式更强的功能,DMA控制器中还包括传送字节计数器,内存地址寄存器等。 通道控制方式 1. I/O通道:一种硬件机制,指专门用于I/O工作的处理机,它有自己的简单与I/O操作相关的指令系统,如数据传输、设备控制等,通道执行的程序为通道程序。 2. 通道方式的处理过程:CPU向通道发出一条I/O指令,通道接收到指令后,从内存中取出本次要执行的通道程序,然后执行该通道程序,仅当通道完成了规定的I/O任务后,才向CPU发出中断信号,可以提高CPU与I/O的并行处理能力。 3. 通道分类,按信息交换的方式分为三类: a. 字节多路通道(中低速)(分时):字节为单位 b. 数据选择通道(高速):以块为单位 c. 数组多路通道(中高速)(分时):以块为单位 4. 瓶颈问题(通道不足)措施 a. 提高I/O设备的独立性,减少通道占用的时间,通常的方法是在设备和控制器间增设缓冲。 b. 增加通路,增加设备到知己之间的通路是解决瓶颈问题的有效方法,即把一个设备连到多个控制器上,而一个控制器又被连接到多个通道上。 缓冲技术 缓冲技术的引进解决了以下问题 1. CPU与I/O设备间速度不匹配 2. 减少CPU的中断频率 防止每接收一次数据就中断一次,先将数据放入缓冲区内,待满时再中断CPU,从而减少了中断次数。 3. 提高CPU和I/O设备的并行性 例如将打印机工作时CPU继续进行计算工作 缓冲的种类 1. 硬件方式 一般采用硬件缓冲器,如I/O控制器中的数据缓冲寄存器,成本较高,除关键部件外一般不采用。 2. 软件方式 在内存中开辟出一个具有N个单元的专用缓冲区,以便存放输入输出数据。 操作系统为每一个缓冲区建立一个数据结构,成为缓存控制块BCB(buffer control block),操作系统通过BCB对没一个缓存实施具体的管理。 缓冲的使用方式 专用缓冲:为某设备/进程专门设置的。 公用缓冲:为所有设备/进程设置的,为所有的设备/进程所共享。 缓冲的组织形式 单缓冲 双缓冲 循环缓冲 缓冲尺 设备处理程序与I/O进程 设备处理程序包括驱动程序和I/O中断处理程序。I/O处理程序通常是由I/O进程完成的 设备处理程序 设备处理程序是负责直接控制设备完成实际的I/O操作程序,设备驱动程序直接和硬件打交道。设备驱动程序包括对硬件的各种操作,在操作系统的控制下,CPU通过执行驱动程序来实现对设备底层硬件的处理和操作。 I/O进程 为了能够在处理机上执行设备处理程序,当前许多操作系统都设置了专门完成I/O操作的进程,属于系统进程。在不同的操作系统中,处理I/O操作和配置I/O进程的方式不同,大体可以分为三种 1. 为每一类设备设置一个进程,它专门执行这类设备的I/O操作。 2. 在整个系统中设置一个功能进程,专门负责对系统中所有的各类设备的I/O操作,也可以设置一个输入进程和一个输出进程,分别处理系统中的所有的各类设备的输入或输出操作。 3. 系统为每台设备建立一个I/O进程,它们分别执行设备各自的处理程序,被大多数操作系统采用。 I/O进程一般在系统生成的时候被创建,平时处于睡眠等待状态。I/O进程在两种情况下呗唤醒。 1. 当用户进程发出设备请求(I/O请求) 2. 出现I/O中断 Linux设备分类 字符设备:以字符为单位,输入输出数据的设备,并且以字符为单位对设备中的信息进行组织和管理。如显示器或者键盘等。 块设备:以一定大小的数据盘为单位输入输出数据,并且设备中的数据也是以物理块为单位进行组织管理的,如硬盘等。 网络设备:通过网络与外部进程或远程计算机进行通信的设备,如网卡等。 Linux设备的管理特点:物理设备抽象化,把物理设备看成文件,采用文件系统的接口和系统调用来管理和控制设备,Linux设备就是一种特殊文件,成为设备文件。 设备驱动程序 1. 功能 对设备进行初始化 启动停止设备的运转 把设备上的数据传到内存 把数据从内存传入到设备 检测的状态 2. 驱动程序虽然是在设备生产厂家开发的,但是装入系统后统一由内核进行管理,处于内核态,成为内核的一部分。 3. Linux对设备的管理和控制是使用VFS提供的各种数据结构和操作系统函数实现的。 设备注册 当一种设备安装到系统时,必须向系统进行注册,注册之后才能够进行使用,设备的注册是将驱动程序加载到系统中。 设备驱动实在系统启动时装载到系统中的 对于即插即用的设备,驱动程序作为程序模块可以随时加载到系统中。 两个设备注册表 1. 字符设备注册表 2. 块设备注册表 每个注册表都有255个表项,每个表项表示一个设备,都是一个device_struct结构,成为设备描述符。 注:设备注册表的下标时某种设备的主设备号,使用主设备号作为索引就可以从设备注册表中得到这种设备的驱动程序, 两个注册表的第一个表项通常为null,因为系统中不存在主设备号为0的字符设备和块设备。 设备注册是通过系统调用注册函数实现的,当设备需要撤销时,可以使用注销函数从设备注册表中删除。 Linux的I/O控制方式 Linux对设备的输入、输出过程实际上是在CPU的控制下主机(内存)与外部设备之间传送数据的过程,因此Linux的I/O控制有三种 1. 查询等待方式(轮训方式) 驱动程序不断控制设备状态,当设备准备好传送数据时,CPU执行驱动完成一次I/O过程,若设备未准备好,则驱动程序反复检测该设备状态,直到设备准备好。 适用于不支持设备中断的系统,系统支持的中断数目有限时,例如并行接口(打印机接口)的驱动程序中默认的控制方式就是轮训方式。 2. 中断方式 当进程向设备提出I/O请求时并不等待设备完成I/O操作,而是把CPU让给其他进程使用,自己则进入睡眠状态。在设备完成I/O操作时发出中断信号,系统根据中断信号调用相应的中断服务唤醒等待的进程继续后面的操作。 在机器支持中断的情况下,涉笔驱动程序就可以使用中断方式控制设备的I/O操作。因此,设备中断程序中处理包含各种操作函数外,同时还要进行各种中断处理的中断服务例程。CPU接收到来自硬件的中断请求后,则通过中断请求就能够执行设备驱动程序例程。 3. DMA方式 DMA方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和回复现场的过程,通过硬件为RAM和I/O之间开辟一条直接传输数据的通路,减少CPU直接操作数据的时间。 随手笔记 2019-05-11 评论 596 次浏览
我们,走散了(二) 贝爷应该不会忘记这件事情,因为这个让我佩服的五体投地的贝爷凑过去用舌头舔了舔玩偶耷拉的舌头,当着小狗玩偶主人的面,完了贝爷还一脸嘻哈,别个姑娘不乐意了,抓起玩偶就朝贝爷砸了过去,我只是看见贝爷很尴尬的样子,我想他一定是在反思自己怎么是这样的一个人。 贝爷虽然喜欢调戏姑娘,但是还是有喜欢的姑娘。这货时常会把写给姑娘的诗拿出来让我鉴赏,内容我是记不得了,不过高中结束的时候他写满了一个笔记本,但姑娘依旧是别家的。 不得不承认贝爷胆子很大,啥都敢干,不像我干什么都有些畏畏缩缩,我曾经也敢,后来开始怕了,怕很多的东西。 贝爷追过班上的一个姑娘,艺体生。高三下学期开始不久,艺体生回到班上补习文化科目。那个姑娘喜欢玩游戏,英雄联盟。于是贝爷把所有空闲的时间都砸到网吧里去练技术去了,成绩下滑相当快,能赶上火箭的速度,这并没有结束,基本上每节课贝爷都把座位换到那个姑娘的旁边,这一点在那姑娘失恋的那段时间体现相当明显,贝爷坐在旁边拉着人家的手一个劲的安慰,那姑娘坐在那里嘤嘤的哭,整上午整下午的坐在那里一天,连尿尿这种人生大事他都能一直憋着,我不禁感叹贝爷的忍耐极限,在此向贝爷致敬。只是不知道那姑娘为啥让贝爷拉手却又不同意贝爷的死追烂缠,兴许这是很多姑娘的通病,给点甜头吊足胃口,只是这个世界上不是所有人都像贝爷那样,胃口大一点的说吃掉就吃掉你了,姑娘们可明白。爱情可以有,但是要责任和承担与之并行,否则那只是情爱了。在这个走肾不走心的时代眼睛要擦亮一点,那是你们的下半辈子的归宿。 贝爷干的事有些搞笑,他把他老妈买给他解暑的冰淇淋啥的统统都拿给人家姑娘了,人家照单全收,贝爷陪姑娘减肥跑步,满嘴跑火车,一脸献媚,我晚上体能训练的时候常常见俩人不是坐着聊天就是慢慢晃悠,我实在是看不下去,也不愿去当那个千瓦的大灯泡。 贝爷有天突然问我,他说只有一个多月了他要不要表白,我一脸懵逼的问他那你俩在一起瞎逛个毛线,感情就是贝爷自个儿厚脸皮,我说我没啥经验,不懂。 想来贝爷内心是苦苦挣扎了许久的,他终于在那个周末拨通了那个姑娘的电话朝着麦大吼了一句,吼得有些撕心裂肺,反正我是干不出来,这不符合我的逻辑。 “我喜欢你!做我女朋友好不好?!” 当贝爷吼完这句话后,那姑娘再也没有联系过他…… 这时候贝爷才开始疯狂的啃书,然而并没有什么卵用,复读之路上注定有他的脚步和孤独的背影了。 比起贝爷,我好过多了,下学期有个漂亮的姑娘陪我在食堂吃了一个学期的午饭,姑娘姓唐,我一直称呼她糖姑娘,一个可爱、漂亮、身材很棒的姑娘,请不要怀疑我的纯真,我就是和糖姑娘一起吃个午饭,虽然她老是以不能长胖了的理由把肉一个劲的往我的碗里夹。我不挑食,和糖姑娘一起吃饭的时候我的饭量出奇的好,双份。我能吃到食堂只剩下两三人,糖姑娘老是笑我吃得多,说我浪费粮食,我从没反驳过,我吃得多是事实。高三突然的结束后,我居然有些不习惯,饭量骤减,一份的量都不到。 糖姑娘喜欢着齐膝的连衣裙,不管是远远的看着还是凑近说说话很清新,她就是一个这样的姑娘,我曾开玩笑的说裙子的肩带会不会断掉,糖姑娘也会小脸微红说我是个不正经的家伙,我笑笑,装作很遗憾的的样子说太可惜了。 很感谢糖姑娘从我的生活中路过,她的笑能带走我所有的不高兴,她时而扎着马尾,或者长发披肩,甜甜的笑容和银铃儿般的声音,我想起她的时候总是会笑那时候的我运气太好,能遇到那么有意思的姑娘。后来开玩笑问她,那时候我有没有机会成为他男票,她肯定的说,有。 也许,当糖姑娘看见我送的那个牛奶杯会想起我这个很能吃的货。 高三下学期的压力很大,然而不像以前那般每周都有时间去爬山了,只能抽空释放一下压力。 我曾和班上的一个男生约定中午放学不吃午饭就以最快的速度爬山,那一次的记录是从校门口到山顶用了二十七分钟,那一次我几乎是手脚并用才上去的,也是那一次才明白一步一个脚印是多么的实在。下山用了两个小时,我俩绕着小镇走了半圈。 真正差点把我弄休克的是和锐哥等人爬山,我非得一口气跑上四百多步的石阶,上是上去了,差点儿没有机会走下山顶,就那么的摊在阳光下晒了好一会儿我才缓过气儿。 锐哥理综很棒,好的没话说。个子中等偏上,瘦削,细胳膊瘦腿是我对他的外表的描述,沉默是他最大的优点,他能静得下心,虽然他也在复读的路上留下了脚印。 临近毕业,学校抽了一天的时间给我们拍照留念,全班合影留念的时候老苟没来,他是后来给P上去的。 这天贝爷依旧很疯狂,他和一姑娘打赌一口气喝掉一罐蜂蜜,然后真的一口气喝掉了,只是贝爷喝完后着急到处找水喝,随手拿了个杯子就喝,那个杯子是向姑娘的,后来贝爷告诉我说他是故意的,我不禁感叹贝爷的套路深。 班级合影留念后基本上就是各自发挥,我老远看见一排男生围成半圆站在一起合照,我也就毫不客气的凑了过去,难得有机会凑到一起留影,拍完后我说洗了给我留一张。 唯一的合照是和物理老师,很壮实的一个中年人。 安排考试程序,熟悉考场是避免不了的,我们得到市里面去参加高考,所以就环境而言是陌生的,住宿在宾馆,我和一哥们儿被分配到了478号房间,这个号实在是不敢恭维,也就一笑了之。 我们是于高考前两天去市里的,出发的时候天空飘着小雨,路上行人密布,三辆警车开道,十三辆大巴随行。 两天的时间我一刻也不敢停歇,把能复习的过了一遍又一遍,虽然我复习的一个也没有考到,但是至少我的内心是安稳的。 关于考试,就是很紧张的环境下很紧张的作答。 当录取通知书陆陆续续的下发,我们一处一处的瞎逛,不经意间在一同学家里看见了一群男生站成一个半圆的照片,我觉着眼熟,扫过照片的右下角的时候,我见着了我衣服的一角残留在照片上。那一刻,我所构造的三年轰然崩坍了,我强忍着没让眼泪窜出眼眶,像什么事都没有发生一样把夹着照片的相框放回桌子上。 三年就这么的结束了,那时候还有些不敢相信,但是那段时光真真切切的走远在时间里了。自从散开后我一直还能联系着的就是这些小伙伴了,姑娘不在此列。 我们随着时光的变迁,渐行渐远,时光模糊了你我的背影,生活又给罩上浓雾,从此便真的陌路了。 我们,走散了。 几人行 于2017-04-21夜 后记 几年前曾答应自己,整理一下过去的事情,尝试过用假名替换朋友,却没有想象的那般有趣,搁浅两年多后,前些日子又翻出以前的稿子整理了一下,觉得不写完有些过意不去,毕竟是给自己承诺过的,算起来已经不守信用了,但是我还是想慢慢的把这份回忆完成。这是一个给自己设的坎,得迈过去。 妄尘集 2019-05-07 评论 254 次浏览
我们,走散了 一段明亮却又略显灰色的年华,时间的临近,无情的光阴卷着一群大小伙浪向火红的六月。这时光,带走了我们肆无忌惮的欢笑,流走了我们痴人说梦的理想。我们曾经的那些欢声笑语,那些争执,那些斗嘴都在时光的流逝下抛弃了我们,不带有丝毫的留恋。 我们努力过,拼搏过,也放弃过。我们有过酸甜苦辣,有过欢声笑语,也有过爱,有过恨。执着的过程属于这个世界里的我们,我们需要更多的磨砺,需要这个世界不断地打击。成长就是这样永不停歇进行着残酷的筛选,你活不下去的时候总是还有人坚强的站在那里。 留不住的时光,在指尖随着阳光跳跃着向前。 青春的风一路高歌。 逝去的岁月里,有着自己的回忆,甭管那些回忆是好是坏,只要是自己觉得珍惜的,那便是好的。 待得黄昏,独自一人在宁静的湖畔看日落后的余晖。 昨天的已经逝去,无论是好是坏,过去了的就是过去了的,谁也没法改变。 夏季的午后,站在炎炎烈日下,仰望淡蓝色的天空,你是否还记得在同一片蓝天下,过往的回忆。 回忆,回忆就像是波澜壮阔的大海里的一滴水,我们能记着的,只是冰山一角罢了。这个世界里,路人甲和路人乙多如牛毛。 手中的笔,能记得的也只是冰山一角里的一角。 回忆总是在睡梦里一次又一次的重复,像是一幕幕青春的话剧。 时光易碎,青春易逝。 年少的我们在时光里坚强的行走着,‘活下去’也许成了我们最强的信念。 青春没有挽留我们,就好像不再过儿童节那么自然,就像第一次摆脱儿童节时的洒脱。 有人说,青春是一首让人如痴如醉的歌,也有人说,青春是燃烧着的火把,还有人说,青春是在风中摇曳着的蒲公英,看起来美丽,实际上却身不由己。 这个世界上没有不散的筵席,同样的,也没有不散的青春。 青春如歌,一曲接着一曲,到处都有青春的气息,那婉转的音律飘荡在这个世界的各个角落。 我们,从童年向少年靠近再远离少年再靠近青年,是的,正值青春年少。 年轻且富有活力。 执着且坚忍不拔。 青春是一首有生命的诗,散发着无穷无尽的魅力。 再怎么美好的青春,也会成为回忆,成为一个人的回忆…… ——写在前面 我正处于年龄说大不大,说小也不小的年纪,就像约定好了不去回忆却又忍不住细细筛选,很多时候烦恼苦闷,偶尔有个老同学聊聊天就很知足,前些日子同贝爷瞎聊了很久,其中一些事情较为有趣,便许诺自己整理出来,集成一记。本来是我引开的话,却被贝爷放大,聊了很多,什么都聊。贝爷这个词儿来历简单,贝爷单名“贝”,加之那时候喜欢站在食物链顶端的男人——格里尔斯,所以这是一个略带调侃的绰号。他是一个个子不高,颜值不错的小伙儿,言语诙谐幽默,总能和姑娘找到话题聊上半天,所以这个故事就这样穿插着开始了。 历经两次中考,我终于拿着择校生的名额上了离家较远的一所高中。两次中考,两次惨淡的经历,两次被现实嘲笑。 这个故事略有些长,我也就不挑三拣四了,先从两次中考说起。 说起中考,那个年龄阶段的压力不亚于高考,首先得益于自身的认知程度不够,其次老师和父母的语重心长,想来不用说,大家的脑海里已经浮现出老师和父母的谆谆教诲了,言辞之犀利,用词之狠毒,若是诸葛在世也会为之感到颤栗吧,毕竟那似乎是无穷无尽,像是蜜蜂在耳朵边上筑上了巢,脑子里混混沌沌。 且让我算一算第一次中考我多少岁,掰完了手指算出来大概是十五六岁的样子,那时候我的脑子里还没有什么大的概念,不知道自己需要什么,不知道未来的是什么样子,整天按部就班的过活,完全一副案板上的肉——任人宰割的模样,那时候泡网吧打游戏,整天满脑子都是游戏,没人知道我第一次中考是什么样的。 我自嘲地笑了笑,那个时候的自己真的是太幼稚。 中考的时候每一堂考试我都是提前交卷,从来不去管试卷上答题的对错,只要是考卷没有留上空白感觉就万事大吉了,然后就飞奔向网吧,用“飞奔”一词绝对没有夸大,那速度真的是让人叹为观止,生怕晚了一步就没有了位置,然后一直打游戏打到下午开考前五分钟,好像那时候打游戏比吃饭还重要,感觉自己像世外高人,不食人间烟火。做梦都是自己在打游戏升级,那种激动的心情难以言表,如果那时候知道买彩票能中五百万的话,可能升级会比中了五百万还要激动。 还好,中考落榜把我拉回了现实,原来我也是要面对生活的,不能继续学业,那么只能外出务工,一想到整天顶着个太阳在工地上吭哧吭哧干个不停就心里打鼓,用了大半个月才下定决心,外出务工。可就是在我做出决定的时候,老妈打电话问我复读怎么样,我当即一口应下。 于是,复读的日子开始了,依旧是有些浑浑噩噩,但是至少还知道东南西北,勉强拿下了一张通往高中的通行证,这个通行证的费用让我很是自责,但仅仅是自责罢了,并未有什么实质性的行动,复读的那一年,我沉迷于网络小说。 终于要踏进一年前就要踏入的学校了,看着学校门口毛笔写就的苍劲大字,心里莫名的一阵激动,似乎这三年要是不干出个啥样那真是对不起自己,对不起人民币。 高中的生活也就这样正儿八经又似乎是糊里糊涂的开始了。 在我没有来到这个学校之前,内心是无限憧憬的,到了这个稍显偏远的地方才发现以往憧憬的似乎都是别人的学校,镇子的主干道整个被挖开,土堆满了道路两旁,破败的教学楼上能够看见雨水冲刷的污痕,还好,有几颗不大不小的树桩映衬,不显得那么荒芜。 报道的那一天正赶上下雨,学校大门口的那条小道凹凸不平,积满了雨水和道路两旁小食铺的污水,水面上还能看得见油花。小食铺的存在得益于学校食堂重新修建,另外,还有两栋教学楼和一栋宿舍楼的修建不致使未开学的校园显得那么冷清,附带一个不算大的运动场。 报道的流程简单至极,凭通知书录入个人信息,交择校费,拿到分班信息后就静静的等待正式开学。 等待开学的日子是相对快些的,要到一个新环境里心里难免有些忐忑和不安,辗转几个车站之后,我再一次站在了这个校名用毛笔写就的校门前,抬头望了望了那陈旧的字迹,深呼了一口气,穿过了不算宽敞的通向教学楼的水泥路。 寻了几分钟,终于发现了一楼楼道口高一十四班的踪影,斜斜的从门口望去,老旧的漆黄讲桌落在教室前面的讲台上,讲台下课桌分布均匀,中间四列,两边各两列,隔出两个过道,教室里已经不少人落座,并叽叽喳喳的说个不停,唯有前三排空了一大半的位置,我故作淡定的坐到了中间第一排靠右边过道的位置,并自顾自的拿出事先准备好的书翻看起来,不一会儿便觉得有些无聊,环顾四周,似乎所有人都叽叽喳喳的聊个没完,目光偷偷掠过刚踏进教室便瞥见的一个姑娘,齐耳的短发,略带坏笑的古怪模样,这都不是重点,重点是这个姑娘让我有一种惊艳的感觉,白皙的皮肤,清秀的脸庞,加上坏笑的模样,深深的吸引了我。我以为,我和这样的姑娘说上话都是很难的别说是随意的聊聊天了,不过这都是后话了。 班主任进入教室的步伐和姿势是极其霸气逼人的,踏进教室的瞬间,教室便鸦雀无声,在教室里回响的只有呼吸声和班主任那霸气的脚步声,似乎是皮鞋,卡其色上衣,一副厚重的眼镜彰显出了其学问和阅历。 极其简短的自我介绍,然后又以为什么上高中,上高中该有怎么样的觉悟为引,展开了纵横中华上下五千年历史的论证,最后他说,他是我们的班主任兼化学老师。 班主任姓苟,后来我们背后都亲切的称呼其老苟,当着他的面那是万万不敢的。 老苟简单的安排了几个临时负责人,从图书馆把所有的教材课本领回班级,点名并分发给每一人,然后清点人数分配寝室,结束一天的新生工作,次日正式上课。 男生寝室正在修建中,所以我得为自己的住所寻个好地方,恰巧一个高我一届的老同学也要租房,于是我俩凑合着在出校门右拐一百米处的农家小院租了个小单间,简单的搭了两个铁架床,一张大方桌几乎挤满了狭窄的空间,租金六百元一学期,因为房主一再要求需要先定下来,交了一百元定金。住宿的一大难题算是解决。我拿着锈迹斑驳的钥匙在门上的锁孔里试着开了两次,挺好使,生锈也就无所谓了。 我琢磨着要不要出去逛一逛熟悉熟悉周边的环境,我是极不情愿漫无目的的瞎逛的,但是为了空闲的时间有地方消磨,我也只能沿着大道逛来逛去,镇子不大,所以所谓的大道也就是一条横亘在中央的两车道柏油马路,道路的两旁是些各式各样的小商铺。作为一个资深网民,我需要找到的是一处能够让我在网络世界里畅游无阻的地方,中天网吧作为首选列入了我的冲浪名单,原因有三个,一是地方够大,二是离学校够近,三是我目前只发现了这么一处。 正式上课时并没有像我预想的那样会排座位,所以说第一排的位置我是得坐上一段时间了,反正我同第一排的位置结下了不解之缘,我也不知道为什么…… 月考之后成绩一出来便开始了座位的编排,首次由班主任亲自操刀,大刀阔斧的指挥着每个人的去向,反正我感觉老苟像是在下围棋,更形象一点应该是在下五子棋,因为他把男生女生错开编排了,目的是减少男生女生扎堆聊天的机会,可惜事与愿违,没有遂老苟的心意,虽然老苟也是绞尽了脑汁。 这次的座位编排实际上我是窃喜了一场的,因为进入教室我第一眼瞥见的那个姑娘坐在我同桌的后面,换个方式说,那个姑娘的座位在我的左后方。 没有半小时我们已经将周围的人的名字给弄清楚了,她,向沫,在没有认识她以前,感觉这类漂亮的姑娘应该是心高气傲,不屑与我等刁民为伍的,咳咳,在这之前确实是没有怎么和姑娘有过交集,虽然有一个暗恋着的姑娘。 这个蛮清秀的姑娘后来我给取了个不太好听却又十分霸气的绰号——向色狼。 其实这个源于我的绰号,我的绰号很别致——色狼。 “色狼”这个字眼算是被我给颠覆了,如果有一天很多姑娘笑着称呼你色狼作为一种调侃而非谩骂时就能深深的了解那是一种什么样的体验了。 这个绰号是从初中复读的那一年给带过去的,因为班上有一个和我在同一所初中同一年级的姑娘,她的好友同我关系不错,聊着聊着,就把色狼这个绰号给带到了高中。 这说起来又得牵扯到一件较为低级趣味的一件事,复读那一年,我和一几个男同学相互打趣,他们给我取了个绰号“法国老流氓”,其实名字还是比较长的,但是介于此文不偏向低级趣味,就点到为止了,其中一个小伙伴头发自然卷,被取名“卷毛阴”,我听这个词很是懵逼,旁边的姑娘都笑开了,而我依旧不知所然,看来那个时候的我真的是非常纯真……后来有人提示我让我倒着念,我这才释然,我给送我外号那小伙伴弄个了“中国老流氓兼棉花都日不动”的绰号,因为我我绰号全称是“法国老流氓兼钢板日穿”,我这流氓的称号只被保留前半截传开了,为什么是法国老流氓,而不是其他呢?这来自于当时学的那篇文章《我的叔叔于勒》,后来我自号流氓,姑娘亲切的打趣我色狼…… 向沫这姑娘英语出奇的好,借学习之名向姑娘请教问题便显得光明正大了,偶尔课间能聊的哈哈大笑引人侧目,怎么说呢,和漂亮的姑娘聊天很惬意,要是姑娘言语幽默一点的话那估计是停不下来了,能从上早自习聊到下晚自习,就这么自然,然而,那并不是我能达到的境界。 九门功课着实让人有些压力,好在九门课只是持续了一个学期的时间,高一下学期便文理分科了,当时的我一点也不像很多小伙伴那样纠结,让我学文科背那么多东西,那我只能大呼“阿门,干掉我吧!”我实在是不愿意去背绕口令一样的历史和政治,但是地理书上歪歪扭扭的地图我还是不抗拒的。 高一的时候周末还是双休,那时候我一个月回家一次,所以周末去哪里玩儿成了个大难题,中天网吧是首选,依旧是打游戏,却没有那么废寝忘食的那种状态了,但是玩起来了一时半会儿也放不下,也许我现在应该称之为情怀,一款游戏我能坚持玩到大学,我也是比较佩服自己了,游戏浪费了我绝大部分的时间以及数额不小的软妹币,倘若那时候我有把用来上网玩游戏的钱用来泡妹子,也不至于现在依旧单漂,可那时候我偏不,偏不!一根筋呐! 现在回想起那个时候网吧的火爆程度令人咂舌,一台电脑后面两三个人排着队要玩,还不算看客,这些人里面绝大部分都是未成年,所以啊,新事物的出现总会有那么一些人因此改变人生的轨迹,不完全都是好的。 我和向沫这姑娘聊天时我总是笑得很大声,笑声大是我一贯的风格,不仅声音大而且很别具一格,笑声总能引得旁人注意,说我笑得夸张,不过和漂亮的姑娘聊天笑得再夸张那都是可以理解的。 和漂亮的姑娘聊天固然是很美好的,但是这也得是在肚子不叫唤的情况下,不然说话的力气都没有,那还怎么愉快的聊天? 吃东西这个事情大家都有经历过,我就不做详谈了,反正就是米饭就着菜往嘴里扒拉就好了,我就啰嗦几句就好,我吃饭添米饭的次数让老板很尴尬的说:“让你跑路了,下次给你换个大碗。” 那时候我正处于长身体的时候,所以大家要理解,而这也是改变不了的事实——吃得多。 吃饱喝足后打打游戏上上网成了我生活的标准配置,而没事儿喜欢独自跑去上上网也为自己埋下了安全隐患。 依旧是双休,星期五晚上不上自习便开始放假,我一个人呆着哪能像现在这么耐得住孤寂,想着出去上上网,反正租住在校外,想啥时候回去都可以,因为没有带钱,零时借了十元钱的网费和一个中天网吧的会员,买了瓶矿泉水,老板很厚道的找了我九张一块钱的纸币,攥在手里一沓子,随手塞到了牛仔裤的裤兜里。 网吧的空气是十分的闷热和浑浊的,不太能够理解那个时候的我是怎么能够忍受得了的,并且还是那么兴致勃勃的通宵达旦。我想大部分的人去网吧的目的很简单,聊天把妹,然后除了游戏就是游戏,在金钱允许的情况下可能愿意一直面对那台不大的显示器罢…… 虚拟世界消磨时间的能力大家是有目共睹的,一不小心,诶!怎么这么快就到中午了?诶!怎么这么快天就亮了!所以,当我意识到我要睡觉的时候,看了看屏幕右下角的时间,已经快凌晨一点了。于是,果断的结账下机,喝了两口水,揉了揉干涩的眼睛,便要沿着过道出去,却不料被值班的网管叫住了,说前门关上了,得从后门出去,尽管内心是一百个不情愿,但我还是摸黑下楼,穿过黑黢(qu)黢(qu)的菜市场,好不容易看到了通向校门口——也就是我的租住地的那条路上远处微弱的灯光,心里才踏实了些。网吧晚上是不敢明目张胆的收留未成年人的,虽然大门关上了,还有后门可走,在心里把网吧老板赚昧心钱的行为谩骂几遍之后,心里算是舒畅了些。 我正准备抬脚往租住地走的时候,从灯光那边来了四个人,似乎和我同方向,这不禁让我缓了口气,我怕黑,虽然壮着胆子也能吭哧吭哧走回去,但是有几个人同行那就最好不过了,于是我就放慢了继续往前走的脚步,等他们慢慢的走过来,距离不长,大概十几秒就有两人和我并排走了,我正想搭讪,忽生警觉,但为时已晚,我的右边脑袋已经被莫名硬物敲击,那时候我整个脑袋瞬间空白,耳边嗡嗡的响个不停,右半边脸感觉到热乎乎的东西,我伸手摸了一下,有些黏糊糊的,闻起来甜丝丝的,略带腥味,我知道,这回我算是撞枪口上了。 还不待我反应过来,前边的两人也迅速的靠了过来,四个人架住我的胳膊把我推搡到了路边沿的台阶上,将我按在地上不由分说的拳打脚踢一顿,我死死的护住脑袋,任由他们拳头砸在我背上,踢在我腿上,那个拿莫名硬物的小伙子依旧使用他的武器狠狠的往我背上敲了两下,并给其他三人说,这货还挺硬要不要再给我头上来几下,估计有个人心虚了,说弄死了就麻烦了,于是,我算是暂时死不了了。 待四个人觉得把我收拾的差不多的时候,我又被四个人架了起来,其中一个人问我有没有钱,他是这么问的,兄弟,借点钱呗。 我一个穷苦老百姓家里的穷孩子,能有啥钱,我否认了我有钱,不过我说的是实话。 其中一个人似乎比较能主事儿,说了句继续打。 于是我又开始经历暴风雨般的袭击了,那一刻我脑袋清醒了许多,感受到落在身上的攻击带来的疼痛,不过那一刻却觉得很爽,这并不是我犯贱或者犯二,那个时候真是这样想的,我记得真真切切。 终于,我觉得有些扛不住了,大吼了一句,我有! 这似乎是把那几个混球给唬住了,也许是我突然地爆发让他们感到诧异,反正他们整体呆滞了大概十秒,十秒的缓冲让他们意识到他们的工作还是得继续的,我再一次被四个人架了起来。 他们以同样绅士的方式向我借钱,并表示说他们大老远的跑过来不容易。而我不一样,我是被揍的扛不住了,出此下策来避免继续挨揍,我依旧是否认我有钱。几个混球终于不陪我玩儿了,估计揍人也是一件较为消耗体力的活儿,几个人开始在我身上的口袋里翻来翻去,我觉得他们的素质还是不错的,至少搜到我的钥匙还是给我塞回了兜里,而不是随手扔掉了。终于,我那一沓子九块钱起了作用了,在此我再次感谢那个找我零钱的人,不管你是大爷还是个姑娘,谢谢你。黑暗的情况是没有办法数钱的,四混球之一拿着钱跑路灯下去数钱了,剩下三人围着我,并想争夺我手上的手机,奈何三个人没从我手上拿走,不是我劲大,实在是手机这玩意儿不属于他们…… 三个人抢我手机的时候,其中一个人掏什么东西,钥匙碰的哗哗的响,我心里一阵打鼓,该不会是刀?!我都做好拼命的准备了,那货却拿出个手机点亮了屏幕,估计是看看时间。这时候那个去数钱的货回来了,对着我的腰部就是一踹,我得感谢这货,虽然他不是帮我的,但是我依旧得谢谢他这霸气无比的一脚,借着冲力,瞬间冲破了三人的包围,我没有放弃这个绝无仅有的机会,撒开脚丫子狂奔了起来,他们意识到我跑了,迅速地追了上来,一阵玻璃摔碎的声音在身后响了起来,玻璃渣子溅到小腿肚上生疼,那时正值冬天,身着厚牛仔裤。 我知道那个差点干翻我的武器是个玻璃瓶,我一路没命的狂奔,似乎听到了风的声音。 那是我有史以来最快的速度,四个混球被我甩在了身后的夜幕里。 当我站在出租屋门外的时候,远处的狗叫声让我很是忐忑,将钥匙插进锁孔这样简简单单的动作我耗费了两三分钟,虽然有些看不清,但是更多的是慌张。我窜进好不容易打开门的房间里,迅速反手将门关上,累瘫在地上,背靠着门坐了好一会儿,直到远处的狗叫声消失,我才徐徐站起打开灯,坐在方桌前缓了好一会儿,拿了镜子照了照脸,右半边脸几条醒目的血迹,已经干掉了,我想看看头上的伤口,奈何眼睛不能拐弯,只能把镜子敲成两块照着看。三角伤口,一大撮头发被砸断粘在伤口边缘,伤口一圈像米糊一样的血迹,我以为自己快挂掉了,但是依旧弄了热水把脸擦了擦,然后抱着挂了就挂了的心态睡着了。 第二天一觉到天亮,还活着,内心是有些小激动的。 就近在小诊所简单处理了伤口,就回家了,被抢劫的当天晚上,父母外出务工回家。头上多了个补丁怎么能瞒得住,老妈问我的时候我就老实交代了,可惜他们并不相信,说我是不是打群架去了,这个时候我大概知道在他们那里我被定位在什么层次。 被抢劫,被群殴,想来这些事遇到一件便是不易,却让我碰上了。因为我是个没有背景没有关系的穷学生,再加之害怕被报复,这件事情就不了了之了,只是我头上的补丁跟着我大概一个月,为了保留我帅气的形象,我弄了顶黑色的编织帽戴在头上。 被群殴让我连续一个多月很是混乱,看到成群结队的人就觉得他们有什么企图,内心的紧张和警惕暴增,那真叫一个折磨,还好我并没有变得消沉。首先,我得感谢这四个混球,这件事让我意识到了以往不可一世的自己是多么的无知,多么的懦弱,多么的不堪一击。 我对自己进行了深刻的反思和剖析,得出了一个可有可无的结论——我很弱。从思想到肌肉似乎都不能体现我的懦弱,那种懦弱似乎是扎根在骨子里的,极度的自卑和不敢面对。 我决定从肌肉开始变得强大,时隔一天,我开始了自己的训练计划,二十个深蹲、十个俯卧撑。这样的运动量让现在的我看着想笑,不过我也深深的知道,只有经历过才知道成长这一过程的重要性和必要性,不论开始的时候是多么的弱小,种子会发芽,也许成不了参天大树,但是一定能够通过汲取养分茁壮的成长,强壮的茎干,茂盛的枝叶。 这件事对我的刺激有多大呢?我用人生的转折点来形容毫不为过。 我意识到了体能训练的重要性,并且一直坚持着,现在也是如此。想起那时候十个俯卧撑、二十个深蹲结束都是一额头的细汗,不禁唏嘘,生命就是这样的神奇。高中结束的时候,一些人说很佩服我,有两点,一是坚持锻炼了三年,二是我背单词的方式让他们叹为观止。 这倒不是因为我的英语成绩好,相反,我的英语成绩一塌糊涂,但是我就是喜欢死磕,就是不放弃,上英语课从来是笔记最全,但是,但是上天并没有眷顾我这个可怜的小伙儿,我看着试卷上的单词依旧是不知所云,这些都不能阻挡我学习英语的成神之路…… 高中的作业本是无格本,就是那种没有格子线条的作业本,就像美术作业本那样。我背单词就用这样的本子一个单词抄写十遍,我喜欢写的紧凑些,所以一页下来密密麻麻,密集恐惧症患者要是看到的话,会口吐白沫吧? 我以这样的方式背单词,从初中到高中,只是高中的时候格外卖力一些,直到高中结束,我攒了四五十本我抄写满单词的本子,那是一个什么样的概念呢,我拿去当废纸买,四五毛钱一斤,所得是三块五。这还不算中途写完就随手丢掉的,我并非刻意积攒,只要我想,两天时间我就能写完一个本子,所以对我来说并不是什么值得纪念的东西,曾有同学毕业时问我要了一本较为工整的留作纪念。用掉的笔芯我留下了大概三十多支,那种大鲨鱼的粗笔芯,小笔芯都直接被我给忽略了,那种笔半天一支,不值得收藏。也许很多人读完大学未必能用掉那么多笔芯吧。 我很笨,但并没有因此先飞,反而连奔跑都很困难。但是这也极大程度上磨练了我的耐心,就如同喜欢上一个姑娘,她们总是被我先磨去耐心,恋爱这件事儿能着急吗?难道姑娘都是这么着急把自己交接出去吗?反正我是搞不明白,也许很难有机会弄明白了。 说起姑娘我就有很多话要掰一掰了,虽然老大不小的年纪了,但依旧没恋爱过,不是说我不喜欢姑娘,实在是没有遇到。很多人问我什么叫没有遇到,难道人家姑娘缠着你说非你不嫁?非也非也,虽然我长的不帅,但是也有姑娘追过,那时候一天收一封信,连着俩月,不论我怎么侧面说我不喜欢她,那姑娘依旧不依不挠,被那个姑娘强行拉手,出其不意的拥抱,依旧没能拿下我,骚年们,说实话,换做是你们能做得到吗,我问了身边一些朋友,他们对我的行为嗤之以鼻,说换做是他们就顺势推倒了,可我偏不……我说我有喜欢的姑娘,可那姑娘还是很高兴的说,说她会让我喜欢她的,她说不要我哭。 最后,我的当面直接拒绝让那个姑娘哭了两周,两周。现在想想居然还有姑娘为了我这种情商低级的货伤心两周,我都不敢相信,而这确实是存在过的,依稀记得那个姑娘很可爱,长发,声音很好听。从没有和那个姑娘有什么联系,想来我喜欢的姑娘看待我的时候是满眼的不屑吧,也是,我这样什么都欠缺的小伙儿满大街都是。 所以说,我说的没有遇到是真的没有遇到,我不会花言巧语的哄骗,我只是很安静的存活着。 既然说到了我喜欢着一个姑娘,这点儿时间就来聊聊她吧。 遇到她的那一年我从新疆回到四川老家,并就近读书,同年,她从北京回来,到班上就和我同桌,似乎同桌都是带些感情的。 如果问我为啥喜欢她,抱歉,我也不知道,而且这一喜欢就是八九年,八九年是什么概念呢,假如你有个上幼儿园的小家伙,八九年之后就上高中了。这是怎么样的一种痴迷我不知道,和她的接触并不多,远不及我和陌生人搭讪聊得多,记得大学的时候她失恋了,那天Q聊到晚上十二点,我以早些休息为由结束了聊天。 我不太敢面对她,应该是有点自卑,也没有什么好的理由去搭讪,只有她生日,年三十的时候我敢光明正大的拨通电话,瞎聊两句,一般不会超过一分钟,迫于语塞,不得不结束通话,每年如此,直到一五年她说不要再联系她了,我答应了。 就这样,我喜欢的姑娘牵着她喜欢的人的手漫步在街头,那是怎么样的一副场景呢?我想象不出来…… 这份执着被喜欢的姑娘扼杀,也算是圆满,至少她没有对我谩骂,不理不睬。 看来有缘千里相会也只是偶然。 我该怎么去形容自己呢?我是没有什么合适的词汇。记得那时候最激动的时候就是她生日的时候,早早地准备好礼物,恨不得时间过得快一点,那是怎么样的心情我早已忘记。曾两次买了苹果给她,只是因为听说她喜欢吃果冻,我逛遍了那个小乡镇的每一个商店,似乎买了喜之郎。我并不知道苹果有什么意思,我只知道一句俗语“一天一苹果,医生远离我。”,而并非他人谣传的那样代表“爱”,懵懂的年纪连喜欢都弄不明白,何谈其他。 初三的那一年,我收到她送的一个橘子,我实在是弄不明白啥意思,我千方百计想保存那个橘子,可惜方法并不奏效,后来我就保存到我的肚子里了,味道不错。每当临近我生日的时候,我内心忐忑,我想她会送给我什么礼物呢?想的整宿整宿的睡不着觉,然而我并没有收到什么,我宽慰自己,或许她以为是农历呢?然而,我想多了。 失落,似乎吃饭都难以下咽,牙齿像注了铅一样难以开合,无精打采,昏昏沉沉。 这些都阻挡不了我喜欢一个姑娘,初中中毕业的那天,我没有参加班级的聚会,偷偷的在她所在班级的窗前瞎晃,然后去商店特意买了不冰镇的绿茶,目光遍历整个教室也没看见她,后来有人问我找谁,我说了名字,发现她坐在窗户下的死角,脱离了我的视线,绿茶被她随意的放在了桌子一旁,那天晚上我在顶楼的台阶上看夜幕里的星星,直到下晚自习。 毕业后五年不曾见过她,再见她时是我循着消息逛了大半个广场的收获。她,依旧。 关于我喜欢的那个姑娘就回忆至此,我怕到时候我不信守承诺又打扰到了她的生活,所以转移一下注意,讲一讲贝爷。 我和贝爷认识是较为有趣的,我和贝爷同班,却不是互相打个招呼那种认识。 英语课上因为杨老师调节一下气氛,贝爷自告奋勇的说要唱歌,都站到讲台上了,说还要个人合唱,我不幸的被点名了。唱了任贤齐的《风云决》,那叫一个撕心裂肺,导致杨老师再也不敢在课堂上用唱歌来调节氛围了,用杀猪的惨叫来形容我们的歌声那都有些不够惨烈,关键是我俩唱的太沉醉,杨老师都不好意思打断这惨烈的歌声…… 这算是和贝爷的友谊拉开了序幕,我这人没啥优点,就是脸皮厚,总喜欢到他家离去蹭吃蹭喝,煮点什么排骨肠什么的,而这货也不当那是自个儿家,下手都不客气,整的我都不太好意思去蹭饭,贝爷这招绝,绝,绝! 吊儿郎当是贝爷给我的第一印象,没什么主见,总是很盲从的和别人去瞎混,不是网吧就是网吧,还有,我们一群人都是狂热的网络小说追随者,什么天蚕土豆,我爱西红柿等等大神的作品几乎全部扫荡。 贝爷是个贼心大胆儿小的货,大晚上的,他非得拉上我去姑娘家串门,到人家姑娘家了,乘着姑娘开门还想亲人家来着,那时候我都想给这个小王八犊子一脚,感情拉上我就是给他壮胆调戏人家姑娘来了,好在姑娘的小姨在家,没有遂贝爷这货的心意。 我在贝爷的带领下认识了小镇上较为偏僻的几处网吧,有麒麟、苹果,还有个叫什么金钥匙什么的地方,至于那些没有名字的黑网吧就不一一罗列了。他是在这个小镇长大的,所以熟悉小镇的结构是逃避老妈追杀的必需。 贝爷是网吧里的常客,经常陪别人玩儿游戏,这货就是这样,盲从。好在这货还是知道东南西北的,能分清楚是非黑白,没有堕落到逾越道德底线的地步。 好了,贝爷这货就是这个样子,谈论个大男人没啥意思,匆匆几笔带过就好。说太多这货估计得削我了,非常感谢贝爷,空缺的两年时光里帮了我不少忙,所以我就不在这里继续将他抹黑了。 还是回到高一十四班,这个我好长一段时间都记不真切的名字,那种似乎没有存在于记忆里般。 大家应该会有这么一种共识,就是漂亮姑娘周围的男生特别多,我深有体会,不善交际的我能在短短几周时间里认识相当一部分男生,然后课间就跑过来找我聊天了,现在想想,这些货哪是和我吹牛,那不过是附带着的罢了,冲着漂亮的姑娘那才是其真实目的。这也就是有一段时间我坐在最后一排没什么人鸟我的强有力证明。 那句“醉翁之意不在酒”用在此处虽然不怎么恰当,但是能表达出这个意思就行了。 被群殴之后我去网吧的次数减少了很多,晚上超过七点求我去我也是死活不肯的,可能有这么一句话能形容那时候的状态“一朝被蛇咬十年怕井绳”。 训练依旧继续,我给自己设定了目标,三天加一个俯卧撑,下蹲后来就不采用了,改跑步了,每天起个早,溜一圈然后包子铺里弄几个豆角包子,那叫一个爽,说起这个豆角包子我的口水都开始往地上淌了,要不是我早起,我连涮锅水都见不到了,买包子的人跟抢一样,包子个儿大、馅儿多、味儿美,那么壮观的场面在离开高中后再也不曾见到过了,那对卖早点的大叔人很好,像我这种饭量大的,管够! 上学嘛,总是要上上课,认认真真学习学习的,不可能天天都有什么有趣的事情发生。 高一下学期,教学楼建成,搬到新教学楼后依旧在一楼,这方便了我们那位不辞辛劳暗中观察我们学习情况的班主任老苟,说起老苟我记得比较清晰的就是他带我们后期常说的那些话,他说,我们太费心神,他头发都白了很多,天天都要发火。是的,那时候确实是有些超脱那个年纪应有的固执了,一些事情把老苟气的够呛,整天都点着支烟,苦闷无处诉说。唯有上化学课时他的那股幽默才自然而然的显现,我很喜欢化学,并不是这门课是班主任的课,我从来不刻意的去学习,看过书就扔一边,习题正常完成,不怎么花功夫也能达到较为理想的结果,这和英语相差甚远,虽然我也喜欢英语这门课。 这个学期我坐到了最后一排,忘记了是因为成绩下滑还是什么其他的原因,反正就在最后一排呆了一段时间,那段时间有些浑浑噩噩,看了几天的火影动漫,因为在语文课上和大兵同学说什么被点名,检查笔记情况,大兵书和新的一样,书被狠狠的丢在了地上,我因有随时拿支笔在书上涂涂画画的习惯幸免于难。 事后老苟把我俩弄到办公室里,煞有介事的问我们怎么办,我和大兵都不说话,老苟抽了一根烟,找了根棍子,让我和大兵互打五十下。于是,我和大兵像挠痒痒一样打了对方五十次,老苟在旁边看的忍不住笑,让我们承诺在课堂上不调皮捣蛋,应下后随即回到教室。 不知怎么的,我好像觉得最后一排有些不太好,因为最后两排基本上上课就开始趴下睡觉,唯独我拿着笔煞有其事的在本子上涂涂画画,终于我不再想待在最后一排。 脱离最后一排得谢谢向姑娘,让她帮我占了个座位,她成绩比较靠前,人缘又不错,所以我就顺理成章的成了向色狼的同桌,依稀记得是第四排右手边靠窗户的位置,采光不错。 我是一个比较随意的人,什么没有就问向姑娘借,虽然她老是拒绝,但是我还是成功借走,比如说喝水的杯子,学校里基本上都是桶装的矿泉水,喝水就得自备水杯,我比较懒,就算是弄个杯子也没处搁,所以得原谅我问向姑娘借杯子,其实我也是非常不好意思的,请原谅我说了句假话。我觉得把人家姑娘的杯子当自己的用也是一种境界啊,这让现在的我佩服不已,可想而知,那时候是得有多厚的脸皮才能这么厚颜无耻…… 正值夏天,打开窗户吹吹风是一件很惬意的事情,奈何窗帘总是晃来晃去,忘了不知是谁把窗帘的两个角绑在一起,风一吹便鼓了起来,老远就能听到一群人的笑声,我的笑声尤为特别,风把窗帘吹起来像极了文胸,以至于很多姑娘都捂着嘴笑得咯咯咯的停不下来。由于我笑声太特别,一群人因为我的笑声哄笑起来,笑的有些停不下来的节奏。 我的笑声被向色狼制止了下来,她轻轻地在我腰上的肥肉上拧了一圈,再加上一副小邪恶的表情,我也只能停下我那疯狂无比的笑声。 怎么形容我的笑声我不知道,但是我可以讲一讲有关的故事。 夏天是有午休的,吃完饭便回教室,路上我和几个同学一道,临近教学楼的时候有人讲了个笑话,我顿时笑开了,笑声肆虐整个校园,致使整栋楼里的同学一涌而出向楼下观望,看看是哪个傻X脑子坏了,我全然未觉,然后我带动了一栋楼的笑声,这才将我惊醒,赶紧夺路而逃。 向色狼很可爱,我高中回忆里的绝大部分都是她,曾答应她三个要求,看来她是没有什么机会提出来了,毕竟人海茫茫,相遇是何年。 我记得她说过这么一句“希望再见到你的时候,你可以很有底气的说你过得很好。” 我发现我有一个毛病,一聊起姑娘就没完没了,因为,我要开始讲一讲向姑娘了,老是称呼人家色狼不太好,所以此后都称向姑娘。 她是一个很活泼的姑娘,和人讲话很和气,基本上没见过这姑娘耍过脾气什么的,认识这么多女孩子,关于她我了解的最多,家里几口人,家住在哪里,父母在哪里等等,我并非刻意收集,甚至我都不知道我是怎么知道的。 高中的晚自习直到晚上九点半,有时候打扫卫生什么的就十点了,我不知咋地,不放心这姑娘单独走回去,碰到她打扫卫生的时候,我也不去帮忙,我只是瞎晃悠等她出教室,然后蹭上去聊天,瞎掰。 她家离学校不远,出后校门直走大约三五百米,中间穿过一条马路,就是我刚到这个镇子看到的那条被挖开的路,这时候已经修筑完工。路不大不宽,但是车流量比较大,每次过马路我都替她捏把汗,她埋着个脑袋只管走,有一次她没注意到车直愣愣的往前,已经走了马路的三分之一,看到车疾驰而来我都不敢叫她,怕她停下来问干啥。在那之前我是离她三五米远送她回家,之后我就并排着走了,也就不管她什么态度了。 我印象比较深的就是有天她穿了裙子,三年我也就只见到她穿过这么一次,晚上依旧死皮赖脸的送她回家,下自习后下起了小雨,她带了伞,我清晰的记得她给我撑伞时的小调皮,很可爱,那是我见过的最可爱的一个姑娘了吧。 我曾对她说,要是这条路再长一点就好了,她似乎没有回答,只是说了句“老不死”。 这是她给我的称呼,很亲切的称呼,听上去那么的顺溜、自然。 能在我的生命里遇到这么一个姑娘,我觉得已是上天对我的眷顾,我不曾多想,因为我一无所有。现在闭上眼睛回想起那三年,有她,真好。 很多的时候我都忍不住想联系她,也确确实实的联系过她,通了电话却不知说些什么,每一次我的问题和内容都一样,以至于她有些不耐烦了。 姑娘,也许你以后会明白,能有一个挂念着你却有没有其他想法的人是多么的不容易。至少我至今不曾遇到过。她的厌烦让我失去了联系她的勇气。于是,她真的只能存在于我的回忆里了,我也深深的明白,她有她的世界和方向,我,只不过是过往。 这个姑娘让我心生一种保护的心理,不因她有男朋友而减退分毫,看着她在路上晃晃悠悠的背影我就很开心,心情舒畅,也许,上辈子或者上上辈子我一直守护者她。 这就是她了,一个可爱的心存小邪恶的姑娘。姑娘,谢谢你路过我的世界,点亮了我眼前的黑暗,谢谢。 不知不觉中,我迎来了高中的第一个暑假,这个暑假注定不是那么的有趣。在我还没有放假的时候,我暑假的行程已经被安排好了。 目的地在浙江温州龙湾工业区的一处鞋厂,家里人美名其曰:体验生活。与我同行的还有俩兄弟,家里人把我们撂那儿就没再管过,吃自己的喝自己的花自己的。 一个月的时间里,我每天都重复着同一个动作,那时候正值七八月份,坐在那里汗水都往下淌,室外更像是一个大大的蒸笼。 第一周对周围的事物倍感新鲜,虽然机械的重复着工作,但是内心是愉悦的。熟悉周遭的环境后连每走一步都显得那么的枯燥无味。唯一值得欣慰的是伙食还算是让我满意。 我的工作是在车间里的流水线上,干些刷胶打杂的活,因为上头有人打点过了,所以车间里的组长什么的都很照顾,即便是这样,在半个月的时候我临近崩溃的边缘,机械的工作让我产生了极其强烈的抵触情绪,愤恨、疑惑、悲伤等各种情绪一股脑儿涌上心头,那天晚上十二点我一个人在洗手间里哭了半小时,我想起了住在天堂里的奶奶,想起了以前那个混蛋的懦弱的自己,想起了喜欢的那个姑娘…… 我开始利用空闲时间写些日记,说是日记,其实更像是自我反思,内容不多,但是容纳了那时候内心的五味陈杂。 那一个月里每天工作至少十一个小时,几乎是没有时间思考其他的事情的,起初我是理解不了为什么这些人愿意干这些机械的工作,那似乎是没有尽头。直到快离开时看到一个中年女人带着十六七岁的女儿在流水线上忙乎的时候,我才明白,活下去的这种念想让得她们不得不继续这份无聊的工作。 而我,结束了为期一个月的生活体验,同时也写完了想给自己说的话。当后来我翻开那个潦草的脏兮兮沾满胶水的本子时,我笑了,那种似乎知道自己是这个样子的笑,很轻松,很惬意。 那个本子的第一页上写着这么一句话: 人应该有梦想,没有便不能谓之人生。 最后一句很简单:我应该为自己而活。 我早已忘记写下那些话的自己是怎样的一种心情,或许是热血澎湃的吧。 再次回到校园倍感亲切,心里急切的想要见到一些人,应该是姑娘。这时候我的座位已经是固定在了讲桌旁边,我特意申请的,那样出小差的几率很少。想想和向姑娘同桌的时候,早上桌子椅子有人擦,出小差有人提醒,坐到第一排就没有那么幸运了,也没有姑娘那般讲究,反正能凑合就行。偶尔想起向姑娘的口头禅便觉得有意思,也很怀念她蜻蜓点水般的轻揪腰上的赘肉,那时候我是没有腹肌的。即便是那时候一直坚持锻炼也没有练出什么肌肉来。 和她同桌的时候,课间休息时间她基本上都是闭上眼睛小憩一会儿的,有时候我出去她不给让开,我就只能耍流氓的说,要是憋爆了你得负责,然后她回一句老不死。想来那时候真是有趣。 也许是我幡然醒悟,觉得好好学习才行,然后我就开始了看起来很努力的学习生活,那个时候基本上告别游戏了,偶尔还去打打篮球,成绩上升缓慢,我也不是那么的急躁,只要我努力过就可以了,至于结果,好自然好的,坏也得接受。就像是生活,不是每时每刻都能笑呵呵的过活的。 锻炼依然在继续,风雨无阻,是那种冒着大雨也得训练十分钟的那种坚持,任凭雨点浸湿头发,这时候我已近能够一口气四五十个俯卧撑了,虽然后来才知道一点儿也不标准,但是好歹数量上去了,引体向上逐渐被我接受,于是我真切的感觉得到自己的成长了,我开始相信量变到质变,所以我不曾放弃很多的东西。 我的爱好不多,玩游戏的时候并没有发觉电脑有其他的用途,唯一会操作的就是开机、打开游戏,深入的接触电脑我得感谢一个陌生人,我并不知道他的名字,仅数面之缘,他是一个计算机的狂热爱好者,在零六年零七年我见到他的时候他就有有很多关于计算机的书,还有数量庞大的各种软件。我第二次见到他的时候,我小心翼翼的问能不能借给我几本书,我指了指集合出版的《电脑报》,他也就瞟了一眼,让我随便拿,也没有说让我还的话,我记得应该是拿了两本厚厚的书,用了一周时间通读完毕,然后还书,很多技术性文章我是硬着头皮看完的,我也不去深究,反正只要是汉字,一字不落。那是怎样的一种认真我已经忘了,虽然看的很认真,但并不代表有什么用。感谢那个陌生的大叔,把我带到了一个有趣的世界里。 我不知道是否有人有过类似的经历,如果有,感谢那个充当了我们生命旅途的引路人吧。 从那时起,我知道了计算机不只是能拿来打游戏。其中,编程是让我觉得很高大上的一种东西,我觉得很有意思,却受到所学知识的限制,看着那些密密麻麻的代码像是天书,然而,就是这样的天书也被我硬着头皮啃完了,虽然收获不是很大。也许,知识就是一个学习、沉淀、再学习的过程,这样就能解释一段时间后再接触就容易接受。 时常有朋友这样激励自己,说,生活不止有苟且,还有诗和远方。 或许把诗和远方换成妹子,我的老同学小胖会很赞同,这个小伙儿的专长是泡妹子,是正儿八经的泡妹子,成绩不错,人很懒,一身赘肉,依旧能撩妹,我等无知小儿只能高呼其厉害,就差膜拜了。他是我初中同学,高中又凑到一起了,不同班。 这货让我帮忙干的事情想想都觉着搞笑,他自个儿蒙头睡大觉,让我长途跋涉几十公里帮他买套套,他是这么说的,以后要是什么上刀山下火海的事情就叫他,话都说到这份上儿上了,我要是不去就不好了,虽然我没有什么需要上刀山下火海。 我至今都记得我左拐右拐的绕了好几条大街以最快的速度窜进一个成人用品店,出口就问,套套怎么卖。然后老板热情的介绍,几十元上百元不等,我哪有闲心和这老板瞎扯淡,就随便指了一盒,付钱走人。 然而这并不是就结束了,大白天和做贼一样的买了东西准备打道回府,小胖来电告知需要买避孕药,再一次豪言壮语冲刷我的耳朵,我不想帮也不行,遂折回小店,小店老板说没有,但是好心的老板告诉我不远处的药房有,我不辞辛劳的徒步至药房,临近中午药房没什么顾客,只有俩值班的姑娘,我在门口的电子秤上磨蹭了十分钟都不敢去问,最后心一横,厚着脸皮就去问了,我很直接的问有没有避孕药,那姑娘说有,并问我要紧急的还是什么短效的,我一脸的局促不安,心想这还分种类?我实在是不好意思让人家给我解释,我就说紧急的。然后那姑娘盯着我看了半晌,其实我啥也没干,我只是个跑路的……我拿着药几乎是飞奔出去的,太尴尬了。现在想想那时候还真是有意思,哪像现在胆儿那么肥,指不定还打趣小姑娘几句。 我是一个喜欢好人做到底的人,买东西包我去找小胖的时候他还在呼呼大睡,我把东西扔他脸上他就醒了,兴奋的嗷嗷直叫,那只穿个大裤衩的夏天,他一身肥膘往地上淌,反正我是搞不懂这货撩妹的手段,我等再次膜拜。 看来校外出租屋方便了很多寂寞难耐的小伙伴。 这并不是个例,我租住屋的旁边有一个高我一届的小伙儿,有天带了个姑娘聊天,聊到晚上十一点多还没有停的意思。租住屋的房子不隔音,只隔了一层单砖墙,没有通顶,呼吸声大一点都能听得到,所以这俩货从小时候聊,聊到我都觉得扯淡,我瞬间都有些懵逼,这个世界到底是怎么了…… 为了不被他们的聊天嘻哈的声音吵到,我带着耳机听着歌睡着了,夜里我被很有节奏感的声音吵醒,耳机已经阻挡不了了,那“咚、咚、咚”的声音我听了好一会儿才听出来是什么撞墙的声音,我和那个小伙儿的床之间就隔了一堵墙,撞击声伴随着粗重的呼吸声,时而夹杂着一两声让人邪火中烧的声音,我的内心是崩溃的,聊成那样居然发展成这样,一夜未眠…… 这个生猛的小伙儿连着个把月半夜把我从睡梦里拉出来聆听他们的表演,我的睡眠质量直线下降,后来我不得不挪了窝,正值寝室竣工,我搬到了寝室,至此便是与那粗重的呼吸声以及那最后时刻的冲刺告别了,我需要一个清新的环境,拒绝简单粗暴。 学校的寝室绝大部分人都是呆过的,我就简单的描述一下我所在的寝室,四张上下铺,整洁算不上,清爽也是排不上号了,没有什么古怪的味道我就觉得很不错了。记得初中那会儿,一个三十几号人的大寝室,不论是春夏秋冬,寝室里的味道让人窒息,什么狐臭、脚臭、汗臭等等掺杂在一起,怎一个难受了得,有些小伙伴还买了不怎么样的香水和空气清新剂,所有的味道混在一起那叫一个酸爽,回味无穷。 寝室位于一楼111,很霸气绝伦的名字,后来我与数字二结缘,说来凑巧,111寝室里的小伙全是光棍儿,这里面住着六个性格各异的人,一个孤僻、一个看网络小说痴狂、一个玩游戏痴狂、一个做题痴狂、一个吊儿郎当瞎混、一个傻叉,我就是那个傻叉。 我别称有好几个,曾因为朗诵感情色彩浓重,语文老师送我“深情王子”的称号,还有一个别称“问题少年”,并不是我有很多毛病,只是因为课堂上我的提问太多了。想起那时候的课堂是比较有趣的,有些时候我做化学题就像开挂一样,老苟题目没有读完我的答案已经飞奔而出,不论是单选还是多选,搞得旁边的同学问我是不是提前完成了,我说没有,反而引来一阵不削。也许人与人之间的距离就是这样被拉开的。 111寝室有一个小伙伴,我叫他维哥,他是一个刷题狂魔,每天晚上理综试卷一套,数学试卷一套,他就拿个充电的小台灯照明,一直到凌晨一两点,早上正常起床,白天正常上课,课间十分钟疯狂睡觉,这货的英语差到惨不忍睹,全靠蒙,四五十分已算是高分。我估摸着大概很多人身边都有这样的存在,打着爱国的旗号了放弃这门学科。不得不说这个理由太牵强,我们应该知道“师夷长技以制夷”,也应该知道熟练地应用一门语言对自己的帮助。所以,尽最大努力掌握,重要的是学习的过程,至于结果,好自然好,坏的也要接受。 这不禁让我想起老苟喜欢说的一句话,他说他只要结果,不要过程。我倒是觉得过程比结果重要的多得多,就举个简单的例子,吃饭是我觉得人生中最舒爽的时候,要是没有吃饭咀嚼品味的过程的话,我想就没有那般有趣了。 维哥是111寝室里唯一一个喜欢挑灯夜战的小伙伴,他的最佳战绩是感冒了打着点滴依旧坚强的刷题,两天。现在回想起那些睡梦中都能听见的笔尖摩擦纸张的沙沙声不禁感慨万分,那该是怎么样的一些夜晚,也许应该有一轮皎白的月亮挂在天空,透过窗户洒下灿灿银光,以映衬这样的情景。 不知道,这些年过去了,111寝室里还有那亮到凌晨的微弱的灯光吗?是不是还是那么奇葩的组合待在那里互不干扰。 那些日子里,我还是一直坚持着锻炼,新修建的运动场也已投入使用,晚上跑两圈,练练引体向上成了我的必修课。也就是不久后,我在这个场地上跑了俩小时,大概二十来圈,且听我细细说来。 那是一个注定不太寻常的日子,关于一个姑娘,向色狼。 向姑娘这时候已经不和我同桌了,我的座位在第一排的前面,也就是讲桌旁边,我特意申请的位置,我和任课老同桌。 贝爷向来是小道消息灵通,他告诉我,向姑娘喜欢班里的一个男生,我开始还故作惊讶的说,该不是我吧?!随即便被贝爷泼了冷水,贝爷也不明说,让我自己观察,我这才注意到和向姑娘隔了一条过道的男生,个子一般、长发、瘦削的躯干和脸庞。 也许是我和老师同桌太久,都没怎么注意到向姑娘的动向了,我暗中观察了一上午,我找贝爷求证,贝爷对我竖了竖大拇指,我便会意。 我的情绪波动不大,只是感觉心里堵得慌。晚自习后我没有像往常一样拿本书回寝室复习,直奔运动场,死命的奔跑,一圈又一圈,两三圈后我能明显的感觉到迈出的脚步越来越抬不动,呼吸越来越急促,我仅仅是放缓了脚步继续,我逐渐的觉得越跑越舒畅,一直跑到就寝号响起,我就那么直愣愣的后倒在足球场的假草皮上,汗水在脸上、身上肆意蔓延,我记得那晚天空里的星星很稀疏,也不是那么亮。我是被保安驱赶回寝室的。 我似乎明白向姑娘一下自习就窜没影了是为什么,大概是不想让我这种厚脸皮的人送她回家,但是我依旧是不依不挠,总有能跟得上她的时候。事实再次戳中了了我小小的心脏,我见着那男生送向姑娘回家了…… 我终于是长长的叹了口气,每天下自习后老老实实锻炼身体。 老苟对于高中阶段恋爱是有看法的,老苟说了,只要是发现一起,就通知家里人领回家结婚领证。可惜的是,直到高中结束我也没能见到老苟霸气的通知家长领孩子回家结婚的动作。对此,我略感遗憾。 直至高中结束,班上的小情侣都没有数量减少的态势,本来理科班就是僧多肉少,而肉偏偏自个儿跑到了别人的案板上,我除了长叹几声别无他法。 想来这也是很多人成绩不断下降的原因,毕竟那时候哪有心思听课看书写作业,不过具体的我就不知道了,请原谅我这个没什么见识的人,不知恋爱为何物。 也许人一旦倒霉起来,拦都拦不住继续倒霉。 话说也就是跑完二十圈的第二天下午,由于吃饭去了晚一点,经常去的小食铺没米饭了,我退而求其次,就近在旁边的小面馆准备吃面,老板说臊子没有了,泡萝卜条有一些,老板问我吃不吃,我已经懒得继续觅食了,要了一碗二两的面,老板应我的要求把泡萝卜条垫在了碗底,热腾腾的面端了上来,我随意的在碗里搅和了几下,吃了第一口,正准备吃第二口的时候,一只硕大的苍蝇藏在面条里,我想了半天,决定还是要尊重食物,有时候自个儿家也会出现这种情况,也不是什么大事儿,我把苍蝇的躯体摆在桌子上,继续填饱我的肚子,当最后一根面下肚,只剩下了一小堆萝卜条,我寻思着,萝卜条挺好吃,也不能浪费了,我拨弄了两下,我的头顿时大了一圈,胃里止不住的翻腾,萝卜条下藏着两三只苍蝇的躯体,我不知道我吃了几只,真是罪过,我想吃个素非得给我加肉。啥话不说,付钱走人,那是我有史以来吃的最闹心的一顿饭…… 我把吃面吃到苍蝇的事儿告诉贝爷,贝爷指着我笑的腰都直不起来,然后在班里大肆宣传,然后很多人都知道我吃了一碗苍蝇。 贝爷还厚颜无耻的借走了我的手机,用于打发语文课的时间,不巧的是被语文老师逮个正着,我的手机不幸殉职,然而贝爷也没有要赔我的意思,还厚颜无耻的说不好意思,我没有了手机我也算是清净了一段时间,那段时间的周末基本上都去爬山了,主要是贝爷约了几个姑娘,然而第二天那些姑娘被被子封印了,搞得贝爷五点钟就吭哧吭哧的忙活,又是准备吃的又是准备喝的,全白干。 说是白干,其实也不然,贝爷在我的带领下爬了一两次山,后来贝爷也被被子封印了。高中课程压力较大,周末补觉很正常,被子只是封印不住我罢了,周末同样不被被子封印的还有超哥,一个看起来很蛮实,实际上一身肉松松垮垮的小伙儿,这家伙也是一个背单词属于疯狂的那一类,然而这并没有什么卵用,和我的结局是一样一样的。我想我们能认识也是有一部分这个原因吧,他坐我对面,是的,我俩霸占了讲桌的左膀右臂。 我俩喜欢一路小跑上山,那是什么样的感觉呢,抬头看着山上跑很让人没有底气,几乎每一次上山我都是埋着头盯着脚下数着一步一步的往上,或跑或走或爬,不管怎样反正就是到山顶了,山顶的地势较为平坦,两座寺庙,这都不是我想说的。 山上有个地方比较有趣,一块大石头悬在崖边,号‘读书台’。 我和超哥基本上上山就到读书台,煞有介事的朗诵诗词,偶尔来上一大段文言,吼的那叫一个撕心裂肺,嗓子要恢复好几天。 山顶看日出也是比较不错的选择,不过我觉得要是有个姑娘陪着看看日出就更好了,我就是那么一想,能不能实现还不知道。 这个时候超哥还是很有冲劲的,成绩提升空间很大,也许是觉得再努力也就那样了,超哥后来和一拨儿人彻彻底底的改变了状态,只是把床从寝室挪到了教室。 这时候很多人开始放弃了,一些人放弃的很彻底,一些人慢慢的放弃。 超哥是慢慢的放弃那一类,至少曾努力过,还留了个念想。 我见过最彻底,也是对自己极不负责任的放弃方式:直接放弃学业。如果说不去上学还好些,但是打着上学的旗号拿着学费泡在网吧小半年这种行为真的不是很好。当父母到学校找孩子问怎么这么久不回家时发现自家孩子没上学,那是怎么样的一种着急和惋惜,还有恨铁不成钢。 我见着那对中年夫妻焦急的在那里傻站着,什么也做不了,男的一支烟接着一支烟,没见他停下,愁容满面。后来经老苟多方询问才问出那同学经常出没的地方,网吧和小镇一所中学的篮球场。 我个人认为,如果觉着自己确实坚持不下去了,果断的放弃未必不是一种方法,俗话说三百六十行行行出状元,有的时候一味的坚持只能证明自己的愚蠢。 我记得那时候的我也很迷茫,真的是很努力了,却没有半点成效,比如说英语,真的像茅坑里的石头——又臭又硬,我几度想直接放弃英语,但是又转念一想放弃了就真的没有啥希望了,继续坚持下去指不定会有什么收获,然而是我多虑了。 那时候正值夏天,高二下学期快结束的时候,我心里烦闷得很,就随便找了个本子在上面乱涂乱画,恰巧被老苟盯上了,老苟悄无声息的站在我旁边看了好一会儿,问我干啥,我看着老苟回了句,天气热心里不爽。老苟没说啥走了,我以为他要劈头盖脸的教训我一顿来着…… 临近全科目的复习,暑假也没有几天时间,高三的前夕也是山雨欲来风满楼,教室前的黑板上从踏进高中的第一天就开始了倒计时,看着数字越来越小却没有多少感觉,也许连续看了两年已经麻木了,看黑板的时候会自动开启忽略模式,只有值日每天机械的更改倒计时。 贝爷因为即将到来的高三待遇提高了不少,他老妈单独给他的房间装了空调,这把贝爷乐呵坏了,可以凉凉爽爽的玩手机了,顺带着看看书,也算是为高三做准备。 高三的复读班想来大家不会陌生,一个班上黑压压的一片脑袋,即便是课间十分钟也不怎么有人出来透透气,那是怎么样的一种压力我是体验不了了,有一个复读班就在我所在班级的隔壁,他们在我们还没有起床的时候就已经在教室里,当我们下晚自习时他们巍然不动。 有幸认识一个复读的小伙儿,听他说复读班有一个连续奋战六年的牛人,连续读了六年高三,我觉着都不真实,我不敢贸然的评论,让我连续六年我肯定是做不到的。 也许所有关于高中的记忆里高三是最为清晰、最为牢固的了,整天在各种检测试卷中游荡,只有吃饭的时候能感觉到自己是个活人,第一轮复习、第二轮复习就把时间削去了一半,整天回荡在耳边的是那些时间所剩无几的话。 那些日子里还算是平稳,我喜欢把晚饭时间拿来在教学楼旁瞎溜,闭着眼睛向前数着步数走,从最开始的两三步到后来的五六十步,就那么的在树荫下瞎晃悠,晚自习后再去觅食。这一年什么都是那么的压抑,连过年也是,回到家里家里人就念叨,那真叫一个心烦,只能当做啥也听不见,只管自己吃好喝好休息好,捎带着看看书。感觉自己就像是开启了登天模式,却无处下脚。 体能训练算是一种放松的办法,记得偶尔会有陌生姑娘站在远处帮我数数,那时引体向上已经能达到二十多,比起当初的一两个来说,我进步了。就头发的长度来说,我比以前退步了不少,只因和向姑娘说了句我要留光头,向姑娘一脸的不相信,从此我的头发长度介于两毫米到八毫米之间,倒不是说我非得在姑娘面前硬气一把,只是向姑娘让这个过程提前了一些。 贝爷就算是到了高三也没有临时抱佛脚的意思,依旧是吃饭上网睡觉看小说,雷打不动,枉费了他老妈给他装空调的一片心意。这货干的每一件事都让人匪夷所思,且不说对姑娘动手动脚。 班上有一些姑娘喜欢在课桌上摆上一个小宠物的玩偶,或者是一个玩偶模样的笔袋,不知贝爷哪根神经搭错了,对这些小玩意儿感兴趣了,有一个玩偶是个趴着的小狗的模样,粉粉的小舌头耷拉在下巴前,用可爱形容应该不会过分。 妄尘集 2019-05-06 评论 264 次浏览
RPM包制作 rpm包的制作是根据spec file来实现的,我们能够写spec file文件就能够实现制作rpm包了,spec file文件中都是一些命令,他告诉rpm包的制作工具rpmbuild,一步步如何解压一个软件包,如何去编译一个软件包,编译完成后如何做成不同的rpm包,rpm包之间有什么样的关系,每一个rpm包中应该包含什么样的文件。 spec file文件的语法 在各个段落中如何定义软件包的相关信息,如何控制编译,如何去列出包中所包含的文件,以及如何在spec file文件中使用宏(macro)。 #####一般来说制作一个rpm包大致包含以下几个方面的工作 ``` ============================================================= 1. 明确我们打算做的rpm包是什么东西 2. 收集制作软件包的原材料,最好是最原始的源码包 3. 收集软件包所需要的补丁 4. 制作rpm包是否适合老版本升级,是否需要执行一些清理旧包 5. 规划好rpm包的依赖关系,这个包依赖什么rpm包,这个rpm包向其他rpm包提供什么样的能力(capability) #编译依赖、安装依赖 6. 制作rpm包 7. 测试rpm包是否能够安装 ============================================================= ``` rpm包的制作需要有一个制作车间,需要有一定的目录结构 !!制作rpm包一定不能使用root用户制作,使用普通用户来制作rpm包,因为在制作过程中如果某个命令写错了,root用户执行后的结果是灾难性的,且rpm包的制作过程中用不着root用户权限 将原材料放入规划好的目录结构中(特定目录) 创建spec file文件 编译源码生成rpm包 ``` 我们需要在特定的目录中提供5个子目录(目录名大写) BUILD:让源代码解压后存放的位置,但是我们不用管,只需要提供一个目录(真正制作过程在这个目录下) RPMS:制作完成后的RPM包存放位置(按照架构存放,例如i386目录,需为特定平台指定子目录),RPM包的编译可以实现交叉编译 SOURCES:所有收集的原材料存放在这里(conf文件,源码补丁文件等) SPECS:spec file文件,每个RPM包的制作必须要有一个spec file文件,作为rpm包制作过程中的指导文件,通常以软件包的名称命名,以spec结尾。 SRPMS:SRC格式的RPM包的存放路径 ``` redhat系统上,在/usr/src/redhat/目录下有Build RPM包的目录,权限为root,普通用户没有权限,多数情况下,我们不会在该目录下进行生成rpm包,在任何一个地方只要准备了这么几个目录都可以作为rpm包的制作车间,到底使用谁来作为当前用户rpm包的宏相关定义(rpm包为了工作有很多系统变量,和操作系统没有关系) ~]# rpmbuild --showrc #显示所有相关宏定义 宏的格式为:%{...} 名称为:_XX(一个下滑线的为定义spec文件本身环境的使用情况) 名称为:__XX(两个下划线定义的通常是命令) 定义宏的目的:在不同的系统上,路径很可能不一样,用以引用当前系统上的命令真正在什么地方。 macrofiles: 定义这些宏在什么文件中设定的(使用冒号隔开),生效的次序是自前而后的,如果配置文件中某个宏重复了,则以最后读取到的为准。 _topdir: 用于定义制作车间的路径 在家目录下创建文件~/.rpmmacros 写入%_topdir /RPM_BUILD_PATH #指定一个当前用户有权限访问的目录 spec file文件结构 intraduction section #介绍段,rpm -qi能够查询到的信息 prep section #准备阶段,解压缩源码包并cd进去 build section #编译阶段 install section #安装阶段(安装到某一个目录下,非当前系统) clean section #清理阶段 files section #文件段,列出收集的文件,打包到rpm包中 change log section #改变日志段(版本信息变更) spec文件语法 ``` ============================================================ #定义的标签(冒号前的顶格字段),在spec文件中可以使用%{name}的方式进行引用标签后(冒号)的值 #%{?dist},该处的问号能进行判断,存在就赋值,不存在则不填 #所有以"#"开头的为注释,但是注释中不能出现"%",非得出现可写为"%%" TagName: value #标签名称不区分大小写 %define macro_name value #用户自定义宏 #用户自定义宏的引用:%{macro_name} || %macro_name Name: name-version-release.rpm name-version-release.arch.rpm #name中一定不能出现短横线(dash),短横线有特殊意义 GROUP: 制作的软件包属于哪个组,可参考/usr/share/doc/rpm-version/GROUPS Vendor: 制作人 URL: rpm下载位置或网址 Packager: first name License: 一定要带上,看清楚源码包的授权,REDME/change logs Summary: 概述,尽量不要写太多 %description: 写大段的描述信息,建议一行不要太长,采取强制换行 #Define Package Dependencies 定义包的依赖(可省略) Requires: capability #安装rpm包时的依赖,可以出现多次 Povides: capability #该rpm包提供的能力 BuildRequires: capability #生成rpm包时的依赖,可出现多次 #设定build locations BUILD: 用于编译的目录 BuildRoot: 用于编译后安装的目录(假想根目录) %{buildroot} #假想根目录 $RPM_BUILD_ROOT #假想根目录 Source: 怎么命名源文件(如果只有一个使用source即可) #如果有多个则:source0、source1等等 #这些源文件必须位于source下,可以加http链接,但是它不回去下在,而是到SOURCE目录下去找 #通过source引入的文件通常不会自动安装到对应的buildroot路径下,需要手动进行安装 %{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/rc.d/init.d/nginx #应用"SOURCE1"需大写 Patch: 补丁,如果有补丁,命名方式同source,命名patch是为了后面打补丁引用 %prep #将源代码解压到build路径下,设置环境变量并cd进去 %setup -q -n nagios #有些包解压后名称不带版本号,当cd时会报错,因此需要使用%setup的额外选项指定名称 -q #静默模式 -a #先进build目录再解压缩源文件 #-a 0 -a 1 展开source0、source1 -b #先解压缩,再进入build目录,当展开目录为多个且需要合为一个时 #-b 0 -b 1 展开source0、source1 #-b需要先使用-c,再解压缩之前创建目录,name-version %build #对于c语言,configure,make,make install #如果是perl程序,读帮助文档perl Makefile.PL %install #保留源文件时间戳 %clean #主要作用就是删除buildroot rm -rf %{buildroot} ~]# rpmbuild --clean nginx.spec Define installation Scripts %pre #安装前脚本 %post #安装后脚本 %preun #卸载前脚本 %postun #卸载后脚本 #脚本中有$1变量,指的是安装类型(处理类型) 判断 $1 == 1 安装 判断 $1 == 2 升级 #3-9都可以用,但是常用2 判断 $1 == 3 卸载 %files #任何包含进rpm包中的文件,都在这儿列出来必须在BuildRoot目录中安装生成,支持通配符、目录 %dir /PATH/TO/DIR #将指定目录当做空目录,不关心目录中内容 %doc File_Name #不写路径,在安装时放入/usr/local/share/doc/nginx-xxx %dirdoc /PATH/TO/DIR #将整个目录下的内容作为文档处理 %config /PATH/TO/FILE #指定配置文件 #noreplace,不替换以改变的文件 #*.rpm.new(新安装的配置文件) #*.rpmorig(不兼容时的新文件名称) %config(noreplace,missing ok) #missing ok,没有也没关系 %changelog * #以星号标识日期 #日期的格式为:星期,月份,日,年,制作者,邮件地址-版本号-release号 - #短横线标识注释,在这个版本里我们都干了什么事 %attr(mode,user,group) filename #给单个文件修改属主属组、权限,为横线时保留原有属性 %attr(-,user,-) filename %defattr(-,-,root,-) #默认权限定义 ============================================================ ``` ~]# ldconfig #重新读取动态链接库中的库文件 ~]# rpm -k *.rpm #检查rpm包的来源 使用gpg命令对rpm包进行签名 ~]# gpg --gen-key #生成秘钥 ~]# gpg --list-key #查看秘钥 ~]# gpg --ecport -a '...秘钥...' >RPM-GPG-KEY-* #将公钥提取出来,随安装包给用户 ~]# rpm --addsign *.rpm #对rpm包进行签名 ~]# rpm --import RPM-GPG-KRY-* #安装公钥 ~]# rpm --checksig *.rpm #验证RPM包 PGP: Pretty Good Privacy OpenPGP是一种规范: PGP是商业的软件,使用该软件加密的也得使用该软件进行解密,为了增强适用性,PGP公司写了open PGP规范,其他公司可以按照规范开发软件,以增强适用性,GNU组织根据该规范编写了一款软件,称为GNUPG-->GPG 制作RPM包时直接签名 ~]# vi ./rpmmacros %_signature %_GPG_Name CI/CD 2019-05-06 评论 327 次浏览
Jenkins Job介绍 1. 有若干个job或project构成的庞大的开发平台系统,我们可以将开发测试,部署或基础运维相关任务通过创建一个任务或者项目,保存在jenkins任务列表中,方便日常的运维开发、维护工作。 2. 可以利用其内建模块或特定的脚本语法,将我们的工作内容抽象成jenkins job,这个任务里通过配置相关的参数及工具模块,从而作为一个可执行的任务,最终保存在jenkins平台下。 3. 每一次执行完一个任务成为一个build,可以通过查看这个build获取所需要的结果。 4. build构建信息会保存在jenkins上作为build log,可以通过查看不同时间点的log信息,从而debug任务中出现的各种问题。 5. jenkins下所有的任务构建后的所有项目相关文件,例如clone的仓库代码,maven打包生成的编译包,配置的参数文件,都会保存在jenkins的主目录workspace下,以我们当前任务名称命名的目录,作为这个job的workspace,可以查看这些工作空间中的文件,去定位无法在日志中无法定位的问题细节。 Jenkins freestyle与pipeline job的区别 freestyle job 1. 需要在界面添加模块配置项与参数完成配置 2. 每个job仅能实现一个开发功能 3. 所有的配置只能通过前台手动完成,无法将配置代码化,不利于job配置迁移与版本控制。 4. 逻辑相对简单,无需额外的学习成本 pipeline job ``` #匹配持续集成与持续交付的概念 1. 所有的模块、参数配置都可体现为一个pipeline脚本 2. 可以定义多个stage作为项目部署的每一个阶段,构建一个管道工作集串联所有的工作。 3. 所有的配置代码化,方便job配置迁移与版本控制,对有改动的部分进行版本控制,将脚本的改动定位到代码层面,方便后期的审计工作。 4. 需要学习pipeline脚本语法基础 ``` jenkins job构建配置 1. 配置jenkins server本地代码仓库 2. 安装gitclient,curl工具依赖 3. 关闭系统git http.sslVerify安全认证 4. 添加jenkins后台git client user与email 5. 添加jenkins后台git credential凭据 jenkins freestyle job构建配置 1. 在界面上创建一个freestyle project 指定任务名称 选择构建一个自由风格的软件项目 2. 编辑描述信息 写入对该任务的描述信息 3. 进行参数的配置 找到“参数化构建过程”并勾选 添加相应的参数值 4. 可添加一个文本参数并写入相应值 写在这里的参数最终最为我们预先build构建前项这个任务传送参数的接口 5. 先添加选项参数 名称:deploy_dev #作为部署环境的名称 选项: #作为任务构建前的参数选项,传入任务中 dev #开发环境 prod #生产环境 描述:Choose deploy envrionment #作为参数选项的描述任务 6. 添加文本参数 名称:version 默认值:1.0.0 描述:build version 通过传入一个预先设定好的默认参数或者自定义参数作为构建我们build这个任务前的参数值到job当中 7. 源代码管理 我们可以通过配置源代码管理选项,将git代码仓库的项目源代码clone到jenkins本地进行随后的项目部署工作。 在配置job的界面向下滑动,找到源代码管理 选择git Repository URL中输入仓库的URL地址 Credentials中选择在凭据中创建的git用户、密码 此时页面上的错误提示消失,表示git仓库认证成功 Branch Specifier */master #保证克隆的是master分支的代码 8. build配置 添加一个shell模块,编写我们的核心build任务,并最终完成我们的freestyle job配置内容 web界面向下拉动,找到“构建“,并增加构建步骤:执行shell ``` ============================================================= #!/bin/bash export PATH="/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin" #print env variable echo "Cuurent deployment environment is $deploy_env" >>test.properties echo "The build $version" >>test.properties echo "[INFO] Done..." #Check test properties echo "[INFO] Check test properties" if [ -s test.properties ]; then cat test.properties echo "[INFO] Done" else echo "test.properties is empty" fi echo "[INFO] build finished" =========================================================== #点击保存并推出当前配置界面 ``` 任务的构建 在jenkins界面上点击对应job的“build with parametes“ deploy env的参数选项:dev/prod version定义 点击build开始构建 点击左侧边栏中构建中的job,可查看构建的过程(点击圆球直接进入) jenkins pipeline job基础架构 ``` 1. 所有的代码包含在pipeline{}层内【第一层】 2. stages{}层用来包含该pipeline所有stage子层,将pipeline管道分为若干个管道块,每一个管道块够可以去干一件事情,而且彼此不受影响【第二层】 3. stage{}层用来包含具体的我们需要编写任务的steps{}子层,用于添加pipeline语法模块,利用模块进行业务逻辑的相关编写操作。 4. steps用于添加我们具体需要调用的模块语句,如shell模块等 ============================================================= pipeline{ agent any environment{ host='test.example.com' user='deploy' } stages{ stage{ sh "cat $host" echo $deploy } } } ============================================================= ``` agnet区域 定义pipeline在哪里运行,可以使用any,none或具体的jenkins node主机名等,例如我们要指定在node1上执行可以写成 agent{node {lable 'node1’}} any:随机在一台jenkins上执行该任务 envrionment区域 1. “变量=变量值“定义我们的环境变量,通常与stages平级 2. 可以定义全局环境变量(如PATH),应用于所有stages任务 3. 如果需单独定义一些仅应用到特定stage管道块中的环境变量,我们可以直接将envrionment写到该区域内 script区域(可选) 1. 定义在steps中 2. 编写grovy脚本语言 3. 用来进行脚本逻辑运算(具有grovy基础) steps区域 1. echo:打印输出静态、动态语句到build构建任务log输出中 echo $deploy 2. sh:调用Linux系统shell命令在pipeline下编写shell脚本 sh "cat 'test.properties'" 3. git url:调用git模块进行git相关操作 git url: "https://..." jenkins pipeline job构建配置 ``` 1. 创建一个pipeline project jenkins管理界面新建任务 键入pipeline job任务名称 选择pipeline流水线任务并确定 2. 添加描述信息 This is my first pipeline job 点击应用 3. pipeline脚本配置 找到pipeline任务栏 编写我们的pipeline脚本 ============================================================= #!groovy pipeline{ angen{node {lable 'master'}} environment{ PATH='/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin' } parameters{ choice( choices: "dev\prod" description: "choose deploy environment" name: "deploy_env" ) string(name: 'version', defaultValue: '1.0.0', description: 'build version') } stages{ stage("Checkout test repo") { steps{ sh 'git config --global http.sslVerify false' #关闭当前git的全部ssl认证 dir("${env.WORKSPACE}") { git branch: 'matser',CredentialsId: “需要到jenkins管理界面查看git凭据ID”, url: 'https://git repo address' #添加了一个checkout test repo的stage,将git仓库中的源代码clone到jenkins当前任务下的workspace工作区域内 } } } #接下来创建第二个stage区域,相当于这个管道流水线的第二个子任务,用来将我们的pipeline传入的参数写入到我们上一个stage子任务clone下来的test properties中。 stage("print env variable") { steps{ #当前所有模块调用以及任务执行都在我们定义的dir中运行 dir("$env.WORKSPACE") { sh """ #三引号内以shell的风格编写shell语句 echo "[INFO] Print env variable" echo "Current deployment environment is $deploy_env" >>test.properties echo "The build is $version" >> test.properties echo "[INFO] Done..." """ } } } stage("Checkout test properties") { steps{ dir("$(env.WORKSPACE)") { sh """ echo "[INFO] Check test properties" if [ -s test.properties ]; then cat test.properties echo "[INFO] Done..." else echo "test.properties is empty" fi """ } } } } } ============================================================= ``` 点击保存并退出 点击立即构建,首次构建会提示找不到deploy变量,因为在首次构建pipeline job的时候我们的参数没有引入到我们当前的pipeline job当中,此时构建的按钮变为了"Build with parameters",点击它就可以看到我们在build之前需要添加的参数,点击build才能开始接下来的构建。 jenkins 应用 Jenkins 与Linux shell集成 ``` 1. 新建freestyle project 名称:shell_freestyle_job 选择freestyle_job并确定 2. 输入描述信息 在页面下找到"构建",选择增加构建步骤:执行shell 在界面文本框中添加shell语句,此处为一些主机信息查看语句 ============================================================= #!/bin/bash user=$(whoami) if [ $user == 'deploy' ]; the echo "hello,my name is $user" else echo "sorry,i’m $user" fi ip addr cat /etc/system-release free -m df -Th py_cmd=$(which python) $py_cmd --version ============================================================= ``` Jenkins参数集成 ``` 1. 进入jenkins管理界面,新建freestyle job 名称:parameter_freestyle_job 选择构建一个freestyle job并确定 2. 输入描述信息 选择参数化构建过程复选框 添加"选择参数" 名称:deploy_env 选项:dev uat stage prod 描述:Choose deploy environment 添加文本参数 名称:version 默认值:1.0.0 描述:fill in build version 添加bool值参数 名称:bool 默认值勾选则默认为ture 描述:Choose bool value 添加密码参数 名称:pass 默认值:密码字符串(如果不输入,在构建时会手动输入,脚本中调用pass变量时) 描述:Type your password 3. 添加构建步骤 选择执行shell,添加一个shell模块 添加shell语句 ============================================================= #!/bin/bash echo "Current deploy environment is $deploy_env" echo "The build is $version" echo "The password is $pass" if $bool; then echo "REquest is approved" else echo "request is rejected" fi ============================================================= 保存并退出 点击构建,可以查看到添加的参数选项 ``` Jenkins与git集成 ``` 使用jenkins内建的git插件将gitlab仓库的代码clone到jenkins本地,准备随后的代码构建工具。 1. jenkins界面新建freestyle job任务 名称:git_freestyle_job 选择freestyle_job并确定 2. 填写描述信息:This is my first git 找到源码管理选择git 添加git仓库地址"https://..." 选择git用户名和密码(系统凭据)并确定 点击构建 Jenkins与ansible集成 使用shell模块调用本地的ansible命令,从而实现jenkins能够集成ansible工具进行远程服务器的部署管理功能。 ansible虚拟环境3.6配置以及配置jenkins主机下deploy用户到目标主机的秘钥认证。 1. jenkins界面新建freestyle job任务 名称:ansible_freestyle_job 选择freestyle job并确定 2. 填写描述 This is my first ansible job 3. 构建模块选择"执行shell" ============================================================= #!/bin/bash set +x source /home/deploy/.py3-a2.5-env/bin/activate source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q cd /home/deploy ansible --version ansible-playbook --version cat testserver #详细清单目录 ansible -i testservers.testserver -m command -a "ip addr" set -x ============================================================= 保存并退出 构建任务 ``` CI/CD 2019-05-04 评论 457 次浏览
Jenkins简介 Jenkins是一个开源持续集成工具,使用java语言开发 功能:提供软件开发的持续集成服务 特点:支持主流软件配置管理,配合实现软件配置管理持续集成功能。 Jenkins的优势和应用场景: 1. 主流的开发平台,兼容所有的主流开发环境。 2. 插件市场可与海量业务流开发工具实现集成 3. job为配置单位与日志管理,使运维与开发人员能协同工作的工具 4. 权限管理划分为不同job不同角色 5. 强大的负载均衡功能,保证我们项目的可靠性 jenkins的安装配置管理 ``` 1. 安装jenkins前的环境准备 #添加yum源 ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo #导入key,验证yum仓库的安全性 ~]# rpm -import https://pkg.jenkins.io/redhat-stable/jenkins.io.key 2. 保证系统java的版本为8.0或8.0以上,保证jenkins可以调用本地的java环境启动该服务 ~]# yum -y install java ~]# java -version #确定是否安装成功及版本是否匹配 3. 关闭系统防火墙 4. 关闭SELinux,并重启(强制访问控制策略) 5. yum源安装jenkins最新版本 ~]# yum -y install jenkins 6. 创建jenkins系统用户(服务) ~]# useradd jenkins 7. 更改jenkins启动用户与端口 ~]# vi /etc/sysconfig/jenkins JENKINS.USER=jenkins JENKINS.PORT=8080 8. 启动jenkins ~]# systemctl start jenkins 浏览器访问IP:8080 获取权限 安装推荐插件 创建管理员 ``` Jenkins管理界面 新建任务:新建一个jenkins job 用户:创建用户 构建历史:查看所有build构建的log记录 系统管理:配置管理系统相关配置选项 我的视图:创建自定义的dashboard界面 凭证:添加git密码,ssh key公钥 新建视图:创建自定义的dashboard界面 构建队列:build队列 构建执行的状态:所有build构建状态列表 CI/CD 2019-05-04 评论 407 次浏览