<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>INFO-0940 Operating Systems – 2014-2015 Specific posts Archives - Tom Barbette</title>
	<atom:link href="https://perso.uclouvain.be/tom.barbette/category/courses/os2015/feed/" rel="self" type="application/rss+xml" />
	<link>https://perso.uclouvain.be/tom.barbette/category/courses/os2015/</link>
	<description></description>
	<lastBuildDate>Fri, 29 May 2015 13:48:35 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://perso.uclouvain.be/tom.barbette/wp-content/uploads/2022/04/cropped-logo-uclouvain-2021-barbette-32x32.png</url>
	<title>INFO-0940 Operating Systems – 2014-2015 Specific posts Archives - Tom Barbette</title>
	<link>https://perso.uclouvain.be/tom.barbette/category/courses/os2015/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>A Linux bug you can now understand</title>
		<link>https://perso.uclouvain.be/tom.barbette/a-linux-bug-you-can-now-understand/</link>
		
		<dc:creator><![CDATA[Tom Barbette]]></dc:creator>
		<pubDate>Fri, 29 May 2015 13:36:59 +0000</pubDate>
				<category><![CDATA[INFO-0940 Operating Systems – 2014-2015 Specific posts]]></category>
		<guid isPermaLink="false">http://queen.run.montefiore.ulg.ac.be/~barbette/?p=506</guid>

					<description><![CDATA[<p>Hi all students from INFO0940, I came accross a bug which may ring multiple bells for you (sorry, it&#8217;s in french) : http://www.developpez.com/actu/85653/Linux-decouverte-d-un-bug-sur-le-systeme-de-fichiers-EXT4-qui-pourrait-causer-une-importante-perte-de-donnees/ The bug description should remember you some all ghost : « La variable &#8220;sector&#8221; dans &#8220;raid0_make_request()&#8221; n’a pas été correctement modifiée par l’appel à &#8220;sector_div()&#8221; qui modifie son premier argument à la &#8230; </p>
<p class="link-more"><a href="https://perso.uclouvain.be/tom.barbette/a-linux-bug-you-can-now-understand/" class="more-link">Continue reading<span class="screen-reader-text"> "A Linux bug you can now understand"</span></a></p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/a-linux-bug-you-can-now-understand/">A Linux bug you can now understand</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hi all students from INFO0940, I came accross a bug which may ring multiple bells for you (sorry, it&#8217;s in french) :</p>
<p>http://www.developpez.com/actu/85653/Linux-decouverte-d-un-bug-sur-le-systeme-de-fichiers-EXT4-qui-pourrait-causer-une-importante-perte-de-donnees/</p>
<p>The bug description should remember you some all ghost :<br />
« La variable &#8220;sector&#8221; dans &#8220;raid0_make_request()&#8221; n’a pas été correctement modifiée par l’appel à &#8220;sector_div()&#8221; qui modifie son premier argument à la place. Le commit [précèdent] restaurait cette variable après l’appel pour une utilisation ultérieure. Malheureusement la restauration a été effectuée après que la variable &#8220;bio&#8221; a été avancée »</p>
<p>I know multiple people had problems with dividing sectors and using sector_div(). Fortunately, most of you used it correctly ! Maybe you should help them :p I wonder if the bug could happen with any file system as raid0_make_request seems to be related to MD and not to ext4 at all, maybe the article is poorely written and it was just seen with ext4 but is related to all md0 device? </p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/a-linux-bug-you-can-now-understand/">A Linux bug you can now understand</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The MD personnality</title>
		<link>https://perso.uclouvain.be/tom.barbette/the-md-personnality/</link>
		
		<dc:creator><![CDATA[Tom Barbette]]></dc:creator>
		<pubDate>Tue, 21 Apr 2015 08:27:52 +0000</pubDate>
				<category><![CDATA[INFO-0940 Operating Systems – 2014-2015 Specific posts]]></category>
		<guid isPermaLink="false">http://queen.run.montefiore.ulg.ac.be/~barbette/?p=465</guid>

					<description><![CDATA[<p>The structure &#8220;struct md_personality&#8221; is the one which contains information about a RAID level. It is defined in md.h . You&#8217;ll find below some explanations about each member of the structure. [code lang=&#8221;c&#8221;] char *name; //Name of the level int level; //Number related to the level, negative level are for "special one", for example the &#8230; </p>
<p class="link-more"><a href="https://perso.uclouvain.be/tom.barbette/the-md-personnality/" class="more-link">Continue reading<span class="screen-reader-text"> "The MD personnality"</span></a></p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/the-md-personnality/">The MD personnality</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>The structure &#8220;struct md_personality&#8221; is the one which contains information about a RAID level. It is defined in md.h . You&#8217;ll find below some explanations about each member of the structure.</p>
<p>[code lang=&#8221;c&#8221;]</p>
<pre>
char *name; //Name of the level
int level; //Number related to the level, negative level are for "special one", for example the linear level is -1
struct list_head l i s t ; //Linked list of all MD personnalities.
struct module *owner; //Pointer to the Linux module managing this level

/∗* Do a block I/O operation
 * @param mddev structure representing the array
 * @param bio Bock I/O representing the operation to do
 */
void (*make_request)(struct mddev *mddev, struct bio* bio);

/** Build and assemble a RAID array
 * @param mddev structure representing the array
 */
int (*run)(struct mddev *mddev);

/** Disassemble an array
 * @param mddev structure representing the array
 */
int (*stop)(struct mddev *mddev);

/** Write some status informations to a file
 * @param seq virtual file
 * @param mddev structure representing the array
 */
void (*status)(struct seq_file *seq, struct mddev *mddev);

/** Function called when an error occur in the MD subsystem.
 * The usual way to run it is to call md_error() inside a md module, which will set some flags and start the recovery thread, and call this error_handler
 * @param mddev structure representing the array
 * @param rdev The physical drive responsible for the failure if applicable
void (*error_handler)(struct mddev *mddev, struct md_rdev *rdev);

/** Add a disk while the array is still running
 * @param mddev structure representing the array
 * @param rdev the physical disk to add
 */
int (*hot_add_disk) (struct mddev *mddev, struct md_rdev *rdev);

/** Remove a disk while the array is still running
 * @param mddev structure representing the array
 * @param number index of the disk to remove
 */
int (*hot_remove_disk) (struct mddev *mddev, int number);

/** Return the number of active spare drive.
 * @param mddev structure representing the array
 */
int (*spare_active) (struct mddev *mddev);

/** Handle a re-synchronization request for some sector
 * @param mddev structure representing the array
 * @param sector_nr Sector to synchronize
 * @param skipped Will be set to 1 if the sync was skipped
 * @param go_faster If false, will sleep interruptible to throttle resync
 */ 
sector_t (*sync_request)(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster);

/** Resize an array
 * @param mddev structure representing the array
 * @param sectors new size
 */
int (*resize) (struct mddev *mddev, sector_t sectors);

/** Return the size of the array. If sectors and raid_disks are not zero, size is computed using those numbers instead of the real ones.
 */
sector_t (*size) (struct mddev *mddev, sector_t sectors, int raid_disks);

/** Check_reshape Reshape an array after adding or removing some disks
 */
int (*check_reshape) (struct mddev *mddev);

// unused
int (*start_reshape) (struct mddev *mddev);
void (*finish_reshape) (struct mddev *mddev);

/** quiesce moves between quiescence states
 * 0 - fully active
 * 1 - no new requests allowed
 * others - reserved
 */
void (*quiesce) (struct mddev *mddev, int state);

/** takeover is used to transition an array from one
 * personality to another.  The new personality must be able
 * to handle the data in the current layout.
 * e.g. 2drive raid1 -> 2drive raid5
 *      ndrive raid5 -> degraded n+1drive raid6 with special layout
 * If the takeover succeeds, a new 'private' structure is returned.
 * This needs to be installed and then ->run used to activate the
 * array.
 */
void *(*takeover) (struct mddev *mddev);

</pre>
<p>[/code]</p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/the-md-personnality/">The MD personnality</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Limiting the incoming Block I/O requests to a device driver/md device</title>
		<link>https://perso.uclouvain.be/tom.barbette/limiting-the-incoming-block-io-requests-to-a-device-drivermd-device/</link>
		
		<dc:creator><![CDATA[Tom Barbette]]></dc:creator>
		<pubDate>Fri, 17 Apr 2015 11:52:08 +0000</pubDate>
				<category><![CDATA[INFO-0940 Operating Systems – 2014-2015 Specific posts]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://queen.run.montefiore.ulg.ac.be/~barbette/?p=468</guid>

					<description><![CDATA[<p>When implementing a device driver or a MD device which can receive Block I/O (struct bio in the kernel), you can receive BIO of nearly any size, with any number of segments (segments are discontinued parts of a common buffer, defined in a bio request). You may want to limit : &#8211; The number of segments &#8230; </p>
<p class="link-more"><a href="https://perso.uclouvain.be/tom.barbette/limiting-the-incoming-block-io-requests-to-a-device-drivermd-device/" class="more-link">Continue reading<span class="screen-reader-text"> "Limiting the incoming Block I/O requests to a device driver/md device"</span></a></p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/limiting-the-incoming-block-io-requests-to-a-device-drivermd-device/">Limiting the incoming Block I/O requests to a device driver/md device</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>When implementing a device driver or a MD device which can receive Block I/O (<em>struct bio</em> in the kernel), you can receive BIO of nearly any size, with any number of segments (segments are discontinued parts of a common buffer, defined in a bio request). You may want to limit :</p>
<p>&#8211; The number of segments you can receive with<br />
[code lang=&#8221;c&#8221;]blk_queue_max_segments(queue, <em>X</em>);[/code]<br />
Where X is the number of segments per <em>struct bio</em></p>
<p>&#8211; The maximal size of the request :<br />
[code lang=&#8221;c&#8221;]blk_queue_max_hw_sectors(queue, <em>Y</em>);[/code]<br />
Where Y is the maximal size in sectors</p>
<p>For a md device, the queue can be recovered with mddev-&gt;queue</p>
<p>The combination of the two allows to limit ensure that all bio request have always maximum X segments for a maximal size of Y sectors.</p>
<p>It is used in raid0 with Y=mddev-&gt;chunk_sectors to ensure that no request is bigger than one chunk, so any request cross at most one chunk boundary. And with X=1, it allows to use the bio_split function to split a request which would span on the two sides of a chunk boundary.</p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/limiting-the-incoming-block-io-requests-to-a-device-drivermd-device/">Limiting the incoming Block I/O requests to a device driver/md device</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Creating a dynamic and redundant array with LVM and MDADM</title>
		<link>https://perso.uclouvain.be/tom.barbette/creating-a-dynamice-and-redundant-array-with-lvm-and-mdadm/</link>
		
		<dc:creator><![CDATA[Tom Barbette]]></dc:creator>
		<pubDate>Mon, 13 Apr 2015 12:12:12 +0000</pubDate>
				<category><![CDATA[INFO-0940 Operating Systems – 2014-2015 Specific posts]]></category>
		<category><![CDATA[Server management]]></category>
		<category><![CDATA[Unix]]></category>
		<guid isPermaLink="false">http://queen.run.montefiore.ulg.ac.be/~barbette/?p=459</guid>

					<description><![CDATA[<p>RAID5 allows to create an array of N+1 drives where N is the number of drives which will contain real data. The last drive will be used to store parity about the other drives (in practice, the parity information is stored by chunks across all drives and not only on one drive). RAID 5 allows &#8230; </p>
<p class="link-more"><a href="https://perso.uclouvain.be/tom.barbette/creating-a-dynamice-and-redundant-array-with-lvm-and-mdadm/" class="more-link">Continue reading<span class="screen-reader-text"> "Creating a dynamic and redundant array with LVM and MDADM"</span></a></p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/creating-a-dynamice-and-redundant-array-with-lvm-and-mdadm/">Creating a dynamic and redundant array with LVM and MDADM</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>RAID5 allows to create an array of N+1 drives where N is the number of drives which will contain real data. The last drive will be used to store parity about the other drives (in practice, the parity information is stored by chunks across all drives and not only on one drive). RAID 5 allows to loose any of the drive without loosing the data thanks to the parity drive, and has a cheaper cost than RAID 1 where the usable data will be N/ instead of N-1.</p>
<p>MDADM is the tool of predilection to build a RAID5 drive. Given 3 disks, the command to build a raid 5 array is :</p>
<p>[code lang=&#8221;bash&#8221;]mdadm &#8211;create /dev/md0 &#8211;level=5 &#8211;raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1[/code]</p>
<p>Problem is, RAID5 drives are not easily splittable/shrinkable/resizable, the operation is complex and must be done offline. The solution is to use LVM on top of MDADM to build a big volume group which will be &#8220;protected&#8221; by RAID5 allowing to make dynamic paritions on it :</p>
<p>[code lang=&#8221;bash&#8221;]pvcreate /dev/md0<br />
vgcreate group0 /dev/md0[/code]</p>
<p>And then create multiple, online-resizeable partitions with :</p>
<p>[code lang=&#8221;bash&#8221;]lvcreate /dev/group0 -n system -L 10G<br />
mkfs.ext4 /dev/mapper/group0-system[/code]</p>
<p>[code lang=&#8221;bash&#8221;]lvcreate /dev/group0 -n home -L 50G<br />
mkfs.ext4 /dev/mapper/group0-home[/code]</p>
<p>To resize a partition, one can do :</p>
<p>[code lang=&#8221;bash&#8221;]lvresize /dev/mapper/group0-home -L +10G<br />
resize2fs /dev/mapper/group0-home[/code]</p>
<p>Which will add 10G to the partition, and resize it. It will work even with the system partition, without needing any reboot.</p>
<p>&nbsp;</p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/creating-a-dynamice-and-redundant-array-with-lvm-and-mdadm/">Creating a dynamic and redundant array with LVM and MDADM</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Block I/O caching</title>
		<link>https://perso.uclouvain.be/tom.barbette/block-io-caching/</link>
		
		<dc:creator><![CDATA[Tom Barbette]]></dc:creator>
		<pubDate>Tue, 24 Mar 2015 15:16:25 +0000</pubDate>
				<category><![CDATA[INFO-0940 Operating Systems – 2014-2015 Specific posts]]></category>
		<guid isPermaLink="false">http://queen.run.montefiore.ulg.ac.be/~barbette/?p=446</guid>

					<description><![CDATA[<p>In Linux, blocks resulting from BIO requests are cached, so further reads are done from memory instead of re-reading data from the disk. To clean this cache, one can use echo 3 &#62; /proc/sys/vm/drop_caches . In the same way, write to the filesystem are not directly done. The filesystem waits before sending data written creating an &#8230; </p>
<p class="link-more"><a href="https://perso.uclouvain.be/tom.barbette/block-io-caching/" class="more-link">Continue reading<span class="screen-reader-text"> "Block I/O caching"</span></a></p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/block-io-caching/">Block I/O caching</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div>In Linux, blocks resulting from BIO requests are cached, so further reads are done from memory instead of re-reading data from the disk. To clean this cache, one can use <em>echo 3 &gt; /proc/sys/vm/drop_caches</em> .</div>
<div></div>
<div>In the same way, write to the filesystem are not directly done. The filesystem waits before sending data written creating an &#8220;write&#8221; BIO request. Imagine if a software writes byte per byte to the filesystem : it would mean that one write request would be created per byte, this would be very slow.</div>
<div>Instead, filesystems wait before creating and sending the BIO write request, and this explains why after writing a file to the disk, there is still some write BIO request passing through the block layer even after the writing software says it has finished or is even closed.</div>
<div></div>
<div>To force the &#8220;real&#8221; write of all pending write in the FS, one can use the <em>&#8220;sync&#8221;</em> software already installed on all Linux systems.</div>
<div></div>
<div>This is why you&#8217;ve got to unmount USB drives by the way : even if the copy seems finished, it is maybe not really finished because the writes are pending but not yet written &#8220;for real&#8221;.</div>
<div></div>
<div>Using the combination of the two (sync then flush the cache) will ensure that all data is written and that further read will be done from the disk, and not from memory. This is very important to test that a disk driver or a MD raid array is working well.</div>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/block-io-caching/">Block I/O caching</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Using a thread to do the swapping in assignment #2 is now a bonus</title>
		<link>https://perso.uclouvain.be/tom.barbette/using-a-thread-to-do-the-swapping-in-assignment-2-is-now-a-bonus/</link>
		
		<dc:creator><![CDATA[Tom Barbette]]></dc:creator>
		<pubDate>Sat, 21 Mar 2015 13:50:38 +0000</pubDate>
				<category><![CDATA[INFO-0940 Operating Systems – 2014-2015 Specific posts]]></category>
		<guid isPermaLink="false">http://queen.run.montefiore.ulg.ac.be/~barbette/?p=440</guid>

					<description><![CDATA[<p>As a lot of the INFO-0940 students seems to have trouble for this part and struggle with time, you can do the swapping of chunks in the indirection table directly inside make_request. Doing it in another thread will be considered as a bonus. More than the bonus, it will be needed for assignment #3, so doing it &#8230; </p>
<p class="link-more"><a href="https://perso.uclouvain.be/tom.barbette/using-a-thread-to-do-the-swapping-in-assignment-2-is-now-a-bonus/" class="more-link">Continue reading<span class="screen-reader-text"> "Using a thread to do the swapping in assignment #2 is now a bonus"</span></a></p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/using-a-thread-to-do-the-swapping-in-assignment-2-is-now-a-bonus/">Using a thread to do the swapping in assignment #2 is now a bonus</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>As a lot of the INFO-0940 students seems to have trouble for this part and struggle with time, you can do the swapping of chunks in the indirection table directly inside make_request. Doing it in another thread will be considered as a bonus.</p>
<p>More than the bonus, it will be needed for assignment #3, so doing it in a separated thread is not loosing time, on the contrary&#8230; <strong>But focus on sysfs entries and having a working indirection table first ! </strong>(and a working raid module, of course&#8230;)</p>
<p>About sysfs entries, I added this post : https://www.tombarbette.be/sysfs-entries/</p>
<p>There will be no delay for the assignment #2. Remember that this time you have to use the RUN submission platform (http://submit.run.montefiore.ulg.ac.be) to send your project and that you can submit any number of times until the deadline. A script will automatically run to tell you if your archive was good (patch, &#8230;). If it wasn&#8217;t you project will not be considered for correction&#8230; Better being late than get a zero !</p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/using-a-thread-to-do-the-swapping-in-assignment-2-is-now-a-bonus/">Using a thread to do the swapping in assignment #2 is now a bonus</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>MDADM git repository</title>
		<link>https://perso.uclouvain.be/tom.barbette/mdadm-git-repository/</link>
		
		<dc:creator><![CDATA[Tom Barbette]]></dc:creator>
		<pubDate>Wed, 11 Mar 2015 14:33:28 +0000</pubDate>
				<category><![CDATA[INFO-0940 Operating Systems – 2014-2015 Specific posts]]></category>
		<guid isPermaLink="false">http://queen.run.montefiore.ulg.ac.be/~barbette/?p=433</guid>

					<description><![CDATA[<p>If by any chance *someone* would have to edit mdadm for the assignment number 2, here is the git repository : git://neil.brown.name/mdadm The function Create in Create.c take cares of creating a new array, the mapping_t pers[] structure in maps.c take care of mapping &#8220;RAID level names&#8221; to level numbers. Those numbers are defined in mdadm.h. Of course those &#8230; </p>
<p class="link-more"><a href="https://perso.uclouvain.be/tom.barbette/mdadm-git-repository/" class="more-link">Continue reading<span class="screen-reader-text"> "MDADM git repository"</span></a></p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/mdadm-git-repository/">MDADM git repository</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If by any chance *someone* would have to edit mdadm for the assignment number 2, here is the git repository :</p>
<p>git://neil.brown.name/mdadm</p>
<p>The function Create in Create.c take cares of creating a new array, the mapping_t pers[] structure in maps.c take care of mapping &#8220;RAID level names&#8221; to level numbers. Those numbers are defined in mdadm.h. Of course those numbers should match what&#8217;s defined in the kernel in linux/raid/md_u.h&#8230;</p>
<p>To compile mdadm, just type &#8220;make&#8221;.</p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/mdadm-git-repository/">MDADM git repository</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Introduce delay between printk (kernel messages) at boot</title>
		<link>https://perso.uclouvain.be/tom.barbette/introduce-delay-between-printk-kernel-messages-at-boot/</link>
		
		<dc:creator><![CDATA[Tom Barbette]]></dc:creator>
		<pubDate>Fri, 27 Feb 2015 16:10:50 +0000</pubDate>
				<category><![CDATA[INFO-0940 Operating Systems – 2014-2015 Specific posts]]></category>
		<guid isPermaLink="false">http://queen.run.montefiore.ulg.ac.be/~barbette/?p=418</guid>

					<description><![CDATA[<p>If you&#8217;re developing into the linux kernel but your system is crashing at boot, the boot_delay parameter may be usefull. If you added printk messages to see what happened just before, you may use the boot_delay=XXX options to add XXX milliseconds between each printk, and therefore allow you to see each messages if the messages &#8230; </p>
<p class="link-more"><a href="https://perso.uclouvain.be/tom.barbette/introduce-delay-between-printk-kernel-messages-at-boot/" class="more-link">Continue reading<span class="screen-reader-text"> "Introduce delay between printk (kernel messages) at boot"</span></a></p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/introduce-delay-between-printk-kernel-messages-at-boot/">Introduce delay between printk (kernel messages) at boot</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>If you&#8217;re developing into the linux kernel but your system is crashing at boot, the boot_delay parameter may be usefull. If you added printk messages to see what happened just before, you may use the boot_delay=XXX options to add XXX milliseconds between each printk, and therefore allow you to see each messages if the messages pass through quickly.</p>
<p>To add this parameter, type &#8220;e&#8221; while the good entry is highlighted in the grub menu bootloader, and add boot_delay=XXX at the end of the line starting with &#8220;linux=&#8221;.</p>
<p>This is the &#8220;quick&#8221; solution. Other posts in this blog allows you to find other solution to make the console go through a serial link in a VM for instance.</p>
<p>The post <a href="https://perso.uclouvain.be/tom.barbette/introduce-delay-between-printk-kernel-messages-at-boot/">Introduce delay between printk (kernel messages) at boot</a> appeared first on <a href="https://perso.uclouvain.be/tom.barbette">Tom Barbette</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
