<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://leo.leung.xyz/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=184.64.117.27</id>
	<title>Leo&#039;s Notes - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://leo.leung.xyz/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=184.64.117.27"/>
	<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/Special:Contributions/184.64.117.27"/>
	<updated>2026-10-06T08:35:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=Systemd&amp;diff=7397</id>
		<title>Systemd</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=Systemd&amp;diff=7397"/>
		<updated>2023-11-16T16:49:21Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* Creating a Timer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cheat sheet==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Task&lt;br /&gt;
!Command&lt;br /&gt;
|-&lt;br /&gt;
|list all failed units on the system&lt;br /&gt;
|&amp;lt;code&amp;gt;systemctl list-units --failed&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Return code denotes if a service is down&lt;br /&gt;
|&amp;lt;code&amp;gt;systemctl is-failed nginx.service&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|show the status of a service/unit/timer&lt;br /&gt;
|&amp;lt;code&amp;gt;systemctl status ssh.service&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|show a service in detail&lt;br /&gt;
|&amp;lt;code&amp;gt;systemctl show vboxweb.service&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|kernel messages&lt;br /&gt;
|&amp;lt;code&amp;gt;journalctl -k&amp;lt;/code&amp;gt;&amp;lt;code&amp;gt;journalctl -ab&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|follow messages&lt;br /&gt;
|&amp;lt;code&amp;gt;journalctl -f&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|logs for a specific unit. Eg. SSH&lt;br /&gt;
|&amp;lt;code&amp;gt;journalctl -u ssh.service&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|logs for a specific syslog facility. Eg. authpriv and auth logs:&lt;br /&gt;
|&amp;lt;code&amp;gt;journalctl -q SYSLOG_FACILITY=10 SYSLOG_FACILITY=4&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Analyze why things are slow&lt;br /&gt;
|&amp;lt;code&amp;gt;systemd-analyze blame&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;systemd-analyze critical-chain&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Switch and change targets (runlevel)==&lt;br /&gt;
In the traditional init system such as SystemV, whether a system boots into a graphical interface or to a text-based console is determined by the default runlevel. In systemd, the idea of runlevels has been replaced by targets. A target is simply a collection of units (services) that should start. Now, to change a system&#039;s &#039;runlevel&#039;, we need to use tell systemd to change its target.&lt;br /&gt;
&lt;br /&gt;
Instead of using {{code|init 5}} to start a graphical system:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# systemctl isolate graphical.target&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or {{code|init 3}} for a text-based system:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# systemctl isolate multi-user.target&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can see the default target:&lt;br /&gt;
&lt;br /&gt;
{{Highlight&lt;br /&gt;
| code = # systemctl get-default&lt;br /&gt;
graphical.target&lt;br /&gt;
| lang = terminal&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You can change the default target:&lt;br /&gt;
&lt;br /&gt;
{{Highlight&lt;br /&gt;
| code = # systemctl set-default multi-user.target&lt;br /&gt;
# systemctl set-default graphical.target&lt;br /&gt;
| lang = terminal&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Journal==&lt;br /&gt;
Systemd keeps tracks of service logs.&lt;br /&gt;
&lt;br /&gt;
===Clearing Journal===&lt;br /&gt;
&lt;br /&gt;
Clear all the entries by running:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# journalctl --vacuum-time=1seconds&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Or&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# journalctl --vacuum-size=1M&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Limiting Log Sizes===&lt;br /&gt;
&lt;br /&gt;
Edit {{code|/etc/systemd/journald.conf}} and define a value for {{code|SystemMaxUse}}. Eg. {{code|1=SystemMaxUse=100M}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tasks==&lt;br /&gt;
&lt;br /&gt;
===Creating a Timer===&lt;br /&gt;
You can use systemd to create a timer which can periodically run something, similar to Cronjobs.&lt;br /&gt;
&lt;br /&gt;
A systemd timer can trigger a service. To make use of a systemd timer, you will need to create the service definition (that tells systemd how to run what you want to run) and then the timer definition itself (which tells Systemd when to run it, and how often). &lt;br /&gt;
&lt;br /&gt;
For our service component, we would want a one-shot service that just executes a script. Create a service at &amp;lt;code&amp;gt;/etc/systemd/system/gather-metrics.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
{{Highlight&lt;br /&gt;
| code = [Unit]&lt;br /&gt;
Description=Logs system statistics to the systemd journal&lt;br /&gt;
Wants=gather-metrics.timer&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/bin/gather-script.sh&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
| lang = text&lt;br /&gt;
}}&lt;br /&gt;
For our timer component, we want to run this every 10 minutes. Create a timer at &amp;lt;code&amp;gt;/etc/systemd/system/gather-metrics.timer&amp;lt;/code&amp;gt;:&lt;br /&gt;
{{Highlight&lt;br /&gt;
| code = [Unit]&lt;br /&gt;
Description=Gathers metrics from this server&lt;br /&gt;
Requires=gather-metrics.service&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
Unit=gather-metrics.service&lt;br /&gt;
OnCalendar=*-*-* *:0/10:00&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
| lang = text&lt;br /&gt;
}}&lt;br /&gt;
The &amp;lt;code&amp;gt;OnCalendar&amp;lt;/code&amp;gt; specification takes the form of &amp;quot;&amp;lt;code&amp;gt;DOW YYYY-MM-DD HH:MM:SS&amp;lt;/code&amp;gt;&amp;quot;. An asterisk is a wildcard and matches on any value. The timer will trigger on the next date that matches this format.&lt;br /&gt;
&lt;br /&gt;
Other useful specifications are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!OnCalendar&lt;br /&gt;
!The job will run...&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;*-*-* *:*:00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every minute&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;*-*-* *:0/10:00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every 10 minutes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;*-*-* *:00:00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every hour&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;*-*-* */6:00:00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every 6 hours&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;*-*-* 00:15:30&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every day at 12:15:30 AM&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;*-*-* 9-17:00:00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every day between 9 AM and 5 PM each hour, on the hour&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* *-01,04,07,10-01 00:00:00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every quarter (on the first of January, April, July, October) at 00:00:00&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* *-01-01 00:00:00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every year (on the first of January) at 00:00:00&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;Weekly&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;Mon *-*-* 00:00:00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every Monday at 00:00:00&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;Mon...Fri *-*-* 00:00:00&amp;lt;/code&amp;gt;&lt;br /&gt;
|Every weekday at 00:00:00&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;Mon *-05~03&amp;lt;/code&amp;gt;&lt;br /&gt;
|On the next Monday which is 3 days from the end of May&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;Mon..Fri *-08~04&amp;lt;/code&amp;gt;&lt;br /&gt;
|On the next weekday which is 4 days from the end of August&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Creating a Service===&lt;br /&gt;
Creating a service in systemd requires writing a .service file. The service file defines the service, any dependencies, and what to actually run. Service files are typically placed in &amp;lt;code&amp;gt;/etc/systemd/system/&amp;lt;/code&amp;gt;. The most basic service file will look something like this:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run a script that does not fork&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
ExecStart=/root/scripts/foreground-script.sh&lt;br /&gt;
Restart=always&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
We are using &amp;lt;code&amp;gt;Type=simple&amp;lt;/code&amp;gt; because the bash script we&#039;re executing doesn&#039;t fork or daemonize itself. For programs that do daemonize or run in the background, use &amp;lt;code&amp;gt;Type=oneshot&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Other options that may be of interest are listed below. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!options&lt;br /&gt;
!behavior&lt;br /&gt;
|-&lt;br /&gt;
|Restart=always&lt;br /&gt;
|restart when the program exits, regardless of the exit code.&lt;br /&gt;
|-&lt;br /&gt;
|User=bob&lt;br /&gt;
Group=bob&lt;br /&gt;
|Run the service with a particular user / group&lt;br /&gt;
|}&lt;br /&gt;
Once the file has been created, reload systemd and enable the service: {{highlight|lang=terminal|code=&lt;br /&gt;
## Reloads the service files so systemd is aware of the new one&lt;br /&gt;
# systemctl daemon-reload&lt;br /&gt;
# systemctl enable mag-read&lt;br /&gt;
}}&lt;br /&gt;
===SystemV-like Init Scripts===&lt;br /&gt;
&lt;br /&gt;
Systemd supports the old SystemV startup scripts that are placed in &amp;lt;code&amp;gt;/etc/rc.local&amp;lt;/code&amp;gt; and the &amp;lt;code&amp;gt;/etc/rc.d&amp;lt;/code&amp;gt; directories using the &amp;lt;code&amp;gt;rc-local.service&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
If you need to quickly run something at startup without wanting to deal with Systemd services, just edit the &amp;lt;code&amp;gt;/etc/rc.local&amp;lt;/code&amp;gt; file and enable the service with &amp;lt;code&amp;gt;systemctl enable rc-local.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Custom service script ====&lt;br /&gt;
Alternatively, create a custom systemd service that runs your startup scripts. For example, create a file at {{code|/usr/lib/systemd/system/startup.service}} with the following:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Custom SystemV-like Startup&lt;br /&gt;
After=network.target&lt;br /&gt;
ConditionFileIsExecutable=/usr/local/sbin/custom-startup-initd&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/local/sbin/custom-startup-initd&lt;br /&gt;
TimeoutSec=0&lt;br /&gt;
StandardOutput=tty&lt;br /&gt;
RemainAfterExit=yes&lt;br /&gt;
SysVStartPriority=99&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
A few things of interest in this service file:&lt;br /&gt;
&lt;br /&gt;
*The {{code|ConditionFileIsExecutable}} will only run the script if it&#039;s executable. It basically does a {{code|test -x}} on the file before this continues.&lt;br /&gt;
*{{code|RemainAfterExit}} will cause systemd to show the service as active even after the script has finished execution.&lt;br /&gt;
&lt;br /&gt;
In {{code|/usr/local/sbin/custom-startup-initd}}:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
StartupDir=&amp;quot;/usr/local/boot/startup&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Run all scripts starting with &#039;S&#039;&lt;br /&gt;
for i in `ls $StartupDir/S*` ; do&lt;br /&gt;
        ScriptName=`basename $i`&lt;br /&gt;
        sh $StartupDir/$ScriptName&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# Success exit code.&lt;br /&gt;
exit 0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Make the directory: &lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# mkdir -p /usr/local/boot/startup/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Then place your scripts in the startup directory starting with the letter &#039;S&#039;.&lt;br /&gt;
&lt;br /&gt;
Enable the new service by running:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# systemctl enable startup&lt;br /&gt;
# systemctl start startup&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Verify this:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# systemctl status startup.service&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Editing a service===&lt;br /&gt;
You can create overrides to an existing service by running &amp;lt;code&amp;gt;systemctl edit something.service&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For example, to make Docker start after ZFS is ready, add the following overrides:&lt;br /&gt;
{{Highlight&lt;br /&gt;
| code = # systemctl edit docker.service&lt;br /&gt;
After=zfs-mount.service &lt;br /&gt;
Requires=zfs-mount.service &lt;br /&gt;
Wants=zfs-mount.service &lt;br /&gt;
BindsTo=zfs-mount.service&lt;br /&gt;
| lang = terminal&lt;br /&gt;
}}This will create an &amp;lt;code&amp;gt;override.conf&amp;lt;/code&amp;gt; file under &amp;lt;code&amp;gt;/etc/systemd/system/docker.service.d/override.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Run something in a cgroup ===&lt;br /&gt;
Systemd makes it easy to run something within a new cgroup. For example:&lt;br /&gt;
{{Highlight&lt;br /&gt;
| code = # Use up to 2GB memory and begin swapping if it exceeds this limit&lt;br /&gt;
$ systemd-run --user --pty --property MemoryHigh=2G firefox&lt;br /&gt;
&lt;br /&gt;
# Use up to 2GB memory and kill with OOM if it exceeds this limit&lt;br /&gt;
$ systemd-run --user --pty --property MemoryMax=2G firefox&lt;br /&gt;
| lang = terminal&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;{{Navbox Linux}}&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:LinuxUtilities]]&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=Music_Theory&amp;diff=7056</id>
		<title>Music Theory</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=Music_Theory&amp;diff=7056"/>
		<updated>2023-01-29T08:24:28Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: Created page with &amp;quot;== Chord progressions ==  === ii-V-I === The ii-V-I chord progression. {| class=&amp;quot;wikitable&amp;quot; !Key !ii (supertonic) !V (dominant) !I (tonic) |- |C |Dm |G |C |- |G |Am |D |G |- |D |Em |A |D |- |A |Bm |E |A |- |E |F#m |B |E |- |B |C#m |F# |B |- |F# |D#m |G# |F# |- |C# |A#m |D# |C# |- |F |Gm |C |F |- |Bb |Cm |F |Bb |- |Eb |Gm |Bb |Eb |- |Ab |Dm |Eb |Ab |- |Db |Am |Ab |Db |- |Gb |Dm |Db |Gb |- |Cb |Gm |Gb |Cb |}  == See also ==  * https://muted.io/cheat-sheet/ - Super helpful...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Chord progressions ==&lt;br /&gt;
&lt;br /&gt;
=== ii-V-I ===&lt;br /&gt;
The ii-V-I chord progression.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Key&lt;br /&gt;
!ii (supertonic)&lt;br /&gt;
!V (dominant)&lt;br /&gt;
!I (tonic)&lt;br /&gt;
|-&lt;br /&gt;
|C&lt;br /&gt;
|Dm&lt;br /&gt;
|G&lt;br /&gt;
|C&lt;br /&gt;
|-&lt;br /&gt;
|G&lt;br /&gt;
|Am&lt;br /&gt;
|D&lt;br /&gt;
|G&lt;br /&gt;
|-&lt;br /&gt;
|D&lt;br /&gt;
|Em&lt;br /&gt;
|A&lt;br /&gt;
|D&lt;br /&gt;
|-&lt;br /&gt;
|A&lt;br /&gt;
|Bm&lt;br /&gt;
|E&lt;br /&gt;
|A&lt;br /&gt;
|-&lt;br /&gt;
|E&lt;br /&gt;
|F#m&lt;br /&gt;
|B&lt;br /&gt;
|E&lt;br /&gt;
|-&lt;br /&gt;
|B&lt;br /&gt;
|C#m&lt;br /&gt;
|F#&lt;br /&gt;
|B&lt;br /&gt;
|-&lt;br /&gt;
|F#&lt;br /&gt;
|D#m&lt;br /&gt;
|G#&lt;br /&gt;
|F#&lt;br /&gt;
|-&lt;br /&gt;
|C#&lt;br /&gt;
|A#m&lt;br /&gt;
|D#&lt;br /&gt;
|C#&lt;br /&gt;
|-&lt;br /&gt;
|F&lt;br /&gt;
|Gm&lt;br /&gt;
|C&lt;br /&gt;
|F&lt;br /&gt;
|-&lt;br /&gt;
|Bb&lt;br /&gt;
|Cm&lt;br /&gt;
|F&lt;br /&gt;
|Bb&lt;br /&gt;
|-&lt;br /&gt;
|Eb&lt;br /&gt;
|Gm&lt;br /&gt;
|Bb&lt;br /&gt;
|Eb&lt;br /&gt;
|-&lt;br /&gt;
|Ab&lt;br /&gt;
|Dm&lt;br /&gt;
|Eb&lt;br /&gt;
|Ab&lt;br /&gt;
|-&lt;br /&gt;
|Db&lt;br /&gt;
|Am&lt;br /&gt;
|Ab&lt;br /&gt;
|Db&lt;br /&gt;
|-&lt;br /&gt;
|Gb&lt;br /&gt;
|Dm&lt;br /&gt;
|Db&lt;br /&gt;
|Gb&lt;br /&gt;
|-&lt;br /&gt;
|Cb&lt;br /&gt;
|Gm&lt;br /&gt;
|Gb&lt;br /&gt;
|Cb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* https://muted.io/cheat-sheet/ - Super helpful cheat sheet for chords and circle of fifths&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=Gnome&amp;diff=5662</id>
		<title>Gnome</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=Gnome&amp;diff=5662"/>
		<updated>2020-12-08T02:51:31Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* Desktop Icons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==GSettings==&lt;br /&gt;
The {{code|gsettings}} utility provides a way to get to GSettings which is more or less like a Windows registry containing key value pairs.&lt;br /&gt;
&lt;br /&gt;
GSetting values are different for each user. To modify or view values for a different user, launch a dbus session as the user via {{code|sudo}}:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# sudo -H -u lightdm dbus-launch --exit-with-session gsettings list-recursively&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Lock Screen===&lt;br /&gt;
To enable or disable the lockscreen and the ability to lock the workstation:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# gsettings set org.gnome.desktop.lockdown disable-lock-screen true|false&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Gnome Terminal==&lt;br /&gt;
Have control tab working, run:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
$ gsettings set org.gnome.Terminal.Legacy.Keybindings:/org/gnome/terminal/legacy/keybindings/ next-tab &#039;&amp;lt;Primary&amp;gt;Tab&#039;&lt;br /&gt;
$ gsettings set org.gnome.Terminal.Legacy.Keybindings:/org/gnome/terminal/legacy/keybindings/ prev-tab &#039;&amp;lt;Primary&amp;gt;&amp;lt;Shift&amp;gt;Tab&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
See Also: https://askubuntu.com/questions/133384/keyboard-shortcut-gnome-terminal-ctrl-tab-and-ctrl-shift-tab-in-12-04&lt;br /&gt;
&lt;br /&gt;
==Desktop Icons==&lt;br /&gt;
Desktop icons used to be provided by the File program (Nautilus?) by drawing a transparent window containing icons over the desktop. This has since been removed in Gnome 3.28 and has been replaced by the gnome-shell-extension-desktop-icons extension. Install this and restart Gnome.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Previously&#039;&#039;&#039;, icons could be enabled with a gsettings value:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
$ gsettings set org.gnome.desktop.background show-desktop-icons true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Nautilus No Breadcrumbs==&lt;br /&gt;
Change the path with {{code|ctrl}}+{{code|l}}. To make it permanent, set the appropriate key with gsettings:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
$ gsettings set org.gnome.nautilus.preferences always-use-location-entry true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Screensaver Timeout==&lt;br /&gt;
The amount of idle time before the screensaver starts is set using:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
# gsettings get org.gnome.desktop.session idle-delay&lt;br /&gt;
uint32 60&lt;br /&gt;
# gsettings set org.gnome.desktop.session idle-delay 3600&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The amount of time before the screen is locked is set:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
## Instantly locks when the screensaver starts&lt;br /&gt;
# gsettings set org.gnome.desktop.screensaver lock-delay 0&lt;br /&gt;
## Or a delay in seconds. Eg: 1 minute&lt;br /&gt;
# gsettings set org.gnome.desktop.screensaver lock-delay 60&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Keychain + Nextcloud==&lt;br /&gt;
Nextcloud requires {{code|libgnome-keyring}} to be installed and the {{code|gnome-keyring-daemon}} daemon running. Without the keychain, Nextcloud will prompt for credentials on every start up.&lt;br /&gt;
&lt;br /&gt;
Ensure that {{code|gnome-keyring-daemon}} is in the {{code|.xinitrc}} file or that your {{code|.bash_profile}} contains:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
if [ -n &amp;quot;$DESKTOP_SESSION&amp;quot; ];then&lt;br /&gt;
    eval $(gnome-keyring-daemon --start)&lt;br /&gt;
    export SSH_AUTH_SOCK&lt;br /&gt;
fi&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Extensions==&lt;br /&gt;
Some noteworthy extensions. Install the Gnome tweak tool to easily configure these extensions as well as other Gnome desktop behaviors.&lt;br /&gt;
&lt;br /&gt;
===Panel OSD===&lt;br /&gt;
Adjust notification toast location with Panel OSD. The X and Y location of the notification can be adjusted using this shell extension.&lt;br /&gt;
&lt;br /&gt;
===Dash to Panel===&lt;br /&gt;
Dash to Panel makes Gnome look and feel closer to a Windows 7 (and higher) desktop.&lt;br /&gt;
&lt;br /&gt;
===ArcMenu===&lt;br /&gt;
In addition to Dash to Panel, ArcMenu creates a start menu similar to that of Windows 7.&lt;br /&gt;
&lt;br /&gt;
===Applications Menu===&lt;br /&gt;
The applications menu brings back the old applications menu dropdown similar to Gnome 2 and Windows.&lt;br /&gt;
&lt;br /&gt;
===Kstatusnotifieritem/appindicator support===&lt;br /&gt;
System tray has been removed from Gnome. This extension brings back the ability to show any background applications that are running. Requires the shell to be restarted in order to take effect.&lt;br /&gt;
&lt;br /&gt;
===CPU Power Manager===&lt;br /&gt;
Interfaces with the intel_pstate CPU frequency scaling driver. Allows laptops to conserve power by throttling CPU.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
*http://blog.tordeu.com/?p=292&lt;br /&gt;
*http://superuser.com/questions/727120/make-gnome-screen-lock-after-1-hour-not-15-minutes&lt;br /&gt;
&lt;br /&gt;
{{Navbox Linux}}&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:LinuxUtilities]]&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=Gnome&amp;diff=4110</id>
		<title>Gnome</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=Gnome&amp;diff=4110"/>
		<updated>2019-11-25T05:58:39Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* GSettings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== GSettings ==&lt;br /&gt;
The {{code|gsettings}} utility provides a way to get to GSettings which is more or less like a Windows registry containing key value pairs.&lt;br /&gt;
&lt;br /&gt;
GSetting values are different for each user. To modify or view values for a different user, launch a dbus session as the user via {{code|sudo}}:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# sudo -H -u lightdm dbus-launch --exit-with-session gsettings list-recursively&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Gnome Terminal ==&lt;br /&gt;
Have control tab working, run:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
$ gsettings set org.gnome.Terminal.Legacy.Keybindings:/org/gnome/terminal/legacy/keybindings/ next-tab &#039;&amp;lt;Primary&amp;gt;Tab&#039;&lt;br /&gt;
$ gsettings set org.gnome.Terminal.Legacy.Keybindings:/org/gnome/terminal/legacy/keybindings/ prev-tab &#039;&amp;lt;Primary&amp;gt;&amp;lt;Shift&amp;gt;Tab&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Desktop Icons ==&lt;br /&gt;
To enable desktop icons:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
$ gsettings set org.gnome.desktop.background show-desktop-icons true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Nautilus No Breadcrumbs ==&lt;br /&gt;
Change the path with {{code|ctrl}}+{{code|l}}. To make it permanent, set the appropriate key with gsettings:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
$ gsettings set org.gnome.nautilus.preferences always-use-location-entry true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Screensaver Timeout ==&lt;br /&gt;
The amount of idle time before the screensaver starts is set using:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
# gsettings get org.gnome.desktop.session idle-delay&lt;br /&gt;
uint32 60&lt;br /&gt;
# gsettings set org.gnome.desktop.session idle-delay 3600&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The amount of time before the screen is locked is set:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
## Instantly locks when the screensaver starts&lt;br /&gt;
# gsettings set org.gnome.desktop.screensaver lock-delay 0&lt;br /&gt;
## Or a delay in seconds. Eg: 1 minute&lt;br /&gt;
# gsettings set org.gnome.desktop.screensaver lock-delay 60&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Adjust Notification Location ==&lt;br /&gt;
The notification popup toast can be adjusted with the &amp;quot;Panel OSD&amp;quot; shell extension.&lt;br /&gt;
&lt;br /&gt;
== Dash to Panel ==&lt;br /&gt;
Install the &amp;quot;Dash to Panel&amp;quot; extension to make the gnome shell look sane. &lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* http://blog.tordeu.com/?p=292&lt;br /&gt;
* http://superuser.com/questions/727120/make-gnome-screen-lock-after-1-hour-not-15-minutes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Navbox Linux}}[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=Compiling_MIPS&amp;diff=2823</id>
		<title>Compiling MIPS</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=Compiling_MIPS&amp;diff=2823"/>
		<updated>2019-01-28T02:38:59Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: Created page with &amp;quot; == Quick Overview == Figure out what you actually want to compile and which target. There are different releases of the MIPS architecture and code could be big or little endi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Quick Overview ==&lt;br /&gt;
Figure out what you actually want to compile and which target. There are different releases of the MIPS architecture and code could be big or little endian.&lt;br /&gt;
&lt;br /&gt;
Install the cross compiler.&lt;br /&gt;
&lt;br /&gt;
To compile something, such as busybox:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# make CROSS_COMPILE=mips-mti-linux-gnu- CFLAGS=&#039;-Wa,-mips32r2,-march=24kec,-mtune=24kec -mel -EL -Os -ffunction-sections -fdata-sections&#039; LDFLAGS=&#039;-Wa,-mips32r2,-march=24kec,-mtune=24kec -mel -EL -Os -ffunction-sections -fdata-sections&#039; ARCH=mips KBUILD_VERBOSE=1 -j 9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:TODO]]&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=OpenWRT&amp;diff=2640</id>
		<title>OpenWRT</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=OpenWRT&amp;diff=2640"/>
		<updated>2018-08-26T16:26:30Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* Buffalo WZR-600HP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Hardware ==&lt;br /&gt;
=== Raspberry Pi 2 v1.2 ===&lt;br /&gt;
OpenWRT does not list an official image for the Raspberry Pi 2 v1.2 board. Neither the Pi 3 or Pi 2 image works. This is because the Raspberry Pi 2 v1.2 board uses the bcm2710 SOC (same as the Pi 3) but both images don&#039;t properly handle the Pi 2 v1.2 board and as such, both versions fail to boot.&lt;br /&gt;
&lt;br /&gt;
To get OpenWRT to work on this board, image the SD card with the bcm2710 image (the Pi 3 version) and then:&lt;br /&gt;
# Mount {{code|/boot}}&lt;br /&gt;
# Copy {{code|bcm2710-rpi-3-b.dtb}} to {{code|bcm2709-rpi-2-b.dtb}}&lt;br /&gt;
&lt;br /&gt;
A copy can be found at https://github.com/raspberrypi/firmware/raw/master/boot/bcm2710-rpi-3-b.dtb to bcm2709-rpi-2-b.dtb.&lt;br /&gt;
&lt;br /&gt;
=== Buffalo WZR-600HP ===&lt;br /&gt;
Flashing OpenWRT from DD-WRT was very straight forward. There is an issue with getting USB working however.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* Installation: https://wiki.openwrt.org/toh/buffalo/wzr-600dhp#installation_using_the_remote_shell_method&lt;br /&gt;
* Firmware: https://downloads.openwrt.org/releases/18.06.1/targets/ar71xx/generic/openwrt-18.06.1-ar71xx-generic-wzr-600dhp-squashfs-sysupgrade.bin&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# cd /tmp&lt;br /&gt;
# scp foo@host:~/openwrt-18.06.1-ar71xx-generic-wzr-600dhp-squashfs-sysupgrade.bin .&lt;br /&gt;
# mtd -r write openwrt-18.06.1-ar71xx-generic-wzr-600dhp-squashfs-sysupgrade.bin linux&lt;br /&gt;
## This may take about 1-2 minutes, and the -r will automatically reboot the device&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
USB support?&lt;br /&gt;
* opkg install kmod-usb-printer&lt;br /&gt;
* opkg install usbutils&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* opkg install kmod-usb-ohci kmod-usb2&lt;br /&gt;
&lt;br /&gt;
I am only seeing:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
root@buffalo:/dev/bus/usb/001# lsusb&lt;br /&gt;
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub&lt;br /&gt;
root@buffalo:/dev# lsmod {{!}} grep usb&lt;br /&gt;
ledtrig_usbport         2160  0&lt;br /&gt;
nls_base                4736  1 usbcore&lt;br /&gt;
usb_common              1312  1 usbcore&lt;br /&gt;
usbcore               118528  4 usblp,ledtrig_usbport,ehci_platform,ehci_hcd&lt;br /&gt;
usblp                   8480  0&lt;br /&gt;
root@buffalo:/dev# dmesg {{!}} grep -i usb&lt;br /&gt;
[    6.651469] usbcore: registered new interface driver usbfs&lt;br /&gt;
[    6.657039] usbcore: registered new interface driver hub&lt;br /&gt;
[    6.662464] usbcore: registered new device driver usb&lt;br /&gt;
[    6.671682] ehci_hcd: USB 2.0 &#039;Enhanced&#039; Host Controller (EHCI) Driver&lt;br /&gt;
[    6.690631] ehci-platform ehci-platform: new USB bus registered, assigned bus number 1&lt;br /&gt;
[    6.727198] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00&lt;br /&gt;
[    6.734199] hub 1-0:1.0: USB hub found&lt;br /&gt;
[   12.263746] usbcore: registered new interface driver usblp&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
There should be a device at {{code|/dev/usb/lp}}... but there isn&#039;t using OpenWRT 18.01. This definitely worked with the stock firmware.&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=SSD&amp;diff=2554</id>
		<title>SSD</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=SSD&amp;diff=2554"/>
		<updated>2018-01-15T06:41:34Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: initial content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A SSD (short for solid-state drive) uses integrated circuits to store data persistently. Unlike traditional spinning hard disks, a solid-state disk has no moving parts. &lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
=== Controller ===&lt;br /&gt;
The SSD controller provides an interface to the NAND flash memory and has a significant impact on the SSD performance. Other taks that are dealt with by the controller are:&lt;br /&gt;
* Bad block mapping&lt;br /&gt;
* Read/write cache&lt;br /&gt;
* Encryption&lt;br /&gt;
* Error detection / correction&lt;br /&gt;
* Garbage collection&lt;br /&gt;
* Wear leveling&lt;br /&gt;
&lt;br /&gt;
=== Memory ===&lt;br /&gt;
SSDs use flash memory to retain data. Flash memory stores information in an array of memory cells constructed from floating-gate transistors. These memory cells can be constructed to store a single bit (Single-Level Cell), or multiple bits (Multiple-level cell, triple-level cell, etc) by using different charge states to represent different values.&lt;br /&gt;
&lt;br /&gt;
A floating-gate transistor is similar to a standard MOSFET, but with the addition of a floating gate. The floating gate is electrically isolated but will affect how current flows through the gate depending on whether it is charged or not by partially canceling out the electric field from the control gate. By applying an intermediate voltage to the control gate and sensing the current through the gate, it is possible to determine the value (or values) stored in the cell.&lt;br /&gt;
&lt;br /&gt;
Two common flash memories are: NOR and NAND.&lt;br /&gt;
&lt;br /&gt;
NOR flash cells are connected in parallel and acts like a NOR gate. Reading a particular cell requires all other cells in the arrangement to be turned off so that no current flows except through the cell that is being read.&lt;br /&gt;
&lt;br /&gt;
NAND flash cells are connected in series and acts like a NAND gate. Reading a particular cell requires all other cells in the arrangement to be turned on so that they allow current to flow freely except for the cell that is being read.&lt;br /&gt;
&lt;br /&gt;
NAND flash memory is cheaper because cells can be chained in series rather than NOR where cells are in parallel. There is also less wiring required for NAND cells which increases data density. Higher densities can be achieved by stacking these NAND memory arrays on top of each other (3D-NAND)&lt;br /&gt;
&lt;br /&gt;
In either types of flash memory, each cell can be used either as a single cell, or a multi-level cell:&lt;br /&gt;
# SLC - 1 bit per cell&lt;br /&gt;
# MLC - 2 bits per cell&lt;br /&gt;
# TLC - 3 bits per cell&lt;br /&gt;
# QLC - 4 bits per cell&lt;br /&gt;
&lt;br /&gt;
Where SLC uses one charge state to represent a bit, MLC uses multiple charge states to represent multiple bits. By using multiple charge states, there is less tolerance between charge states which leads to higher chances for errors, at the expense of allowing for higher data density. It is important for the SSD controller to handle possible errors due to MLC flash memory with error correcting codes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Host Interfaces ==&lt;br /&gt;
&lt;br /&gt;
* Serial attached SCSI (SAS, 12.0 Gbit/s) – generally found on servers[73]&lt;br /&gt;
* Serial ATA (SATA, 6.0 Gbit/s)[74]&lt;br /&gt;
* PCI Express (PCIe, 31.5 Gbit/s)[75]&lt;br /&gt;
* Fibre Channel (128 Gbit/s) – almost exclusively found on servers&lt;br /&gt;
* USB (10 Gbit/s)[76]&lt;br /&gt;
* Parallel ATA (UMDA, 1064 Mbit/s) – mostly replaced by SATA[77][78]&lt;br /&gt;
* (Parallel) SCSI (&amp;gt; 40 Mbit/s) – generally found on servers, mostly replaced by SAS; last SCSI-based SSD was introduced in 2004[79]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reliability ===&lt;br /&gt;
&lt;br /&gt;
SSDs store data in electrical charges. This will slowly leak over time without power. Old drives may start losing data after 1-2 years in storage, depending on temperature.&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=PHP&amp;diff=2186</id>
		<title>PHP</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=PHP&amp;diff=2186"/>
		<updated>2017-06-12T01:40:32Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* HTTP POST Array Empty */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PHP is a server-side scripting library.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
The instructions here will compile the latest version of PHP as an apache module for a prepackaged apache installation under a RedHat based system (such as CentOS, Fedora, ScientificLinux). The steps below will make use of {{code|apxs2}} from the {{code|http-tools}} package. If you wish to install PHP with suPHP, see [[suPHP]].&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
## Install rpmforge repo&lt;br /&gt;
# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm&lt;br /&gt;
# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt&lt;br /&gt;
# rpm -K rpmforge-release-0.5.2-2.el6.rf.*.rpm&lt;br /&gt;
# rpm -i rpmforge-release-0.5.2-2.el6.rf.*.rpm&lt;br /&gt;
&lt;br /&gt;
## Install all prerequisites.&lt;br /&gt;
# yum -y install make autoconf g++ gcc-c++ libtermcap-devel libgcc-c++ libtool gcc libpng-devel libjpeg-devel libxml1-devel libxml2-devel curl curl-devel libmcrypt libmcrypt-devel libtool-ltdl-devel libxml2.x86_64 libxml2-devel.x86_64 curl-devel.x86_64 openssl-devel httpd-devel &lt;br /&gt;
&lt;br /&gt;
# Compile PHP&lt;br /&gt;
# Go to the PHP source directory, then run:&lt;br /&gt;
# ./configure --with-apxs2 --with-config-file-path=/etc --with-gd --enable-shmop --enable-ftp --enable-sockets --enable-exif --enable-zip --enable-sysvsem --enable-sysvsem --enable-sysvshm --with-jpeg-dir --with-png-dir  --enable-mbstring --enable-embedded-mysqli=shared --with-curl --with-mcrypt --with-mysql --with-mysqli --with-openssl --with-zlib --with-pdo-mysql --with-libdir=lib64&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Add {{code|1=--with-libdir=lib64}} if you  need to reference 64bit libraries. By default, configure will only search in /usr/lib rather than /usr/lib64.&lt;br /&gt;
&lt;br /&gt;
Run {{code|make}} and {{code|make install}}. If you had enabled apache apxs2 above, then it should have enabled the PHP module in apache automatically in {{/etc/httpd/conf/httpd.conf}}. If that failed for whatever reason, you could create an included config at {{code|/etc/httpd/conf.d/php.conf}} with the following contents:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=apache|code=&lt;br /&gt;
#&lt;br /&gt;
# PHP is an HTML-embedded scripting language which attempts to make it&lt;br /&gt;
# easy for developers to write dynamically generated webpages.&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;IfModule prefork.c&amp;gt;&lt;br /&gt;
  LoadModule php5_module modules/libphp5.so&lt;br /&gt;
  # Of if you use PHP 7, use: LoadModule php7_module modules/libphp7.so&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;IfModule worker.c&amp;gt;&lt;br /&gt;
  LoadModule php5_module modules/libphp5-zts.so&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Cause the PHP interpreter to handle files with a .php extension.&lt;br /&gt;
&lt;br /&gt;
AddHandler php5-script .php&lt;br /&gt;
AddType text/html .php&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Add index.php to the list of files that will be served as directory&lt;br /&gt;
# indexes.&lt;br /&gt;
#&lt;br /&gt;
DirectoryIndex index.php&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Uncomment the following line to allow PHP to pretty-print .phps&lt;br /&gt;
# files as PHP source code:&lt;br /&gt;
#&lt;br /&gt;
AddType application/x-httpd-php-source .phps&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
&lt;br /&gt;
==== HTTP POST Array Empty ====&lt;br /&gt;
I had an issue where a PHP POST array was empty when a POST request was made. It turns out that PHP now needs the {{code|Content-Type}} header set for it to be populated regardless of the HTTP method being used.&lt;br /&gt;
&lt;br /&gt;
In detail, when the following request was made, {{code|$_POST}} was empty:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
POST /print HTTP/1.1&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
User-Agent: WebSlipPrinting&lt;br /&gt;
Content-Length: 56&lt;br /&gt;
Host: 172.20.1.151&lt;br /&gt;
&lt;br /&gt;
template_data=Hello There!&amp;amp;Username=test&amp;amp;Password=123456&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The data though was still sent since {{code|$_SERVER[&#039;CONTENT_LENGTH&#039;]}} was 56 as in the original request. The data was also present in the {{code|php://input}} stream. ie:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=php|code=&lt;br /&gt;
var_dump(file_get_contents(&amp;quot;php://input&amp;quot;));&lt;br /&gt;
# Returned:&lt;br /&gt;
# string(56) &amp;quot;template_data=Hello There!&amp;amp;Username=test&amp;amp;Password=123456&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Adding the {{code|Content-Type}} value to the header fixes the issue, with the final request as:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
POST /print HTTP/1.1&lt;br /&gt;
Connection: Keep-Alive&lt;br /&gt;
Content-Type: application/x-www-form-urlencoded&lt;br /&gt;
User-Agent: WebSlipPrinting&lt;br /&gt;
Content-Length: 56&lt;br /&gt;
Host: 172.20.1.151&lt;br /&gt;
&lt;br /&gt;
template_data=Hello There!&amp;amp;Username=test&amp;amp;Password=123456&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This may have something to do with the {{code|enable_post_data_reading}} option in PHP. From the config file:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
 647 ; Whether PHP will read the POST data.&lt;br /&gt;
 648 ; This option is enabled by default.&lt;br /&gt;
 649 ; Most likely, you won&#039;t want to disable this option globally. It causes $_POST&lt;br /&gt;
 650 ; and $_FILES to always be empty; the only way you will be able to read the&lt;br /&gt;
 651 ; POST data will be through the php://input stream wrapper. This can be useful&lt;br /&gt;
 652 ; to proxy requests or to process the POST data in a memory efficient fashion.&lt;br /&gt;
 653 ; http://php.net/enable-post-data-reading&lt;br /&gt;
 654 ;enable_post_data_reading = Off&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== PDOException : could not find driver ====&lt;br /&gt;
You need to have the pdo driver installed. In my case, I was trying to use the pdo-mysql connector which wasn&#039;t compiled with PHP. To fix this, install the PDO driver or compile it manually with:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
 --with-pdo-&amp;lt;driver&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
In my case, I needed mysql:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
 --with-pdo-mysql&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== UTF-8 to hex ====&lt;br /&gt;
There is basically NO good way.&lt;br /&gt;
&lt;br /&gt;
* http://www.tokyomuslim.com/2008/01/php-convert-utf-8-to-hex-codepoint-values-unicode-hexidecimal/&lt;br /&gt;
* http://hsivonen.iki.fi/php-utf8/&lt;br /&gt;
&lt;br /&gt;
==== Error Reporting ====&lt;br /&gt;
{{highlight|lang=php|code=&lt;br /&gt;
// Turn off all error reporting&lt;br /&gt;
error_reporting(0);&lt;br /&gt;
&lt;br /&gt;
// Report simple running errors&lt;br /&gt;
error_reporting(E_ERROR {{!}} E_WARNING {{!}} E_PARSE);&lt;br /&gt;
&lt;br /&gt;
// Reporting E_NOTICE can be good too (to report uninitialized&lt;br /&gt;
// variables or catch variable name misspellings ...)&lt;br /&gt;
error_reporting(E_ERROR {{!}} E_WARNING {{!}} E_PARSE {{!}} E_NOTICE);&lt;br /&gt;
&lt;br /&gt;
// Report all errors except E_NOTICE&lt;br /&gt;
// This is the default value set in php.ini&lt;br /&gt;
error_reporting(E_ALL ^ E_NOTICE);&lt;br /&gt;
&lt;br /&gt;
// Report all PHP errors (see changelog)&lt;br /&gt;
error_reporting(E_ALL);&lt;br /&gt;
&lt;br /&gt;
// Report all PHP errors&lt;br /&gt;
error_reporting(-1);&lt;br /&gt;
&lt;br /&gt;
// Same as error_reporting(E_ALL);&lt;br /&gt;
ini_set(&#039;error_reporting&#039;, E_ALL);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Code]]&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=Email&amp;diff=2162</id>
		<title>Email</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=Email&amp;diff=2162"/>
		<updated>2017-06-03T02:54:04Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: Created page with &amp;quot;https://social.technet.microsoft.com/Forums/en-US/c37957a1-3e45-4eff-a05b-41b74f846eff/receiving-an-scl-of-5-emailing-office-365-outlookcom-hotmail-subscribers?forum=onlineser...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://social.technet.microsoft.com/Forums/en-US/c37957a1-3e45-4eff-a05b-41b74f846eff/receiving-an-scl-of-5-emailing-office-365-outlookcom-hotmail-subscribers?forum=onlineservicesexchange&lt;br /&gt;
&lt;br /&gt;
https://technet.microsoft.com/en-us/library/dn205071(v=exchg.150).aspx&lt;br /&gt;
&lt;br /&gt;
https://technet.microsoft.com/en-us/library/jj200686(v=exchg.150).aspx&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=ZFS&amp;diff=2115</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=ZFS&amp;diff=2115"/>
		<updated>2017-05-23T00:11:42Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* Listing Snapshots */ pipe&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ZFS is a file system and logical volume manager.&lt;br /&gt;
&lt;br /&gt;
Unless otherwise noted, this article will contain instructions which will apply to Linux, FreeBSD, and Solaris.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
ZFS is included with Solaris and FreeBSD. Linux support is offered by various open source projects including the ZFS on Linux project.&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
Download the source or prebuilt packages from ZFS on Linux&#039;s website http://zfsonlinux.org/&lt;br /&gt;
&lt;br /&gt;
Packages from ZFS on Linux will make use of {{code|dkms}} and can be rebuilt when a new kernel is used. (eg: {{code|dkms build -m zfs -v 0.6.5 -k 4.2.5-300.fc23.x86_64}})&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
ZFS stores data inside datasets which are contained inside storage pools (zpool) which are created on top of block devices (vdev). When creating zpools, the vdevs used can be configured similar to different RAID levels for different redundancies. There are also many other options for ZFS which will be covered later.&lt;br /&gt;
&lt;br /&gt;
=== Creating {{code|vdev}}s - The Block Storage ===&lt;br /&gt;
To prevent write-amplification, partitions created on disks with Advanced Format (ie. most modern disks) used for the vdevs should be aligned to 4 kilobyte boundaries, equivalent to 2048 sectors for disks with 512 byte sectors.&lt;br /&gt;
&lt;br /&gt;
Optionally, partitions should be created slightly smaller than the total capacity of the drive in case replacement disks have a different size. The examples used below will be 200 MB smaller than the full size. In sectors, this is 200 * 1024*1024 bytes / 512 bytes/sector = 200 * 2048 sectors = 409600 sectors.&lt;br /&gt;
&lt;br /&gt;
To determine the total number of sectors your disks:&lt;br /&gt;
* On Linux, use {{code|fdisk -l}}&lt;br /&gt;
* On FreeBSD, {{code|diskinfo -v}}&lt;br /&gt;
&lt;br /&gt;
An example of a 3TB disk with 5860533168 sectors.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# fdisk -l /dev/sdf&lt;br /&gt;
Disk /dev/sdf: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 4096 bytes / 4096 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 357F62D3-D1B9-11E3-BE34-00E04C801A50&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Create the data partitions using {{code|gpart}} or {{code|fdisk}} for each of your data disks. Older versions of {{code|fdisk}} do not support drives larger than 2TB.&lt;br /&gt;
&lt;br /&gt;
In the example below, I will be creating a ZFS pool across 3 disks on a FreeBSD machine using {{code|ada1}}, {{code|ada2}}, {{code|ada3}}. Linux machines will do something similar, but the disk device names will be named differently (eg: /dev/sda1, /dev/sdb1, etc.).&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# gpart create -s GPT /dev/ada1&lt;br /&gt;
# gpart add -b 2048 -s 1953113520 -t freebsd-zfs -l disk01 /dev/ada1&lt;br /&gt;
# gpart create -s GPT /dev/ada2&lt;br /&gt;
# gpart add -b 2048 -s 1953113520 -t freebsd-zfs -l disk02 /dev/ada2&lt;br /&gt;
# gpart create -s GPT /dev/ada3&lt;br /&gt;
# gpart add -b 2048 -s 1953113520 -t freebsd-zfs -l disk03 /dev/ada3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note: The partitions created above starts at sector 2048 and ends 200 MB from the end.&lt;br /&gt;
&lt;br /&gt;
=== Creating ZFS Pool ===&lt;br /&gt;
With the data partitions created, you should be able to create your new ZFS volume. The most basic way to create a new zpool is to use the {{code|zpool create}} command.&lt;br /&gt;
&lt;br /&gt;
In the example on this page, we will use a zpool named &#039;storage&#039; across 3 disks using {{code|raidz1}} (1 redundant disk).&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool create -f storage raidz1 gpt/disk01 gpt/disk02 gpt/disk03&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Parameters specific to the zpool can also be passed using the {{code|-o}} option. For instance, if using Advanced Format disks with 4096 sector sizes, you might want to set {{code|1=ashift=12}} so ZFS does not write blocks straddling sectors like so:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool create -o ashift=12 -f storage raidz1 gpt/disk01 gpt/disk02 gpt/disk03&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Once created, you can see the status of the pool using {{code|zfs status}}.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool status&lt;br /&gt;
  pool: pool-name&lt;br /&gt;
  state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
 config:&lt;br /&gt;
 &lt;br /&gt;
         NAME            STATE     READ WRITE CKSUM&lt;br /&gt;
         storage         ONLINE       0     0     0&lt;br /&gt;
           raidz1-0      ONLINE       0     0     0&lt;br /&gt;
             gpt/disk01  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk02  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk03  ONLINE       0     0     0&lt;br /&gt;
 &lt;br /&gt;
 errors: No known data errors&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Zpool Parameters ====&lt;br /&gt;
Use the {{code|zdb}} command to look up a zpool&#039;s parameters. For instance, to see the {{code|ashift}} value of the newly created pool above:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zdb {{!}} grep ashift&lt;br /&gt;
            ashift: 12&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Creating ZFS Filesystems ===&lt;br /&gt;
With a zpool in place, we can start creating ZFS filesystems, also called datasets, and are analogous to volumes in LVM.&lt;br /&gt;
&lt;br /&gt;
The most basic usage is:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs create storage&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Parameters for this specific data set can be specified using the {{code|-o}} option. We&#039;ll talk more about options later.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs create -o compress=lz4 storage/logs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Info|1=Common ZFS Options|2=Here are some options that are pretty useful:&lt;br /&gt;
&lt;br /&gt;
{{code|1=compress=lz4}} - For newer ZFS pools (versions &amp;gt;= 5000), lz4 compression should always be enabled because files that are not compressible will not be compressed which makes it highly efficient. Most CPUs should be able to keep up with IO.&lt;br /&gt;
&lt;br /&gt;
{{code|1=copies=N}} - This tells ZFS to maintain multiple copies of the file for redundancy. In case of bad sectors, ZFS will have the ability to recover the bad data.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To list the data sets:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list&lt;br /&gt;
NAME                         USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
storage                      153K  1.11T   153K  /storage&lt;br /&gt;
storage/logs                 153K  1.11T   153K  /storage/logs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Get/Set Volume Parameters ====&lt;br /&gt;
To get a ZFS parameter, use the {{code|zfs get}} command. Eg:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs get storage compressratio&lt;br /&gt;
NAME                        PROPERTY       VALUE  SOURCE&lt;br /&gt;
storage                     compressratio  1.01x  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To set a ZFS parameter, use the {{code|zfs set}} command. Setting a parameter such as enabling/disabling compression will not alter the existing data. If you wish to compress a volume, you will need to move data out and then back in for it to take affect.&lt;br /&gt;
&lt;br /&gt;
=== ZFS Snapshot ===&lt;br /&gt;
A ZFS snapshot is a read-only copy of the file system from a previous state. Because ZFS makes use of Copy-On-Write, snapshots take no additional space.&lt;br /&gt;
&lt;br /&gt;
==== Listing Snapshots ====&lt;br /&gt;
It can be listed by running {{code|zfs list -t snapshot}}.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list -t snapshot&lt;br /&gt;
NAME               USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
storage@20120820  31.4G      -  3.21T  -&lt;br /&gt;
storage@20120924   134G      -  4.15T  -&lt;br /&gt;
storage@20121028  36.2G      -  4.26T  -&lt;br /&gt;
storage@20121201  33.2M      -  4.55T  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The {{code|USED}} column shows the amount of space used by the snapshot. This amount will go up as files from the snapshot are deleted since the space freed cannot be reclaimed until the snapshot is deleted.&lt;br /&gt;
&lt;br /&gt;
The {{code|REFER}} column shows the actual size of the pool at the snapshot&#039;s timepoint.&lt;br /&gt;
&lt;br /&gt;
To quickly get snapshots ordered by when they were made, use the {{code|-r}} option. Passing in the fields you need (name) will speed this operation up.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list -t snapshot -o name -s name -r data/home&lt;br /&gt;
NAME&lt;br /&gt;
data/home@zbk-daily-20170502-003001&lt;br /&gt;
data/home@zbk-daily-20170503-003001&lt;br /&gt;
data/home@zbk-daily-20170504-003001&lt;br /&gt;
data/home@zbk-daily-20170505-003001&lt;br /&gt;
&lt;br /&gt;
## Get the most recent snapshot name&lt;br /&gt;
# zfs list -t snapshot -o name -s name -r data/home {{!}} tail -n 1 {{!}} awk -F@ &#039;{print $2}&#039;&lt;br /&gt;
zbk-daily-20170505-003001&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Creating Snapshots ====&lt;br /&gt;
To create a new snapshot, run {{code|zfs snapshot storage@snapshot-name}}. The snapshot name can be anything, but a datestamp is typically what I use.&lt;br /&gt;
&lt;br /&gt;
{{Info|No Additional Space is Used|ZFS snapshots make use of Copy-On-Write (COW) and will not use any additional space. However, deleting files that are part of an existing snapshot will not reclaim space. Instead, the storage capacity will  appear to go down since the amount of available space for new data remains the same.&lt;br /&gt;
&lt;br /&gt;
Eg: A volume at 1TB of 2TB capacity has a 0.5TB file deleted. Because the 0.5TB file is still stored in a snapshot, the total capacity is now 2TB - 0.5TB and the reported disk usage will now be 0.5TB of 1.5TB.}}&lt;br /&gt;
&lt;br /&gt;
If I were to run {{code|zfs snapshot storage@snapshot-name}} now, listing the snapshots will yield:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list -t snapshot&lt;br /&gt;
NAME               USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
storage@20120820  31.4G      -  3.21T  -&lt;br /&gt;
storage@20120924   134G      -  4.15T  -&lt;br /&gt;
storage@20121028  36.2G      -  4.26T  -&lt;br /&gt;
storage@20121201  33.2M      -  4.55T  -&lt;br /&gt;
storage@today         0      -  4.58T  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing Snapshot Contents ====&lt;br /&gt;
Snapshot contents can be accessed through a special {{code|.zfs/snapshot/}} directory. Each snapshot will contain a read-only copy of the data that existed when the snapshot was taken.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# ls /storage/.zfs/snapshot/&lt;br /&gt;
20120820/ 20120924/ 20121028/ 20121201/ today/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To roll back to a specific snapshot, run {{code|&#039;&#039;&#039;zfs rollback storage@yesterday&#039;&#039;&#039;}}. This will restore your volume to the snapshot state.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs rollback storage@yesterday&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To delete a specific snapshot, run {{code|&#039;&#039;&#039;zfs destroy storage@today&#039;&#039;&#039;}}. Note that this will not work if other volumes depend on it. eg: If you cloned it as another volume.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs destroy storage@today&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Data Integrity ===&lt;br /&gt;
&lt;br /&gt;
One of the strengths of ZFS its resiliency thanks to its transactional file system. The only way data stored on a ZFS volume to be in an inconsistent state is through hardware failure or some sort of fault with the ZFS implementation. Similar to a {{code|fsck}} on ext file systems, a ZFS scrub provides a way to perform filesystem checking. To initiate a scrub, run:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool scrub storage&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Once the scrub process is underway, you can view its status by running:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool status storage&lt;br /&gt;
   pool: storage&lt;br /&gt;
  state: ONLINE&lt;br /&gt;
  scan: scrub in progress since Mon Dec  3 23:54:53 2012&lt;br /&gt;
     18.3G scanned out of 6.05T at 211M/s, 8h20m to go&lt;br /&gt;
     0 repaired, 0.30% done&lt;br /&gt;
 config:&lt;br /&gt;
 &lt;br /&gt;
         NAME            STATE     READ WRITE CKSUM&lt;br /&gt;
         storage         ONLINE       0     0     0&lt;br /&gt;
           raidz1-0      ONLINE       0     0     0&lt;br /&gt;
             gpt/disk00  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk01  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk02  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk03  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk04  ONLINE       0     0     0&lt;br /&gt;
 &lt;br /&gt;
 errors: No known data errors&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To stop a scrub process, run:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool scrub -s storage&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
=== Listing Zpools and Filesystems ===&lt;br /&gt;
List pools using {{code|zpool list}}:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool list&lt;br /&gt;
NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT&lt;br /&gt;
data     8.12T  5.42T  2.71T         -    50%    66%  1.00x  ONLINE  -&lt;br /&gt;
storage  9.06T  5.93T  3.13T         -    13%    65%  1.00x  ONLINE  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The {{code|FRAG}} value is the average fragmentation of available space.&lt;br /&gt;
&lt;br /&gt;
To list ZFS filesystems, use {{code|zfs list}}&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list&lt;br /&gt;
NAME                         USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
data                        3.61T  1.63T   139K  /data&lt;br /&gt;
data/backups                 944G  1.63T   901G  /data/backups&lt;br /&gt;
data/crypt                   125G  1.63T   125G  /data/crypt&lt;br /&gt;
data/dashcam                84.5G  1.63T  84.5G  /data/dashcam&lt;br /&gt;
data/home                    169G  1.63T   153G  /data/home&lt;br /&gt;
data/images                  999G  1.63T   999G  /data/images&lt;br /&gt;
data/public                 1.11T  1.63T  1.03T  /data/public&lt;br /&gt;
data/scratch                 167G  1.63T   158G  /data/scratch&lt;br /&gt;
data/vm                     71.2G  1.63T  57.8G  /data/vm&lt;br /&gt;
storage                     4.74T  2.27T  26.2G  /storage&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To list snapshots, pass {{code|-t snapshot}}&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list -t snapshot&lt;br /&gt;
NAME                                                   USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
data/backups@2015-Dec-15                               658M      -   588G  -&lt;br /&gt;
data/backups@2017-Jan-01                                  0      -   927G  -&lt;br /&gt;
data/backups@2017-Jan-08                                  0      -   927G  -&lt;br /&gt;
data/backups@2017-Jan-15                              74.6K      -   927G  -&lt;br /&gt;
data/backups@2017-Jan-22                               416K      -   927G  -&lt;br /&gt;
data/backups@2017-Jan-29                               767K      -   927G  -&lt;br /&gt;
data/backups@2017-Feb-05                                  0      -   927G  -&lt;br /&gt;
data/backups@2017-Feb-12                                  0      -   927G  -&lt;br /&gt;
data/backups@2017-Feb-19                               202K      -   927G  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get properties of your ZFS filesystems, use the {{code|zfs get PROPERTYNAME }} command:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs get compressratio&lt;br /&gt;
NAME  PROPERTY       VALUE  SOURCE&lt;br /&gt;
data  compressratio  1.02x  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transferring ZFS Data Sets ===&lt;br /&gt;
You can transfer a ZFS snapshot using the {{code|send}} and {{code|receive}} commands.&lt;br /&gt;
&lt;br /&gt;
Using SSH:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs send  zones/UUID@snapshot  | ssh root@10.10.11.5 zfs recv zones/UUID&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Using Netcat:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
## On the source machine&lt;br /&gt;
# zfs send data/linbuild@B | nc -w 20 phoenix 8000&lt;br /&gt;
## On the destination machine&lt;br /&gt;
# nc -w 120 -l 8000 | pv | zfs receive -F data/linbuild&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NFS Share ===&lt;br /&gt;
&lt;br /&gt;
==== FreeBSD ====&lt;br /&gt;
To share a ZFS pool via NFS on a FreeBSD system, ensure that you have the following in your {{code|/etc/rc.conf}} file.&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
mountd_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
rpcbind_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
nfs_server_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
mountd_flags=&amp;quot;-r -p 735&amp;quot;&lt;br /&gt;
zfs_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{code|mountd}} is required for exports to be loaded from {{code|/etc/exports}}. You must also either reload or restart {{code|mountd}} everytime you make a change to the exports file in order to have it reread.&lt;br /&gt;
&lt;br /&gt;
Set the {{code|sharenfs}} property using the {{code|zfs}} utility. To share it with anyone, set it to &#039;on&#039;, or to some other value. Eg:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs sharenfs=off storage&lt;br /&gt;
# zfs sharenfs=&amp;quot;-network 172.17.12.0/24&amp;quot; storage/linbuild&lt;br /&gt;
zfs get sharenfs&lt;br /&gt;
NAME                      PROPERTY  VALUE                    SOURCE&lt;br /&gt;
data                      sharenfs  off                      local&lt;br /&gt;
data/linbuild             sharenfs  -network 172.17.12.0/24  local&lt;br /&gt;
data/linbuild/centos      sharenfs  -network 172.17.12.0/24  inherited from data/linbuild&lt;br /&gt;
data/linbuild/fedora      sharenfs  -network 172.17.12.0/24  inherited from data/linbuild&lt;br /&gt;
data/linbuild/scientific  sharenfs  -network 172.17.12.0/24  inherited from data/linbuild&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Add the paths you wish to export to {{code|/etc/exports}} and reload {{code|mountd}}.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Questionable stuff here:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By setting the {{code|sharenfs}} property, your system will automatically create an export for the zfs pool using {{code|mountd}}. By default, without specifying any options, the NFS share will only be accessible locally. &lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# showmount -e&lt;br /&gt;
Exports list on localhost:&lt;br /&gt;
/data                           Everyone&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The above will create a share {{code|/storage}} that is available to all. If you want to restrict the share to a specific network, you can do something like:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs sharenfs=&amp;quot;-network 10.1.1.0/24&amp;quot; storage&lt;br /&gt;
# showmount -e&lt;br /&gt;
Exports list on localhost:&lt;br /&gt;
/storage                           10.1.1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
By the way, the exports are stored in {{code|/etc/zfs/exports}} and not in the usual {{code|/etc/exports}}. The ZFS and mountd service must be started for it to work. Therefore, you&#039;ll also need to append to {{code|/etc/rc.conf}} the following line:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
mountd_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== On Linux ====&lt;br /&gt;
To share ZFS pools on Linux, do the same stuff as you would on a FreeBSD system (see above). However, you may need to update the NFS export file manually by running the systemd {{code|zfs-share}} script in {{code|/usr/lib/systemd/system}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Enabling on Startup ===&lt;br /&gt;
&lt;br /&gt;
==== FreeBSD ====&lt;br /&gt;
For your ZFS pool to be mounted on startup, you will need the zfs service enabled by having the following line in {{code|/etc/rc.conf}}:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
zfs_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Linux ====&lt;br /&gt;
===== Loading Kernel Modules on Boot =====&lt;br /&gt;
After installing ZFS on Linux, you may need to create a file in either {{code|/etc/modules-load.d}} or {{code|/etc/modprobe.d}} so that the ZFS module gets loaded.&lt;br /&gt;
&lt;br /&gt;
To only load the module, create a file at {{code|/etc/modules-load.d/zfs.conf}} containing:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
zfs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To load the module with options, create a file at {{code|/etc/modprobe.d/zfs.conf}} containing (for example):&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
options zfs zfs_arc_max=4294967296&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== Enabling Systemd Services =====&lt;br /&gt;
On Systemd based systems, you will need to enable the following services in order to have the zpool loaded and mounted on start up. If you have sharing enabled, you will want to also enable the {{code|zfs-share}} service too.&lt;br /&gt;
* {{code|zfs-import-cache}}&lt;br /&gt;
* {{code|zfs-mount}}&lt;br /&gt;
* {{code|zfs-share}}&lt;br /&gt;
&lt;br /&gt;
You may want to look at what these service files do by looking at them at {{code|/usr/lib/systemd/system/}}.&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t enable these services, your zpools will be loaded but not mounted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Handling Drive Failure ===&lt;br /&gt;
When a drive fails, you will see something similar to:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool status&lt;br /&gt;
  pool: data&lt;br /&gt;
 state: DEGRADED&lt;br /&gt;
status: One or more devices could not be used because the label is missing or&lt;br /&gt;
        invalid.  Sufficient replicas exist for the pool to continue&lt;br /&gt;
        functioning in a degraded state.&lt;br /&gt;
action: Replace the device using &#039;zpool replace&#039;.&lt;br /&gt;
   see: http://zfsonlinux.org/msg/ZFS-8000-4J&lt;br /&gt;
  scan: scrub repaired 0 in 2h31m with 0 errors on Fri Jun  3 19:20:15 2016&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME        STATE     READ WRITE CKSUM&lt;br /&gt;
        data        DEGRADED     0     0     0&lt;br /&gt;
          raidz2-0  DEGRADED     0     0     0&lt;br /&gt;
            sdb     ONLINE       0     0     0&lt;br /&gt;
            sdc     ONLINE       0     0     0&lt;br /&gt;
            sdd     ONLINE       0     0     0&lt;br /&gt;
            sde     ONLINE       0     0     0&lt;br /&gt;
            sdf     ONLINE       0     0     0&lt;br /&gt;
            sdg     UNAVAIL      3   222     0  corrupted data&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The device {{code|sdg}} failed and was removed from the pool.&lt;br /&gt;
&lt;br /&gt;
{{info|Dell Server Info|Since this happened on a server, I removed the failed disk from the machine and replaced it with another one.&lt;br /&gt;
&lt;br /&gt;
Because this server uses a Dell RAID controller, and these Dell RAID controllers can&#039;t do a pass-through, each disk that is part of the ZFS array is its own Raid0 vdisk. When inserting a new drive, the vdisk information needs to be re-created via OpenManage before the disk comes online.&lt;br /&gt;
&lt;br /&gt;
Follow the steps on the  [[Dell_OpenManage#Creating_a_new_vdisk|Dell OpenManage]] after inserting the replacement drive if this applies to you.&lt;br /&gt;
&lt;br /&gt;
Once the vdisk is recreated, it should show up as the old device name again.}}&lt;br /&gt;
&lt;br /&gt;
Once the replacement disk is installed on the system, reinitialize the drive with the GPT label.&lt;br /&gt;
&lt;br /&gt;
On a FreeBSD system: I reinitialized the disks using the geometry settings described above.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# gpart create -s GPT da0&lt;br /&gt;
da4 created&lt;br /&gt;
# gpart add -b 2048 -s 3906617520 -t freebsd-zfs -l disk03 da4&lt;br /&gt;
da4p1 added&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On a ZFS on Linux system: &lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# parted /dev/sdg&lt;br /&gt;
GNU Parted 2.1&lt;br /&gt;
Using /dev/sdg&lt;br /&gt;
Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
(parted) mklabel GPT&lt;br /&gt;
Warning: The existing disk label on /dev/sdg will be destroyed and all data on this disk will be lost. Do&lt;br /&gt;
you want to continue?&lt;br /&gt;
Yes/No? y&lt;br /&gt;
(parted) quit&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To replace the offline disk, use {{code|zpool replace pool old-device new-device}}.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool replace data sdg /dev/sdg&lt;br /&gt;
# zpool status&lt;br /&gt;
  pool: data&lt;br /&gt;
 state: DEGRADED&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Mon Apr 10 16:36:35 2017&lt;br /&gt;
    35.5M scanned out of 3.03T at 3.55M/s, 249h19m to go&lt;br /&gt;
    5.45M resilvered, 0.00% done&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME             STATE     READ WRITE CKSUM&lt;br /&gt;
        data             DEGRADED     0     0     0&lt;br /&gt;
          raidz2-0       DEGRADED     0     0     0&lt;br /&gt;
            sdb          ONLINE       0     0     0&lt;br /&gt;
            sdc          ONLINE       0     0     0&lt;br /&gt;
            sdd          ONLINE       0     0     0&lt;br /&gt;
            sde          ONLINE       0     0     0&lt;br /&gt;
            sdf          ONLINE       0     0     0&lt;br /&gt;
            replacing-5  UNAVAIL      0     0     0&lt;br /&gt;
              old        UNAVAIL      3   222     0  corrupted data&lt;br /&gt;
              sdg        ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Tuning and Monitoring ==&lt;br /&gt;
&lt;br /&gt;
=== ZFS ARC ===&lt;br /&gt;
The ZFS Adaptive Replacement Cache (ARC) is an in-memory cached managed by ZFS to help improve speed duplicate reads.&lt;br /&gt;
&lt;br /&gt;
The ZFS ARC size from the ZFS on Linux implementation defaults to half the host&#039;s available memory and may decrease when available memory gets too low. Depending on the system setup, you may want to change the maximum amount of memory allocated to ARC.&lt;br /&gt;
&lt;br /&gt;
To change the maximum ARC size, edit the ZFS {{code|zfs_arc_max}} kernel module parameter:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# cat /etc/modprobe.d/zfs.conf&lt;br /&gt;
options zfs zfs_arc_max=4294967296&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You may check the current ARC usage by checking {{code|cat /proc/spl/kstat/zfs/arcstats}} or use the {{code|arcstat.py}} script that&#039;s part of the {{code|zfs}} package.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# cat /proc/spl/kstat/zfs/arcstats&lt;br /&gt;
p                               4    1851836123&lt;br /&gt;
c                               4    4105979840&lt;br /&gt;
c_min                           4    33554432&lt;br /&gt;
c_max                           4    4294967296&lt;br /&gt;
size                            4    4105591928&lt;br /&gt;
hdr_size                        4    55529696&lt;br /&gt;
data_size                       4    3027917312&lt;br /&gt;
metadata_size                   4    747323904&lt;br /&gt;
other_size                      4    274821016&lt;br /&gt;
anon_size                       4    4979712&lt;br /&gt;
anon_evictable_data             4    0&lt;br /&gt;
anon_evictable_metadata         4    0&lt;br /&gt;
mru_size                        4    848103424&lt;br /&gt;
mru_evictable_data              4    605918208&lt;br /&gt;
mru_evictable_metadata          4    97727488&lt;br /&gt;
mru_ghost_size                  4    3224668160&lt;br /&gt;
mru_ghost_evictable_data        4    2267575296&lt;br /&gt;
mru_ghost_evictable_metadata    4    957092864&lt;br /&gt;
mfu_size                        4    2922158080&lt;br /&gt;
mfu_evictable_data              4    2421089280&lt;br /&gt;
mfu_evictable_metadata          4    495401984&lt;br /&gt;
mfu_ghost_size                  4    835275264&lt;br /&gt;
mfu_ghost_evictable_data        4    787349504&lt;br /&gt;
mfu_ghost_evictable_metadata    4    47925760&lt;br /&gt;
l2_hits                         4    0&lt;br /&gt;
l2_misses                       4    0&lt;br /&gt;
l2_feeds                        4    0&lt;br /&gt;
l2_rw_clash                     4    0&lt;br /&gt;
l2_read_bytes                   4    0&lt;br /&gt;
l2_write_bytes                  4    0&lt;br /&gt;
l2_writes_sent                  4    0&lt;br /&gt;
l2_writes_done                  4    0&lt;br /&gt;
l2_writes_error                 4    0&lt;br /&gt;
l2_writes_lock_retry            4    0&lt;br /&gt;
l2_evict_lock_retry             4    0&lt;br /&gt;
l2_evict_reading                4    0&lt;br /&gt;
l2_evict_l1cached               4    0&lt;br /&gt;
l2_free_on_write                4    0&lt;br /&gt;
l2_cdata_free_on_write          4    0&lt;br /&gt;
l2_abort_lowmem                 4    0&lt;br /&gt;
l2_cksum_bad                    4    0&lt;br /&gt;
l2_io_error                     4    0&lt;br /&gt;
l2_size                         4    0&lt;br /&gt;
l2_asize                        4    0&lt;br /&gt;
l2_hdr_size                     4    0&lt;br /&gt;
l2_compress_successes           4    0&lt;br /&gt;
l2_compress_zeros               4    0&lt;br /&gt;
l2_compress_failures            4    0&lt;br /&gt;
memory_throttle_count           4    0&lt;br /&gt;
duplicate_buffers               4    0&lt;br /&gt;
duplicate_buffers_size          4    0&lt;br /&gt;
duplicate_reads                 4    0&lt;br /&gt;
memory_direct_count             4    46505&lt;br /&gt;
memory_indirect_count           4    30062&lt;br /&gt;
arc_no_grow                     4    0&lt;br /&gt;
arc_tempreserve                 4    0&lt;br /&gt;
arc_loaned_bytes                4    0&lt;br /&gt;
arc_prune                       4    0&lt;br /&gt;
arc_meta_used                   4    1077674616&lt;br /&gt;
arc_meta_limit                  4    3113852928&lt;br /&gt;
arc_meta_max                    4    1077674616&lt;br /&gt;
arc_meta_min                    4    16777216&lt;br /&gt;
arc_need_free                   4    0&lt;br /&gt;
arc_sys_free                    4    129740800&lt;br /&gt;
&lt;br /&gt;
# arcstat.py 10 10&lt;br /&gt;
    time  read  miss  miss%  dmis  dm%  pmis  pm%  mmis  mm%  arcsz     c&lt;br /&gt;
17:41:09     0     0      0     0    0     0    0     0    0   3.9G  3.9G&lt;br /&gt;
17:41:19   211    68     32     6    7    62   50    68   32   3.9G  3.9G&lt;br /&gt;
17:41:29   146    32     21     6   10    25   30    32   21   3.9G  3.9G&lt;br /&gt;
17:41:39   170    50     29     6    9    44   42    50   31   3.9G  3.9G&lt;br /&gt;
17:41:49   150    33     22     6    9    27   31    33   22   3.9G  3.9G&lt;br /&gt;
17:41:59   151    43     28     4    9    38   39    43   28   3.9G  3.9G&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See Also:&lt;br /&gt;
* http://fibrevillage.com/storage/169-zfs-arc-on-linux-how-to-set-and-monitor-on-linux&lt;br /&gt;
&lt;br /&gt;
=== ZFS L2ARC ===&lt;br /&gt;
The ZFS L2ARC provides caching by extending the main memory cache with faster-than-storage-pool disks such as SSDs. Cached data that normally wouldn&#039;t fit in the ARC would be cached in the L2ARC.&lt;br /&gt;
&lt;br /&gt;
=== ZFS ZIL ===&lt;br /&gt;
The ZFS Intent Log (ZIL) is how ZFS keeps track of synchronous write operations so that they can be completed or rolled back after a crash or failure. The ZIL is not used or asynchronous writes - those are still done through system caches. &lt;br /&gt;
&lt;br /&gt;
Because ZIL is stored in the data pool, writing to a ZFS pool involves duplicate writes to the pool: Once to the ZIL and again for the actual data. This is detrimental to performance since one write operation now requires two or more writes.&lt;br /&gt;
To improve performance, the ZIL could be moved to a separate device called a Separate Intent Log (SLOG), typically a SSD. With a SLOG, a write operation will write once to the SLOG and once for the actual data.&lt;br /&gt;
&lt;br /&gt;
See Also:&lt;br /&gt;
* http://www.freenas.org/blog/zfs-zil-and-slog-demystified/&lt;br /&gt;
* https://www.ixsystems.com/blog/o-slog-not-slog-best-configure-zfs-intent-log/&lt;br /&gt;
&lt;br /&gt;
=== Alignment Shift ===&lt;br /&gt;
Make sure that your vdevs have the proper alignment shift.&lt;br /&gt;
{|&lt;br /&gt;
! Device&lt;br /&gt;
! Alignment&lt;br /&gt;
|-&lt;br /&gt;
| Hard Drives with 512B sectors&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| Flash Media / HDD with 4K sectors &lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| Flash Media / HDD with 8K sectors&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| Amazon EC2&lt;br /&gt;
| 12&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See Also:&lt;br /&gt;
* http://open-zfs.org/wiki/Performance_tuning#Alignment_shift&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* https://wiki.archlinux.org/index.php/ZFS&lt;br /&gt;
* https://www.freebsd.org/doc/handbook/zfs-zfs.html&lt;br /&gt;
* http://superuser.com/questions/608612/4k-hard-drives-freebsd-gpart-and-zfs&lt;br /&gt;
&lt;br /&gt;
[[Category:FreeBSD]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=ZFS&amp;diff=2114</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=ZFS&amp;diff=2114"/>
		<updated>2017-05-23T00:10:45Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* Listing Snapshots */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ZFS is a file system and logical volume manager.&lt;br /&gt;
&lt;br /&gt;
Unless otherwise noted, this article will contain instructions which will apply to Linux, FreeBSD, and Solaris.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
ZFS is included with Solaris and FreeBSD. Linux support is offered by various open source projects including the ZFS on Linux project.&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
Download the source or prebuilt packages from ZFS on Linux&#039;s website http://zfsonlinux.org/&lt;br /&gt;
&lt;br /&gt;
Packages from ZFS on Linux will make use of {{code|dkms}} and can be rebuilt when a new kernel is used. (eg: {{code|dkms build -m zfs -v 0.6.5 -k 4.2.5-300.fc23.x86_64}})&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
ZFS stores data inside datasets which are contained inside storage pools (zpool) which are created on top of block devices (vdev). When creating zpools, the vdevs used can be configured similar to different RAID levels for different redundancies. There are also many other options for ZFS which will be covered later.&lt;br /&gt;
&lt;br /&gt;
=== Creating {{code|vdev}}s - The Block Storage ===&lt;br /&gt;
To prevent write-amplification, partitions created on disks with Advanced Format (ie. most modern disks) used for the vdevs should be aligned to 4 kilobyte boundaries, equivalent to 2048 sectors for disks with 512 byte sectors.&lt;br /&gt;
&lt;br /&gt;
Optionally, partitions should be created slightly smaller than the total capacity of the drive in case replacement disks have a different size. The examples used below will be 200 MB smaller than the full size. In sectors, this is 200 * 1024*1024 bytes / 512 bytes/sector = 200 * 2048 sectors = 409600 sectors.&lt;br /&gt;
&lt;br /&gt;
To determine the total number of sectors your disks:&lt;br /&gt;
* On Linux, use {{code|fdisk -l}}&lt;br /&gt;
* On FreeBSD, {{code|diskinfo -v}}&lt;br /&gt;
&lt;br /&gt;
An example of a 3TB disk with 5860533168 sectors.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# fdisk -l /dev/sdf&lt;br /&gt;
Disk /dev/sdf: 2.7 TiB, 3000592982016 bytes, 5860533168 sectors&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 4096 bytes / 4096 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 357F62D3-D1B9-11E3-BE34-00E04C801A50&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Create the data partitions using {{code|gpart}} or {{code|fdisk}} for each of your data disks. Older versions of {{code|fdisk}} do not support drives larger than 2TB.&lt;br /&gt;
&lt;br /&gt;
In the example below, I will be creating a ZFS pool across 3 disks on a FreeBSD machine using {{code|ada1}}, {{code|ada2}}, {{code|ada3}}. Linux machines will do something similar, but the disk device names will be named differently (eg: /dev/sda1, /dev/sdb1, etc.).&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# gpart create -s GPT /dev/ada1&lt;br /&gt;
# gpart add -b 2048 -s 1953113520 -t freebsd-zfs -l disk01 /dev/ada1&lt;br /&gt;
# gpart create -s GPT /dev/ada2&lt;br /&gt;
# gpart add -b 2048 -s 1953113520 -t freebsd-zfs -l disk02 /dev/ada2&lt;br /&gt;
# gpart create -s GPT /dev/ada3&lt;br /&gt;
# gpart add -b 2048 -s 1953113520 -t freebsd-zfs -l disk03 /dev/ada3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note: The partitions created above starts at sector 2048 and ends 200 MB from the end.&lt;br /&gt;
&lt;br /&gt;
=== Creating ZFS Pool ===&lt;br /&gt;
With the data partitions created, you should be able to create your new ZFS volume. The most basic way to create a new zpool is to use the {{code|zpool create}} command.&lt;br /&gt;
&lt;br /&gt;
In the example on this page, we will use a zpool named &#039;storage&#039; across 3 disks using {{code|raidz1}} (1 redundant disk).&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool create -f storage raidz1 gpt/disk01 gpt/disk02 gpt/disk03&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Parameters specific to the zpool can also be passed using the {{code|-o}} option. For instance, if using Advanced Format disks with 4096 sector sizes, you might want to set {{code|1=ashift=12}} so ZFS does not write blocks straddling sectors like so:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool create -o ashift=12 -f storage raidz1 gpt/disk01 gpt/disk02 gpt/disk03&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Once created, you can see the status of the pool using {{code|zfs status}}.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool status&lt;br /&gt;
  pool: pool-name&lt;br /&gt;
  state: ONLINE&lt;br /&gt;
  scan: none requested&lt;br /&gt;
 config:&lt;br /&gt;
 &lt;br /&gt;
         NAME            STATE     READ WRITE CKSUM&lt;br /&gt;
         storage         ONLINE       0     0     0&lt;br /&gt;
           raidz1-0      ONLINE       0     0     0&lt;br /&gt;
             gpt/disk01  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk02  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk03  ONLINE       0     0     0&lt;br /&gt;
 &lt;br /&gt;
 errors: No known data errors&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Zpool Parameters ====&lt;br /&gt;
Use the {{code|zdb}} command to look up a zpool&#039;s parameters. For instance, to see the {{code|ashift}} value of the newly created pool above:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zdb {{!}} grep ashift&lt;br /&gt;
            ashift: 12&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Creating ZFS Filesystems ===&lt;br /&gt;
With a zpool in place, we can start creating ZFS filesystems, also called datasets, and are analogous to volumes in LVM.&lt;br /&gt;
&lt;br /&gt;
The most basic usage is:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs create storage&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Parameters for this specific data set can be specified using the {{code|-o}} option. We&#039;ll talk more about options later.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs create -o compress=lz4 storage/logs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Info|1=Common ZFS Options|2=Here are some options that are pretty useful:&lt;br /&gt;
&lt;br /&gt;
{{code|1=compress=lz4}} - For newer ZFS pools (versions &amp;gt;= 5000), lz4 compression should always be enabled because files that are not compressible will not be compressed which makes it highly efficient. Most CPUs should be able to keep up with IO.&lt;br /&gt;
&lt;br /&gt;
{{code|1=copies=N}} - This tells ZFS to maintain multiple copies of the file for redundancy. In case of bad sectors, ZFS will have the ability to recover the bad data.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To list the data sets:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list&lt;br /&gt;
NAME                         USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
storage                      153K  1.11T   153K  /storage&lt;br /&gt;
storage/logs                 153K  1.11T   153K  /storage/logs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Get/Set Volume Parameters ====&lt;br /&gt;
To get a ZFS parameter, use the {{code|zfs get}} command. Eg:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs get storage compressratio&lt;br /&gt;
NAME                        PROPERTY       VALUE  SOURCE&lt;br /&gt;
storage                     compressratio  1.01x  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To set a ZFS parameter, use the {{code|zfs set}} command. Setting a parameter such as enabling/disabling compression will not alter the existing data. If you wish to compress a volume, you will need to move data out and then back in for it to take affect.&lt;br /&gt;
&lt;br /&gt;
=== ZFS Snapshot ===&lt;br /&gt;
A ZFS snapshot is a read-only copy of the file system from a previous state. Because ZFS makes use of Copy-On-Write, snapshots take no additional space.&lt;br /&gt;
&lt;br /&gt;
==== Listing Snapshots ====&lt;br /&gt;
It can be listed by running {{code|zfs list -t snapshot}}.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list -t snapshot&lt;br /&gt;
NAME               USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
storage@20120820  31.4G      -  3.21T  -&lt;br /&gt;
storage@20120924   134G      -  4.15T  -&lt;br /&gt;
storage@20121028  36.2G      -  4.26T  -&lt;br /&gt;
storage@20121201  33.2M      -  4.55T  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The {{code|USED}} column shows the amount of space used by the snapshot. This amount will go up as files from the snapshot are deleted since the space freed cannot be reclaimed until the snapshot is deleted.&lt;br /&gt;
&lt;br /&gt;
The {{code|REFER}} column shows the actual size of the pool at the snapshot&#039;s timepoint.&lt;br /&gt;
&lt;br /&gt;
To quickly get snapshots ordered by when they were made, use the {{code|-r}} option. Passing in the fields you need (name) will speed this operation up.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list -t snapshot -o name -s name -r data/home&lt;br /&gt;
NAME&lt;br /&gt;
data/home@zbk-daily-20170502-003001&lt;br /&gt;
data/home@zbk-daily-20170503-003001&lt;br /&gt;
data/home@zbk-daily-20170504-003001&lt;br /&gt;
data/home@zbk-daily-20170505-003001&lt;br /&gt;
&lt;br /&gt;
## Get the most recent snapshot name&lt;br /&gt;
# zfs list -t snapshot -o name -s name -r data/home | tail -n 1 | awk -F@ &#039;{print $2}&#039;&lt;br /&gt;
zbk-daily-20170505-003001&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Creating Snapshots ====&lt;br /&gt;
To create a new snapshot, run {{code|zfs snapshot storage@snapshot-name}}. The snapshot name can be anything, but a datestamp is typically what I use.&lt;br /&gt;
&lt;br /&gt;
{{Info|No Additional Space is Used|ZFS snapshots make use of Copy-On-Write (COW) and will not use any additional space. However, deleting files that are part of an existing snapshot will not reclaim space. Instead, the storage capacity will  appear to go down since the amount of available space for new data remains the same.&lt;br /&gt;
&lt;br /&gt;
Eg: A volume at 1TB of 2TB capacity has a 0.5TB file deleted. Because the 0.5TB file is still stored in a snapshot, the total capacity is now 2TB - 0.5TB and the reported disk usage will now be 0.5TB of 1.5TB.}}&lt;br /&gt;
&lt;br /&gt;
If I were to run {{code|zfs snapshot storage@snapshot-name}} now, listing the snapshots will yield:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list -t snapshot&lt;br /&gt;
NAME               USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
storage@20120820  31.4G      -  3.21T  -&lt;br /&gt;
storage@20120924   134G      -  4.15T  -&lt;br /&gt;
storage@20121028  36.2G      -  4.26T  -&lt;br /&gt;
storage@20121201  33.2M      -  4.55T  -&lt;br /&gt;
storage@today         0      -  4.58T  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Accessing Snapshot Contents ====&lt;br /&gt;
Snapshot contents can be accessed through a special {{code|.zfs/snapshot/}} directory. Each snapshot will contain a read-only copy of the data that existed when the snapshot was taken.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# ls /storage/.zfs/snapshot/&lt;br /&gt;
20120820/ 20120924/ 20121028/ 20121201/ today/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To roll back to a specific snapshot, run {{code|&#039;&#039;&#039;zfs rollback storage@yesterday&#039;&#039;&#039;}}. This will restore your volume to the snapshot state.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs rollback storage@yesterday&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To delete a specific snapshot, run {{code|&#039;&#039;&#039;zfs destroy storage@today&#039;&#039;&#039;}}. Note that this will not work if other volumes depend on it. eg: If you cloned it as another volume.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs destroy storage@today&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Data Integrity ===&lt;br /&gt;
&lt;br /&gt;
One of the strengths of ZFS its resiliency thanks to its transactional file system. The only way data stored on a ZFS volume to be in an inconsistent state is through hardware failure or some sort of fault with the ZFS implementation. Similar to a {{code|fsck}} on ext file systems, a ZFS scrub provides a way to perform filesystem checking. To initiate a scrub, run:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool scrub storage&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Once the scrub process is underway, you can view its status by running:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool status storage&lt;br /&gt;
   pool: storage&lt;br /&gt;
  state: ONLINE&lt;br /&gt;
  scan: scrub in progress since Mon Dec  3 23:54:53 2012&lt;br /&gt;
     18.3G scanned out of 6.05T at 211M/s, 8h20m to go&lt;br /&gt;
     0 repaired, 0.30% done&lt;br /&gt;
 config:&lt;br /&gt;
 &lt;br /&gt;
         NAME            STATE     READ WRITE CKSUM&lt;br /&gt;
         storage         ONLINE       0     0     0&lt;br /&gt;
           raidz1-0      ONLINE       0     0     0&lt;br /&gt;
             gpt/disk00  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk01  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk02  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk03  ONLINE       0     0     0&lt;br /&gt;
             gpt/disk04  ONLINE       0     0     0&lt;br /&gt;
 &lt;br /&gt;
 errors: No known data errors&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To stop a scrub process, run:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool scrub -s storage&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
=== Listing Zpools and Filesystems ===&lt;br /&gt;
List pools using {{code|zpool list}}:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool list&lt;br /&gt;
NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT&lt;br /&gt;
data     8.12T  5.42T  2.71T         -    50%    66%  1.00x  ONLINE  -&lt;br /&gt;
storage  9.06T  5.93T  3.13T         -    13%    65%  1.00x  ONLINE  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The {{code|FRAG}} value is the average fragmentation of available space.&lt;br /&gt;
&lt;br /&gt;
To list ZFS filesystems, use {{code|zfs list}}&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list&lt;br /&gt;
NAME                         USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
data                        3.61T  1.63T   139K  /data&lt;br /&gt;
data/backups                 944G  1.63T   901G  /data/backups&lt;br /&gt;
data/crypt                   125G  1.63T   125G  /data/crypt&lt;br /&gt;
data/dashcam                84.5G  1.63T  84.5G  /data/dashcam&lt;br /&gt;
data/home                    169G  1.63T   153G  /data/home&lt;br /&gt;
data/images                  999G  1.63T   999G  /data/images&lt;br /&gt;
data/public                 1.11T  1.63T  1.03T  /data/public&lt;br /&gt;
data/scratch                 167G  1.63T   158G  /data/scratch&lt;br /&gt;
data/vm                     71.2G  1.63T  57.8G  /data/vm&lt;br /&gt;
storage                     4.74T  2.27T  26.2G  /storage&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To list snapshots, pass {{code|-t snapshot}}&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs list -t snapshot&lt;br /&gt;
NAME                                                   USED  AVAIL  REFER  MOUNTPOINT&lt;br /&gt;
data/backups@2015-Dec-15                               658M      -   588G  -&lt;br /&gt;
data/backups@2017-Jan-01                                  0      -   927G  -&lt;br /&gt;
data/backups@2017-Jan-08                                  0      -   927G  -&lt;br /&gt;
data/backups@2017-Jan-15                              74.6K      -   927G  -&lt;br /&gt;
data/backups@2017-Jan-22                               416K      -   927G  -&lt;br /&gt;
data/backups@2017-Jan-29                               767K      -   927G  -&lt;br /&gt;
data/backups@2017-Feb-05                                  0      -   927G  -&lt;br /&gt;
data/backups@2017-Feb-12                                  0      -   927G  -&lt;br /&gt;
data/backups@2017-Feb-19                               202K      -   927G  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get properties of your ZFS filesystems, use the {{code|zfs get PROPERTYNAME }} command:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs get compressratio&lt;br /&gt;
NAME  PROPERTY       VALUE  SOURCE&lt;br /&gt;
data  compressratio  1.02x  -&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transferring ZFS Data Sets ===&lt;br /&gt;
You can transfer a ZFS snapshot using the {{code|send}} and {{code|receive}} commands.&lt;br /&gt;
&lt;br /&gt;
Using SSH:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs send  zones/UUID@snapshot  | ssh root@10.10.11.5 zfs recv zones/UUID&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Using Netcat:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
## On the source machine&lt;br /&gt;
# zfs send data/linbuild@B | nc -w 20 phoenix 8000&lt;br /&gt;
## On the destination machine&lt;br /&gt;
# nc -w 120 -l 8000 | pv | zfs receive -F data/linbuild&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NFS Share ===&lt;br /&gt;
&lt;br /&gt;
==== FreeBSD ====&lt;br /&gt;
To share a ZFS pool via NFS on a FreeBSD system, ensure that you have the following in your {{code|/etc/rc.conf}} file.&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
mountd_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
rpcbind_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
nfs_server_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
mountd_flags=&amp;quot;-r -p 735&amp;quot;&lt;br /&gt;
zfs_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{code|mountd}} is required for exports to be loaded from {{code|/etc/exports}}. You must also either reload or restart {{code|mountd}} everytime you make a change to the exports file in order to have it reread.&lt;br /&gt;
&lt;br /&gt;
Set the {{code|sharenfs}} property using the {{code|zfs}} utility. To share it with anyone, set it to &#039;on&#039;, or to some other value. Eg:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs sharenfs=off storage&lt;br /&gt;
# zfs sharenfs=&amp;quot;-network 172.17.12.0/24&amp;quot; storage/linbuild&lt;br /&gt;
zfs get sharenfs&lt;br /&gt;
NAME                      PROPERTY  VALUE                    SOURCE&lt;br /&gt;
data                      sharenfs  off                      local&lt;br /&gt;
data/linbuild             sharenfs  -network 172.17.12.0/24  local&lt;br /&gt;
data/linbuild/centos      sharenfs  -network 172.17.12.0/24  inherited from data/linbuild&lt;br /&gt;
data/linbuild/fedora      sharenfs  -network 172.17.12.0/24  inherited from data/linbuild&lt;br /&gt;
data/linbuild/scientific  sharenfs  -network 172.17.12.0/24  inherited from data/linbuild&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Add the paths you wish to export to {{code|/etc/exports}} and reload {{code|mountd}}.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Questionable stuff here:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By setting the {{code|sharenfs}} property, your system will automatically create an export for the zfs pool using {{code|mountd}}. By default, without specifying any options, the NFS share will only be accessible locally. &lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# showmount -e&lt;br /&gt;
Exports list on localhost:&lt;br /&gt;
/data                           Everyone&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The above will create a share {{code|/storage}} that is available to all. If you want to restrict the share to a specific network, you can do something like:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zfs sharenfs=&amp;quot;-network 10.1.1.0/24&amp;quot; storage&lt;br /&gt;
# showmount -e&lt;br /&gt;
Exports list on localhost:&lt;br /&gt;
/storage                           10.1.1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
By the way, the exports are stored in {{code|/etc/zfs/exports}} and not in the usual {{code|/etc/exports}}. The ZFS and mountd service must be started for it to work. Therefore, you&#039;ll also need to append to {{code|/etc/rc.conf}} the following line:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
mountd_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== On Linux ====&lt;br /&gt;
To share ZFS pools on Linux, do the same stuff as you would on a FreeBSD system (see above). However, you may need to update the NFS export file manually by running the systemd {{code|zfs-share}} script in {{code|/usr/lib/systemd/system}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Enabling on Startup ===&lt;br /&gt;
&lt;br /&gt;
==== FreeBSD ====&lt;br /&gt;
For your ZFS pool to be mounted on startup, you will need the zfs service enabled by having the following line in {{code|/etc/rc.conf}}:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
zfs_enable=&amp;quot;YES&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Linux ====&lt;br /&gt;
===== Loading Kernel Modules on Boot =====&lt;br /&gt;
After installing ZFS on Linux, you may need to create a file in either {{code|/etc/modules-load.d}} or {{code|/etc/modprobe.d}} so that the ZFS module gets loaded.&lt;br /&gt;
&lt;br /&gt;
To only load the module, create a file at {{code|/etc/modules-load.d/zfs.conf}} containing:&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
zfs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To load the module with options, create a file at {{code|/etc/modprobe.d/zfs.conf}} containing (for example):&lt;br /&gt;
{{highlight|lang=text|code=&lt;br /&gt;
options zfs zfs_arc_max=4294967296&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===== Enabling Systemd Services =====&lt;br /&gt;
On Systemd based systems, you will need to enable the following services in order to have the zpool loaded and mounted on start up. If you have sharing enabled, you will want to also enable the {{code|zfs-share}} service too.&lt;br /&gt;
* {{code|zfs-import-cache}}&lt;br /&gt;
* {{code|zfs-mount}}&lt;br /&gt;
* {{code|zfs-share}}&lt;br /&gt;
&lt;br /&gt;
You may want to look at what these service files do by looking at them at {{code|/usr/lib/systemd/system/}}.&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t enable these services, your zpools will be loaded but not mounted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Handling Drive Failure ===&lt;br /&gt;
When a drive fails, you will see something similar to:&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool status&lt;br /&gt;
  pool: data&lt;br /&gt;
 state: DEGRADED&lt;br /&gt;
status: One or more devices could not be used because the label is missing or&lt;br /&gt;
        invalid.  Sufficient replicas exist for the pool to continue&lt;br /&gt;
        functioning in a degraded state.&lt;br /&gt;
action: Replace the device using &#039;zpool replace&#039;.&lt;br /&gt;
   see: http://zfsonlinux.org/msg/ZFS-8000-4J&lt;br /&gt;
  scan: scrub repaired 0 in 2h31m with 0 errors on Fri Jun  3 19:20:15 2016&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME        STATE     READ WRITE CKSUM&lt;br /&gt;
        data        DEGRADED     0     0     0&lt;br /&gt;
          raidz2-0  DEGRADED     0     0     0&lt;br /&gt;
            sdb     ONLINE       0     0     0&lt;br /&gt;
            sdc     ONLINE       0     0     0&lt;br /&gt;
            sdd     ONLINE       0     0     0&lt;br /&gt;
            sde     ONLINE       0     0     0&lt;br /&gt;
            sdf     ONLINE       0     0     0&lt;br /&gt;
            sdg     UNAVAIL      3   222     0  corrupted data&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The device {{code|sdg}} failed and was removed from the pool.&lt;br /&gt;
&lt;br /&gt;
{{info|Dell Server Info|Since this happened on a server, I removed the failed disk from the machine and replaced it with another one.&lt;br /&gt;
&lt;br /&gt;
Because this server uses a Dell RAID controller, and these Dell RAID controllers can&#039;t do a pass-through, each disk that is part of the ZFS array is its own Raid0 vdisk. When inserting a new drive, the vdisk information needs to be re-created via OpenManage before the disk comes online.&lt;br /&gt;
&lt;br /&gt;
Follow the steps on the  [[Dell_OpenManage#Creating_a_new_vdisk|Dell OpenManage]] after inserting the replacement drive if this applies to you.&lt;br /&gt;
&lt;br /&gt;
Once the vdisk is recreated, it should show up as the old device name again.}}&lt;br /&gt;
&lt;br /&gt;
Once the replacement disk is installed on the system, reinitialize the drive with the GPT label.&lt;br /&gt;
&lt;br /&gt;
On a FreeBSD system: I reinitialized the disks using the geometry settings described above.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# gpart create -s GPT da0&lt;br /&gt;
da4 created&lt;br /&gt;
# gpart add -b 2048 -s 3906617520 -t freebsd-zfs -l disk03 da4&lt;br /&gt;
da4p1 added&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
On a ZFS on Linux system: &lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# parted /dev/sdg&lt;br /&gt;
GNU Parted 2.1&lt;br /&gt;
Using /dev/sdg&lt;br /&gt;
Welcome to GNU Parted! Type &#039;help&#039; to view a list of commands.&lt;br /&gt;
(parted) mklabel GPT&lt;br /&gt;
Warning: The existing disk label on /dev/sdg will be destroyed and all data on this disk will be lost. Do&lt;br /&gt;
you want to continue?&lt;br /&gt;
Yes/No? y&lt;br /&gt;
(parted) quit&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To replace the offline disk, use {{code|zpool replace pool old-device new-device}}.&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# zpool replace data sdg /dev/sdg&lt;br /&gt;
# zpool status&lt;br /&gt;
  pool: data&lt;br /&gt;
 state: DEGRADED&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
        continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Mon Apr 10 16:36:35 2017&lt;br /&gt;
    35.5M scanned out of 3.03T at 3.55M/s, 249h19m to go&lt;br /&gt;
    5.45M resilvered, 0.00% done&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
        NAME             STATE     READ WRITE CKSUM&lt;br /&gt;
        data             DEGRADED     0     0     0&lt;br /&gt;
          raidz2-0       DEGRADED     0     0     0&lt;br /&gt;
            sdb          ONLINE       0     0     0&lt;br /&gt;
            sdc          ONLINE       0     0     0&lt;br /&gt;
            sdd          ONLINE       0     0     0&lt;br /&gt;
            sde          ONLINE       0     0     0&lt;br /&gt;
            sdf          ONLINE       0     0     0&lt;br /&gt;
            replacing-5  UNAVAIL      0     0     0&lt;br /&gt;
              old        UNAVAIL      3   222     0  corrupted data&lt;br /&gt;
              sdg        ONLINE       0     0     0  (resilvering)&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Tuning and Monitoring ==&lt;br /&gt;
&lt;br /&gt;
=== ZFS ARC ===&lt;br /&gt;
The ZFS Adaptive Replacement Cache (ARC) is an in-memory cached managed by ZFS to help improve speed duplicate reads.&lt;br /&gt;
&lt;br /&gt;
The ZFS ARC size from the ZFS on Linux implementation defaults to half the host&#039;s available memory and may decrease when available memory gets too low. Depending on the system setup, you may want to change the maximum amount of memory allocated to ARC.&lt;br /&gt;
&lt;br /&gt;
To change the maximum ARC size, edit the ZFS {{code|zfs_arc_max}} kernel module parameter:&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# cat /etc/modprobe.d/zfs.conf&lt;br /&gt;
options zfs zfs_arc_max=4294967296&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
You may check the current ARC usage by checking {{code|cat /proc/spl/kstat/zfs/arcstats}} or use the {{code|arcstat.py}} script that&#039;s part of the {{code|zfs}} package.&lt;br /&gt;
&lt;br /&gt;
{{highlight|lang=terminal|code=&lt;br /&gt;
# cat /proc/spl/kstat/zfs/arcstats&lt;br /&gt;
p                               4    1851836123&lt;br /&gt;
c                               4    4105979840&lt;br /&gt;
c_min                           4    33554432&lt;br /&gt;
c_max                           4    4294967296&lt;br /&gt;
size                            4    4105591928&lt;br /&gt;
hdr_size                        4    55529696&lt;br /&gt;
data_size                       4    3027917312&lt;br /&gt;
metadata_size                   4    747323904&lt;br /&gt;
other_size                      4    274821016&lt;br /&gt;
anon_size                       4    4979712&lt;br /&gt;
anon_evictable_data             4    0&lt;br /&gt;
anon_evictable_metadata         4    0&lt;br /&gt;
mru_size                        4    848103424&lt;br /&gt;
mru_evictable_data              4    605918208&lt;br /&gt;
mru_evictable_metadata          4    97727488&lt;br /&gt;
mru_ghost_size                  4    3224668160&lt;br /&gt;
mru_ghost_evictable_data        4    2267575296&lt;br /&gt;
mru_ghost_evictable_metadata    4    957092864&lt;br /&gt;
mfu_size                        4    2922158080&lt;br /&gt;
mfu_evictable_data              4    2421089280&lt;br /&gt;
mfu_evictable_metadata          4    495401984&lt;br /&gt;
mfu_ghost_size                  4    835275264&lt;br /&gt;
mfu_ghost_evictable_data        4    787349504&lt;br /&gt;
mfu_ghost_evictable_metadata    4    47925760&lt;br /&gt;
l2_hits                         4    0&lt;br /&gt;
l2_misses                       4    0&lt;br /&gt;
l2_feeds                        4    0&lt;br /&gt;
l2_rw_clash                     4    0&lt;br /&gt;
l2_read_bytes                   4    0&lt;br /&gt;
l2_write_bytes                  4    0&lt;br /&gt;
l2_writes_sent                  4    0&lt;br /&gt;
l2_writes_done                  4    0&lt;br /&gt;
l2_writes_error                 4    0&lt;br /&gt;
l2_writes_lock_retry            4    0&lt;br /&gt;
l2_evict_lock_retry             4    0&lt;br /&gt;
l2_evict_reading                4    0&lt;br /&gt;
l2_evict_l1cached               4    0&lt;br /&gt;
l2_free_on_write                4    0&lt;br /&gt;
l2_cdata_free_on_write          4    0&lt;br /&gt;
l2_abort_lowmem                 4    0&lt;br /&gt;
l2_cksum_bad                    4    0&lt;br /&gt;
l2_io_error                     4    0&lt;br /&gt;
l2_size                         4    0&lt;br /&gt;
l2_asize                        4    0&lt;br /&gt;
l2_hdr_size                     4    0&lt;br /&gt;
l2_compress_successes           4    0&lt;br /&gt;
l2_compress_zeros               4    0&lt;br /&gt;
l2_compress_failures            4    0&lt;br /&gt;
memory_throttle_count           4    0&lt;br /&gt;
duplicate_buffers               4    0&lt;br /&gt;
duplicate_buffers_size          4    0&lt;br /&gt;
duplicate_reads                 4    0&lt;br /&gt;
memory_direct_count             4    46505&lt;br /&gt;
memory_indirect_count           4    30062&lt;br /&gt;
arc_no_grow                     4    0&lt;br /&gt;
arc_tempreserve                 4    0&lt;br /&gt;
arc_loaned_bytes                4    0&lt;br /&gt;
arc_prune                       4    0&lt;br /&gt;
arc_meta_used                   4    1077674616&lt;br /&gt;
arc_meta_limit                  4    3113852928&lt;br /&gt;
arc_meta_max                    4    1077674616&lt;br /&gt;
arc_meta_min                    4    16777216&lt;br /&gt;
arc_need_free                   4    0&lt;br /&gt;
arc_sys_free                    4    129740800&lt;br /&gt;
&lt;br /&gt;
# arcstat.py 10 10&lt;br /&gt;
    time  read  miss  miss%  dmis  dm%  pmis  pm%  mmis  mm%  arcsz     c&lt;br /&gt;
17:41:09     0     0      0     0    0     0    0     0    0   3.9G  3.9G&lt;br /&gt;
17:41:19   211    68     32     6    7    62   50    68   32   3.9G  3.9G&lt;br /&gt;
17:41:29   146    32     21     6   10    25   30    32   21   3.9G  3.9G&lt;br /&gt;
17:41:39   170    50     29     6    9    44   42    50   31   3.9G  3.9G&lt;br /&gt;
17:41:49   150    33     22     6    9    27   31    33   22   3.9G  3.9G&lt;br /&gt;
17:41:59   151    43     28     4    9    38   39    43   28   3.9G  3.9G&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See Also:&lt;br /&gt;
* http://fibrevillage.com/storage/169-zfs-arc-on-linux-how-to-set-and-monitor-on-linux&lt;br /&gt;
&lt;br /&gt;
=== ZFS L2ARC ===&lt;br /&gt;
The ZFS L2ARC provides caching by extending the main memory cache with faster-than-storage-pool disks such as SSDs. Cached data that normally wouldn&#039;t fit in the ARC would be cached in the L2ARC.&lt;br /&gt;
&lt;br /&gt;
=== ZFS ZIL ===&lt;br /&gt;
The ZFS Intent Log (ZIL) is how ZFS keeps track of synchronous write operations so that they can be completed or rolled back after a crash or failure. The ZIL is not used or asynchronous writes - those are still done through system caches. &lt;br /&gt;
&lt;br /&gt;
Because ZIL is stored in the data pool, writing to a ZFS pool involves duplicate writes to the pool: Once to the ZIL and again for the actual data. This is detrimental to performance since one write operation now requires two or more writes.&lt;br /&gt;
To improve performance, the ZIL could be moved to a separate device called a Separate Intent Log (SLOG), typically a SSD. With a SLOG, a write operation will write once to the SLOG and once for the actual data.&lt;br /&gt;
&lt;br /&gt;
See Also:&lt;br /&gt;
* http://www.freenas.org/blog/zfs-zil-and-slog-demystified/&lt;br /&gt;
* https://www.ixsystems.com/blog/o-slog-not-slog-best-configure-zfs-intent-log/&lt;br /&gt;
&lt;br /&gt;
=== Alignment Shift ===&lt;br /&gt;
Make sure that your vdevs have the proper alignment shift.&lt;br /&gt;
{|&lt;br /&gt;
! Device&lt;br /&gt;
! Alignment&lt;br /&gt;
|-&lt;br /&gt;
| Hard Drives with 512B sectors&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| Flash Media / HDD with 4K sectors &lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| Flash Media / HDD with 8K sectors&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| Amazon EC2&lt;br /&gt;
| 12&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See Also:&lt;br /&gt;
* http://open-zfs.org/wiki/Performance_tuning#Alignment_shift&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* https://wiki.archlinux.org/index.php/ZFS&lt;br /&gt;
* https://www.freebsd.org/doc/handbook/zfs-zfs.html&lt;br /&gt;
* http://superuser.com/questions/608612/4k-hard-drives-freebsd-gpart-and-zfs&lt;br /&gt;
&lt;br /&gt;
[[Category:FreeBSD]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=User:Leo&amp;diff=2101</id>
		<title>User:Leo</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=User:Leo&amp;diff=2101"/>
		<updated>2017-05-18T06:22:56Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* Memory Express Warranties */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memory Express Warranties ==&lt;br /&gt;
Hard Drives:&lt;br /&gt;
# 3TB Seagate - ST4000DM000, SN: WDH01SND - Expires Jul 16, 2020&lt;br /&gt;
&lt;br /&gt;
== Resume ==&lt;br /&gt;
&lt;br /&gt;
See [[Hire Me]]&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=Leo%27s_Notes:Recipes&amp;diff=2087</id>
		<title>Leo&#039;s Notes:Recipes</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=Leo%27s_Notes:Recipes&amp;diff=2087"/>
		<updated>2017-05-08T15:35:27Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* Sides */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More recipes:&lt;br /&gt;
* http://www.reddit.com/r/AskReddit/comments/1u6kg2/what_are_some_meals_that_are_simple_to_make_but/cef4dt7&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* http://foodwishes.blogspot.ca/2012/03/st-patricks-day-special-irish-shepherds.html&lt;br /&gt;
* http://foodwishes.blogspot.ca/2013/10/tomato-bisque-soup-might-not-count-as.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Irish-Shepherds-Pie/Detail.aspx&lt;br /&gt;
* http://allrecipes.com/Recipe/How-to-Make-Tomato-Bisque/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* http://foodwishes.blogspot.ca/2014/03/black-lentil-soup-always-bet-on-black.html&lt;br /&gt;
* http://allrecipes.com/recipe/the-best-parmesan-chicken-bake/detail.aspx&lt;br /&gt;
&lt;br /&gt;
== Breakfast ==&lt;br /&gt;
&lt;br /&gt;
=== Hash Browns ===&lt;br /&gt;
* http://foodwishes.blogspot.ca/2012/03/classic-diner-hash-browns-real-king-of.html&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
Per Person:&lt;br /&gt;
* 1 medium russet potato, grated&lt;br /&gt;
* 1 1/2 tbsp clarified butter (melted butter separated from the milky liquid)&lt;br /&gt;
* salt, pepper, cayenne, and paprika to taste&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
* Skin and grate potato into cold water. Rinse with cold water twice to remove starch. Drain and dry&lt;br /&gt;
* Use clarified butter (microwave and spoon top) and dump in grated potato&lt;br /&gt;
* Season with some pepper, cayenne and paprika&lt;br /&gt;
* Stir for crusty potatoes or leave it alone for soft potatoes on the inside.&lt;br /&gt;
&lt;br /&gt;
=== French Toast ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Fluffy-French-Toast/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Makes 12 slices.&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1/4 cup all-purpose flour &lt;br /&gt;
* 1 cup milk &lt;br /&gt;
* 1 pinch salt &lt;br /&gt;
* 3 eggs &lt;br /&gt;
* 1/2 teaspoon ground cinnamon &lt;br /&gt;
* 1 teaspoon vanilla extract &lt;br /&gt;
* 1 tablespoon white sugar &lt;br /&gt;
* 12 thick slices bread &lt;br /&gt;
&lt;br /&gt;
==== Directions ==== &lt;br /&gt;
Measure flour into a large mixing bowl. Slowly whisk in the milk. Whisk in the salt, eggs, cinnamon, vanilla extract and sugar until smooth.&lt;br /&gt;
Heat a lightly oiled griddle or frying pan over medium heat.&lt;br /&gt;
Soak bread slices in mixture until saturated. Cook bread on each side until golden brown. Serve hot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pancakes ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Fluffy-Pancakes-2/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Makes 8 pancakes.&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 3/4 cup milk &lt;br /&gt;
* 2 tablespoons white vinegar &lt;br /&gt;
* 1 cup all-purpose flour &lt;br /&gt;
* 2 tablespoons white sugar &lt;br /&gt;
* 1 teaspoon baking powder &lt;br /&gt;
* 1/2 teaspoon baking soda &lt;br /&gt;
* 1/2 teaspoon salt &lt;br /&gt;
* 1 egg &lt;br /&gt;
* 2 tablespoons butter, melted &lt;br /&gt;
* cooking spray &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Combine milk with vinegar in a medium bowl and set aside for 5 minutes to &amp;quot;sour&amp;quot;.&lt;br /&gt;
# Combine flour, sugar, baking powder, baking soda, and salt in a large mixing bowl. Whisk egg and butter into &amp;quot;soured&amp;quot; milk. Pour the flour mixture into the wet ingredients and whisk until lumps are gone.&lt;br /&gt;
# Heat a large skillet over medium heat, and coat with cooking spray. Pour 1/4 cupfuls of batter onto the skillet, and cook until bubbles appear on the surface. Flip with a spatula, and cook until browned on the other side.&lt;br /&gt;
&lt;br /&gt;
== Soups ==&lt;br /&gt;
&lt;br /&gt;
=== Black Lentil Soup ===&lt;br /&gt;
* http://foodwishes.blogspot.ca/2014/03/black-lentil-soup-always-bet-on-black.html&lt;br /&gt;
* http://allrecipes.com/Recipe/Chef-Johns-Black-Lentil-Soup/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tsp vegetable oil&lt;br /&gt;
* 4 oz bacon&lt;br /&gt;
* 1 cup yellow onion, large dice&lt;br /&gt;
* 1 cup carrots, large dice&lt;br /&gt;
* 1 cup celery, large dice&lt;br /&gt;
* 1/2 tsp cumin&lt;br /&gt;
* 1/4 tsp dried thyme&lt;br /&gt;
* salt and pepper to taste&lt;br /&gt;
* cayenne to taste&lt;br /&gt;
* 1 1/4 cup black lentils&lt;br /&gt;
* 5 to 6 cups chicken broth, or as needed&lt;br /&gt;
* 1 bay leaf&lt;br /&gt;
* 1/4 cup chopped Italian parsley&lt;br /&gt;
* 1 tsp extra good extra virgin olive oil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# medium heat with veg oil. Cook bacon until done&lt;br /&gt;
# Add onion, celery, carrots, pinch of salt. Cook until tender. 10 minutes&lt;br /&gt;
# ground pepper, cumen, thyme, cayanne pepper&lt;br /&gt;
# add lentils and stir until coated&lt;br /&gt;
# Add chicken broth. Bring to a simmer on high heat.&lt;br /&gt;
# Add a bay leaf&lt;br /&gt;
# Once it simmers, bring to low.&lt;br /&gt;
# Simmer for an hour until done.&lt;br /&gt;
# Season, add parsley, stir, and serve.&lt;br /&gt;
# Garnish with parsley and extra virgin olive oil&lt;br /&gt;
&lt;br /&gt;
# Optional: Add sour cream, avacado and top with cayanne pepper.&lt;br /&gt;
&lt;br /&gt;
=== Potato Leek Soup ===&lt;br /&gt;
* http://www.foodnetwork.com/recipes/robert-irvine/potato-leek-soup-recipe.html&lt;br /&gt;
&lt;br /&gt;
Yield: 8 servings &lt;br /&gt;
Prep Time: 20 minutes &lt;br /&gt;
Cook Time: 50 minutes &lt;br /&gt;
Total Time: 1.1 hour &lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 8 cups chicken stock&lt;br /&gt;
* 6 russet potatoes, peeled and cut into large pieces&lt;br /&gt;
* 4 leeks (whites only), thoroughly washed and sliced&lt;br /&gt;
* 3 stalks celery, roughly chopped&lt;br /&gt;
* 1 bay leaf&lt;br /&gt;
* 1 1/2 teaspoons finely chopped fresh thyme&lt;br /&gt;
* Salt and freshly ground pepper&lt;br /&gt;
* 1 cup heavy cream&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Put the chicken stock, potatoes, leeks, celery, bay leaf and thyme in a large pot and sprinkle with salt and pepper. Boil until the potatoes are soft, 15 to 20 minutes.&lt;br /&gt;
&lt;br /&gt;
# Remove the bay leaf. Using an immersion blender (or in batches in a blender or food processor), blend the soup until smooth. Pour the soup into a medium pot; add the cream and simmer until the soup has thickened, about 20 minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See also: http://www.simplyrecipes.com/recipes/potato_leek_soup/&lt;br /&gt;
&lt;br /&gt;
=== Broccoli Cheese Soup ===&lt;br /&gt;
* http://www.browneyedbaker.com/2012/03/08/broccoli-cheese-soup-recipe/&lt;br /&gt;
&lt;br /&gt;
Yield: 10 servings &lt;br /&gt;
Prep Time: 15 minutes &lt;br /&gt;
Cook Time: 45 minutes &lt;br /&gt;
Total Time: 1 hour &lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1/2 cup unsalted butter&lt;br /&gt;
* 1 yellow onion, finely chopped&lt;br /&gt;
* 1/3 cup all-purpose flour&lt;br /&gt;
* 4 cups whole milk&lt;br /&gt;
* 2 cups half-and-half&lt;br /&gt;
* 4 heads broccoli, stems removed and discarded, and florets cut into bite-size pieces&lt;br /&gt;
* Pinch of nutmeg&lt;br /&gt;
* 12 ounces mild cheddar cheese, shredded (about 3 cups)&lt;br /&gt;
* Salt and pepper&lt;br /&gt;
* 2 cups vegetable broth&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# In a large pot or Dutch oven, melt butter over medium heat. Add the onions and cook for 3 to 4 minutes, until they begin to soften. Sprinkle the flour over the onions and stir to combine, cooking for about 1 minute. Slowly whisk in the milk and half-and-half.&lt;br /&gt;
# Add the nutmeg, broccoli, a dash of salt, and lots of freshly ground black pepper. Cover and reduce the heat to low. Simmer for 20 to 30 minutes, or until the broccoli is tender. Add the cheese a handful at a time, stirring to melt the cheese after each addition.&lt;br /&gt;
# At this point I did a quick pass with my immersion blender on low to blend up the broccoli a bit, but still leave a good amount of texture. You could also choose to mash it with a potato masher to break up the broccoli a bit, or transfer to a blender in two batches and puree completely. Finally, whisk in the vegetable broth, and re-warm over low heat if needed, and serve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ham and Potato Soup ===&lt;br /&gt;
* http://foodwishes.blogspot.ca/2011/10/ham-and-potato-soup-tuberlicious.html&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 1/2 lb gold potato (or any other kind will work)&lt;br /&gt;
* 1 onion&lt;br /&gt;
* 1 carrot&lt;br /&gt;
* 1 celery&lt;br /&gt;
* 8 oz diced smoked ham&lt;br /&gt;
* 3 cloves garlic&lt;br /&gt;
* 3 tbsp butter&lt;br /&gt;
* 1/4 cup flour&lt;br /&gt;
* 4 cups chicken broth&lt;br /&gt;
* 2 cups water&lt;br /&gt;
* 1/2 cup cream&lt;br /&gt;
* salt and pepper to taste&lt;br /&gt;
* cayenne&lt;br /&gt;
* chives&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Dice onion, carrot, celery, and ham. Cook in medium heat with butter in a stock pot for 5-6 minutes until vegetables are tender and onions translucent. &lt;br /&gt;
# Add in flour and cook for 3 minutes&lt;br /&gt;
# Drizzle cold chicken broth and stir to avoid lumps&lt;br /&gt;
# Add water. Raise to medium-high and simmer for 15 minutes&lt;br /&gt;
# Dice potatoes. Ensure the broth is salty enough before dumping it in.&lt;br /&gt;
# When potatoes are ready (mushable), take a potato masher and mash it a dozen times to thicken&lt;br /&gt;
# Season with cayenne, black pepper. Adjust for salt. Add a splash of cream.&lt;br /&gt;
# Stir and serve.&lt;br /&gt;
# Garnish with chives and cheddar&lt;br /&gt;
&lt;br /&gt;
=== Black Bean Vegetable Soup ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Black-Bean-Vegetable-Soup/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 6 - 8 servings&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
It turned out decent. Didn&#039;t put enough beans (I read 1 can not 2).  4/5&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 tablespoon vegetable oil &lt;br /&gt;
* 1 onion, chopped &lt;br /&gt;
* 1 clove garlic, minced &lt;br /&gt;
* 2 carrots, chopped &lt;br /&gt;
* 2 teaspoons chili powder &lt;br /&gt;
* 1 teaspoon ground cumin &lt;br /&gt;
* 4 cups vegetable stock &lt;br /&gt;
* 2 (15 ounce) cans black beans, rinsed and drained &lt;br /&gt;
* 1 (8.75 ounce) can whole kernel corn &lt;br /&gt;
* 1/4 teaspoon ground black pepper &lt;br /&gt;
* 1 (14.5 ounce) can stewed tomatoes &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# In large saucepan, heat oil over medium heat; cook onion, garlic, and carrots, stirring occasionally, for 5 minutes or until onion is softened. Add chili powder and cumin; cook, stirring, for 1 minute. Add stock, 1 can of the beans, corn, and pepper; bring to boil.&lt;br /&gt;
# Meanwhile, in food processor or blender, puree together tomatoes and remaining can of beans; add to pot. Reduce heat, cover, and simmer for 10 to 15 minutes or until carrots are tender.&lt;br /&gt;
&lt;br /&gt;
== Main Courses ==&lt;br /&gt;
&lt;br /&gt;
=== Alredo ===&lt;br /&gt;
* http://www.food.com/recipe/better-than-olive-garden-alfredo-sauce-141983&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 3 tablespoons sweet butter&lt;br /&gt;
* 2 tablespoons olive oil&lt;br /&gt;
* 2 garlic cloves, minced&lt;br /&gt;
* 2 cups heavy cream&lt;br /&gt;
* 1/4 teaspoon white pepper&lt;br /&gt;
* 1/2 cup grated parmesan cheese&lt;br /&gt;
* 3/4 cup mozzarella cheese&lt;br /&gt;
* 1 (12 ounce) box angel hair pasta&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Melt butter in medium saucepan with olive oil over medium/low heat.&lt;br /&gt;
# Add the garlic, cream, white pepper and bring mixture to a simmer.&lt;br /&gt;
# Stir often.&lt;br /&gt;
# Add the Parmesan cheese and simmer sauce for 8-10 minutes or until sauce has thickened and is smooth.&lt;br /&gt;
# When sauce has thickened add the Mozzarella cheese and stir until smooth. STIR FREQUENTLY.&lt;br /&gt;
# While the sauce cooks, boil noodles for 3-5 minutes.&lt;br /&gt;
# Place pasta on serving plates and spoon sauce over pasta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Drunken Mussels ===&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Drunken-Mussels/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tablespoons butter&lt;br /&gt;
* 4 cloves garlic, minced&lt;br /&gt;
* 1/2 teaspoon red pepper flakes, or to taste&lt;br /&gt;
* 1 lemon, zested&lt;br /&gt;
* 2 cups white wine&lt;br /&gt;
* freshly ground black pepper to taste&lt;br /&gt;
* 2 pounds mussels, cleaned and debearded&lt;br /&gt;
* 1 cup chopped fresh flat-leaf parsley&lt;br /&gt;
* 2 slices bread, grilled&lt;br /&gt;
* 2 lemon wedges for garnish&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Melt butter in a large stock pot over medium heat. Add garlic and let sizzle for about 30 seconds. Season with red pepper flakes and lemon zest, stirring for about 45 seconds.&lt;br /&gt;
# Quickly pour in wine into the pan and season with black pepper. Bring sauce to a boil, stir in mussels, and cover immediately. Shake pot and let boil for 1 minute.&lt;br /&gt;
# Stir mussels, replace cover, and let boil for 2 more minutes. The shells will begin to open. Stir in parsley, cover pot, and cook until all shells are open, 1 to 3 minutes.&lt;br /&gt;
# Serve with grilled bread and lemon wedge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fisherman&#039;s Pie ===&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Chef-Johns-Fishermans-Pie/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
For potato crust:&lt;br /&gt;
* 3 russet potatoes, peeled and cut into chunks&lt;br /&gt;
* 3 tablespoons butter&lt;br /&gt;
* 1 pinch freshly grated nutmeg&lt;br /&gt;
* salt and ground black pepper to taste&lt;br /&gt;
* 1 pinch cayenne pepper, or to taste&lt;br /&gt;
* 1/2 cup milk&lt;br /&gt;
For the spinach:&lt;br /&gt;
* 2 teaspoons olive oil&lt;br /&gt;
* 12 ounces baby spinach leaves&lt;br /&gt;
For the sauce:&lt;br /&gt;
* 3 tablespoons butter&lt;br /&gt;
* 3 tablespoons all-purpose flour&lt;br /&gt;
* 2 cloves garlic, minced&lt;br /&gt;
* 2 cups cold milk, divided&lt;br /&gt;
* 2 teaspoons lemon zest&lt;br /&gt;
For the rest:&lt;br /&gt;
* 1 tablespoon butter&lt;br /&gt;
* salt and ground black pepper to taste&lt;br /&gt;
* 1 pinch cayenne pepper, or to taste&lt;br /&gt;
* 2 pounds boneless cod fillets&lt;br /&gt;
* 1/2 lemon, juiced&lt;br /&gt;
* 1 tablespoon chopped fresh chives for garnish&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Bring a large saucepan of salted water and to a boil; add 3 russet potatoes to boiling water and cook until very tender, about 20 minutes. Drain well. Mash in 3 tablespoons butter until thoroughly combined. Season with nutmeg, salt, black pepper, and cayenne pepper to taste. Mash 1/2 cup milk into potato mixture until smooth.&lt;br /&gt;
# Drizzle olive oil in a large Dutch oven over medium-high heat, add 12 oz spinach, and season with a big pinch of salt. Cook, stirring occasionally, until spinach has wilted, about 1 minute. Transfer to a bowl lined with paper towels to wick away excess moisture.&lt;br /&gt;
# Heat 3 tablespoons butter and 3 tablespoons flour in a saucepan over medium heat; whisk mixture to a smooth paste. Cook, stirring constantly, until mixture has a nutty smell and is slightly browned, about 2 minutes. Add chopped garlic; whisk until fragrant, 10 to 20 seconds.&lt;br /&gt;
# Whisk 1 cup cold milk into flour mixture; cook until thickened. Whisk in remaining 1 cup milk and lemon zest. Bring white sauce to a gentle simmer, whisking constantly; season with salt. Turn heat to very low and keep sauce warm.&lt;br /&gt;
# Preheat oven to 375 degrees F (190 degrees C). Grease an 8x12-inch casserole dish with 1 tablespoon butter.&lt;br /&gt;
# Season buttered pan with salt, black pepper, and cayenne pepper. Lay boneless cod fillets into the pan in a single layer. Season tops of fillets with more salt, black pepper, and cayenne pepper. Spread spinach evenly over fish and drizzle with lemon juice. Spoon white sauce over spinach; give casserole dish several taps and shakes to eliminate bubbles.&lt;br /&gt;
# Drop mashed potatoes by heaping spoonfuls over the casserole and spread smoothly to cover. Place dish onto a rimmed baking sheet to catch spills.&lt;br /&gt;
# Bake in the preheated oven until bubbling, about 40 minutes. Turn on oven&#039;s broiler and broil until potato crust has a golden brown top, about 2 minutes. Fish should flake easily. Let stand 10 minutes before serving. Garnish with a sprinkle of chives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Grilled Chicken Breasts ===&lt;br /&gt;
* http://www.apinchofhealthy.com/grilled-chicken-breasts/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ingredients&lt;br /&gt;
3 Raw boneless skinless chicken breasts&lt;br /&gt;
Salt and pepper, to taste&lt;br /&gt;
Dried oregano - about 1/8 teaspoon per chicken breast&lt;br /&gt;
Dried basil - about 1/8 teaspoon per chicken breast&lt;br /&gt;
Granulated Garlic - about 1/4 teaspoon per chicken breast&lt;br /&gt;
Cooking spray or oil of your choice (high smoke point oil like avocado, coconut or even canola is best)&lt;br /&gt;
Order Ingredients Powered by Chicory&lt;br /&gt;
Instructions&lt;br /&gt;
Preheat oven to 350 degrees F.&lt;br /&gt;
Add seasonings to both sides of the raw chicken breasts.&lt;br /&gt;
Spray indoor grill pan with cooking spray, and preheat on the stovetop over medium high heat for about one minute.&lt;br /&gt;
Place the chicken breasts on the hot grill pan.&lt;br /&gt;
Cook on the first side for about 4 minutes, and turn the chicken breasts over on the other side.&lt;br /&gt;
&lt;br /&gt;
Cook on the second side for about two minutes, and then place the grill pan into the preheated oven. (Note: you can transfer to any other baking dish if you need to. For example, if your grill pan won&#039;t fit in your small oven)&lt;br /&gt;
Cook in the oven for about 20 minutes, until chicken is cooked all the way through.&lt;br /&gt;
Let the chicken rest for 5 minutes before serving.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chicken Bake ===&lt;br /&gt;
* http://allrecipes.com/recipe/the-best-parmesan-chicken-bake/detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tablespoons olive oil&lt;br /&gt;
* 2 cloves garlic, crushed and finely chopped&lt;br /&gt;
* 1/4 teaspoon crushed red pepper flakes, or to taste&lt;br /&gt;
* 6 skinless, boneless chicken breast halves&lt;br /&gt;
* 2 cups prepared marinara sauce&lt;br /&gt;
* 1/4 cup chopped fresh basil&lt;br /&gt;
* 1 (8 ounce) package shredded mozzarella cheese, divided&lt;br /&gt;
* 1/2 cup grated Parmesan cheese, divided&lt;br /&gt;
* 1 (5 ounce) package garlic croutons&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 350 degrees F (175 degrees C).&lt;br /&gt;
# Coat the bottom of a 9x13 inch casserole dish with olive oil, and sprinkle with garlic and hot red pepper flakes.&lt;br /&gt;
# Arrange the chicken breasts in bottom of the dish, and pour marinara sauce over chicken. Sprinkle basil over marinara sauce, and top with half the mozzarella cheese, followed by half the Parmesan cheese. Sprinkle on the croutons, then top with the remaining mozzarella cheese and remaining Parmesan cheese.&lt;br /&gt;
# Bake in preheated oven until cheese and croutons are golden brown and the chicken is no longer pink inside, about 35 minutes to an hour, depending on the shape and thickness of your chicken breasts. An instant-read thermometer inserted into the thickest part of a chicken breast should read at least 160 degrees F (70 degrees C).&lt;br /&gt;
&lt;br /&gt;
=== Chicken Cordon Blu-wich ===&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Chicken-Cordon-Bleu-Sandwich/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tablespoons dry bread crumbs&lt;br /&gt;
* 1 teaspoon butter, melted&lt;br /&gt;
* 2 tablespoons butter&lt;br /&gt;
* 1/2 cup diced smoked ham&lt;br /&gt;
* 1/2 cup diced onion&lt;br /&gt;
* 1/4 teaspoon dried thyme&lt;br /&gt;
* 2 tablespoons all-purpose flour&lt;br /&gt;
* 1/2 cup milk&lt;br /&gt;
* 1 tablespoon milk&lt;br /&gt;
* 1/2 cup shredded Gruyere cheese&lt;br /&gt;
* 1 1/2 teaspoons Dijon mustard&lt;br /&gt;
* salt and freshly ground black pepper to taste&lt;br /&gt;
* 1 pinch cayenne pepper, or more to taste&lt;br /&gt;
* 1 pinch ground nutmeg&lt;br /&gt;
* 1 cup diced cooked chicken breast&lt;br /&gt;
* 1/4 cup diced dill pickles&lt;br /&gt;
* 4 (1/2 inch thick) slices toasted French bread&lt;br /&gt;
* 1/4 cup shredded Gruyere cheese&lt;br /&gt;
* 1 tablespoon melted butter, divided&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 425 degrees F (220 degrees C). Line a baking sheet with heavy-duty aluminum foil.&lt;br /&gt;
# Combine bread crumbs and 1 teaspoon melted butter in a small bowl.&lt;br /&gt;
# Melt 2 tablespoons butter in a saucepan over medium heat. Cook and stir ham and onion in melted butter until onion turns translucent, about 5 minutes. Stir in thyme and cook for 1 minute. Add flour and cook, stirring constantly, until flour has lost its raw smell, about 3 minutes. Remove from heat and pour in 1/2 cup plus 1 tablespoon milk. Place saucepan back over medium heat and cook, stirring constantly, until sauce is thick, 1 to 2 minutes.&lt;br /&gt;
# Remove saucepan from heat and add 1/2 cup shredded Gruyere cheese, Dijon mustard, salt, black pepper, cayenne pepper, and nutmeg. Stir to combine.&lt;br /&gt;
# Stir chicken and diced pickle into cheese sauce.&lt;br /&gt;
# Place toasted bread slices on the prepared baking sheet. Brush one side of each bread slice with 3/4 teaspoon melted butter. Turn slices over and top each with 1/4 of the cheese sauce. Sprinkle 1 tablespoon shredded Gruyere cheese over the top of each sandwich. Top with bread crumb mixture.&lt;br /&gt;
# Bake sandwiches in the preheated oven until cheese is bubbling and chicken mixture is hot, 15 to 20 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Garlic Chicken ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Garlic-Chicken/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 4 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 teaspoons crushed garlic &lt;br /&gt;
* 1/4 cup olive oil &lt;br /&gt;
* 1/4 cup dry bread crumbs &lt;br /&gt;
* 1/4 cup grated Parmesan cheese &lt;br /&gt;
* 4 skinless, boneless chicken breast halves &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 425 degrees F (220 degrees C).&lt;br /&gt;
# Warm the garlic and olive oil to blend the flavors. In a separate dish, combine the bread crumbs and Parmesan cheese. Dip the chicken breasts in the olive oil and garlic mixture, then into the bread crumb mixture. Place in a shallow baking dish.&lt;br /&gt;
# Bake in the preheated oven for 30 to 35 minutes, until no longer pink and juices run clear.&lt;br /&gt;
&lt;br /&gt;
=== Salisbury Steak ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Salisbury-Steak/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 6 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 (10.5 ounce) can condensed French onion soup &lt;br /&gt;
* 1 1/2 pounds ground beef &lt;br /&gt;
* 1/2 cup dry bread crumbs &lt;br /&gt;
* 1 egg &lt;br /&gt;
* 1/4 teaspoon salt &lt;br /&gt;
* 1/8 teaspoon ground black pepper &lt;br /&gt;
* 1 tablespoon all-purpose flour &lt;br /&gt;
* 1/4 cup ketchup &lt;br /&gt;
* 1/4 cup water &lt;br /&gt;
* 1 tablespoon Worcestershire sauce &lt;br /&gt;
* 1/2 teaspoon mustard powder &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# In a large bowl, mix together 1/3 cup condensed French onion soup with ground beef, bread crumbs, egg, salt and black pepper. Shape into 6 oval patties.&lt;br /&gt;
# In a large skillet over medium-high heat, brown both sides of patties. Pour off excess fat.&lt;br /&gt;
# In a small bowl, blend flour and remaining soup until smooth. Mix in ketchup, water, Worcestershire sauce and mustard powder. Pour over meat in skillet. Cover, and cook for 20 minutes, stirring occasionally.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eggplant Parmesan ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Eggplant-Parmesan-II/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 8 to 10 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 3 eggplant, peeled and thinly sliced &lt;br /&gt;
* 2 eggs, beaten &lt;br /&gt;
* 4 cups Italian seasoned bread crumbs &lt;br /&gt;
* 6 cups spaghetti sauce, divided &lt;br /&gt;
* 1 (16 ounce) package mozzarella cheese, shredded and divided &lt;br /&gt;
* 1/2 cup grated Parmesan cheese, divided &lt;br /&gt;
* 1/2 teaspoon dried basil &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 350 degrees F (175 degrees C).&lt;br /&gt;
# Dip eggplant slices in egg, then in bread crumbs. Place in a single layer on a baking sheet. Bake in preheated oven for 5 minutes on each side.&lt;br /&gt;
# In a 9x13 inch baking dish spread spaghetti sauce to cover the bottom. Place a layer of eggplant slices in the sauce. Sprinkle with mozzarella and Parmesan cheeses. Repeat with remaining ingredients, ending with the cheeses. Sprinkle basil on top.&lt;br /&gt;
# Bake in preheated oven for 35 minutes, or until golden brown.&lt;br /&gt;
&lt;br /&gt;
=== Baked Ziti ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Baked-Ziti-III/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 8 servings&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
Turned out excellent. I made half the portion and baked it until the sauce at the top was brick-colored. The cheese in the middle was perfectly melted when it came out of the conventional oven. 5/5&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 (16 ounce) package dry ziti pasta &lt;br /&gt;
* 1 pound lean ground beef &lt;br /&gt;
* 1 onion, chopped &lt;br /&gt;
* 2 (28 ounce) jars spaghetti sauce &lt;br /&gt;
* 6 ounces sliced provolone cheese &lt;br /&gt;
* 6 ounces sliced mozzarella cheese &lt;br /&gt;
* 1 1/2 cups sour cream &lt;br /&gt;
* 1/2 cup grated Parmesan cheese &lt;br /&gt;
* 1/4 cup chopped fresh basil &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Bring a large pot of lightly salted water to a boil. Add pasta and cook for 8 to 10 minutes or until al dente; drain.&lt;br /&gt;
# In a large skillet, brown beef over medium heat. Add onions; saute until tender. Drain off fat and add spaghetti sauce; simmer for about 15 minutes.&lt;br /&gt;
# Preheat oven to 350 degrees F (175 degrees C).&lt;br /&gt;
# In a lightly greased 2 quart baking dish, place about half of the pasta; top with a layer of provolone and mozzarella cheese slices. Spread on a layer of half the spaghetti sauce mixture and sour cream.&lt;br /&gt;
# Cover with remaining pasta, cheese and sauce; sprinkle a layer of Parmesan cheese and fresh basil.&lt;br /&gt;
# Bake in preheated oven for about 30 minutes or until cheese and sauce are bubbly; serve.&lt;br /&gt;
&lt;br /&gt;
=== Italian Spaghetti with Meatballs ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Italian-Spaghetti-Sauce-with-Meatballs/Detail.aspx?event8=1&amp;amp;prop24=SR_Title&amp;amp;e11=spaghetti%20meatball&amp;amp;e8=Quick%20Search&amp;amp;event10=1&amp;amp;e7=Recipe%20Hub&lt;br /&gt;
Original recipe makes 6 servings&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
The meatballs didn&#039;t have as much flavour as I wanted. Tasted only like ground beef... Otherwise, the sauce was decent, though 28oz of whole tomatoes is a bit excessive for this recipe as there were more tomatoes than meatballs. &lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
===== Meatballs =====&lt;br /&gt;
* 1 pound lean ground beef &lt;br /&gt;
* 1 cup fresh bread crumbs &lt;br /&gt;
* 1 tablespoon dried parsley &lt;br /&gt;
* 1 tablespoon grated Parmesan cheese &lt;br /&gt;
* 1/4 teaspoon ground black pepper &lt;br /&gt;
* 1/8 teaspoon garlic powder &lt;br /&gt;
* 1 egg, beaten &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
===== Sauce=====&lt;br /&gt;
* 3/4 cup chopped onion &lt;br /&gt;
* 5 cloves garlic, minced &lt;br /&gt;
* 1/4 cup olive oil &lt;br /&gt;
* 2 (28 ounce) cans whole peeled tomatoes &lt;br /&gt;
* 2 teaspoons salt &lt;br /&gt;
* 1 teaspoon white sugar &lt;br /&gt;
* 1 bay leaf &lt;br /&gt;
* 1 (6 ounce) can tomato paste &lt;br /&gt;
* 3/4 teaspoon dried basil &lt;br /&gt;
* 1/2 teaspoon ground black pepper &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# In a large bowl, combine ground beef, bread crumbs, parsley, Parmesan, 1/4 teaspoon black pepper, garlic powder and beaten egg. Mix well and form into 12 balls. Store, covered, in refrigerator until needed.&lt;br /&gt;
# In a large saucepan over medium heat, saute onion and garlic in olive oil until onion is translucent. Stir in tomatoes, salt, sugar and bay leaf. Cover, reduce heat to low, and simmer 90 minutes. Stir in tomato paste, basil, 1/2 teaspoon pepper and meatballs and simmer 30 minutes more. Serve.&lt;br /&gt;
&lt;br /&gt;
=== Chili ===&lt;br /&gt;
* http://www.food.com/recipe/award-winning-chili-105865&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 lb ground venison or 1 lb ground beef or 1 lb ground turkey&lt;br /&gt;
* 2 onions, diced&lt;br /&gt;
* 1 green pepper, diced&lt;br /&gt;
* 1 tablespoon jalapeno, finely chopped&lt;br /&gt;
* 1 (14 ounce) can Mexican-style tomatoes (like Rotel)&lt;br /&gt;
* 2 (8 ounce) cans tomato sauce&lt;br /&gt;
* 2 tablespoons cumin&lt;br /&gt;
* 2 tablespoons chili powder&lt;br /&gt;
* 1 teaspoon salt&lt;br /&gt;
* 1/2 teaspoon cayenne pepper&lt;br /&gt;
* 1/2 teaspoon paprika (smoked if you can find it)&lt;br /&gt;
* 1 (14 ounce) can kidney beans, drained and rinsed&lt;br /&gt;
* 1 (14 ounce) can black beans, drained and rinsed&lt;br /&gt;
* 1 cup water&lt;br /&gt;
&lt;br /&gt;
Topping:&lt;br /&gt;
* Sour Cream&lt;br /&gt;
* Cheese&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Cook ground meat with onions and peppers in dutch oven.&lt;br /&gt;
# Drain excess grease and add tomatoes, seasonings, and water, bring to a boil.&lt;br /&gt;
# Add beans, cover and simmer 1-2 hours.&lt;br /&gt;
# Serve with toppings.&lt;br /&gt;
&lt;br /&gt;
=== Garlic Chicken ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Garlic-Chicken/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 4 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
&lt;br /&gt;
* 2 teaspoons crushed garlic &lt;br /&gt;
* 1/4 cup olive oil &lt;br /&gt;
* 1/4 cup dry bread crumbs &lt;br /&gt;
* 1/4 cup grated Parmesan cheese &lt;br /&gt;
* 4 skinless, boneless chicken breast halves &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 425 degrees F (220 degrees C).&lt;br /&gt;
# Warm the garlic and olive oil to blend the flavors. In a separate dish, combine the bread crumbs and Parmesan cheese. Dip the chicken breasts in the olive oil and garlic mixture, then into the bread crumb mixture. Place in a shallow baking dish.&lt;br /&gt;
# Bake in the preheated oven for 30 to 35 minutes, until no longer pink and juices run clear.&lt;br /&gt;
&lt;br /&gt;
== Sides ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Coconut Rice ===&lt;br /&gt;
* http://foodwishes.blogspot.ca/2017/05/savory-coconut-rice-sugar-free-and-easy.html&lt;br /&gt;
&lt;br /&gt;
Ingredients for 4 servings:&lt;br /&gt;
1 1/2 cups jasmine or long-grain rice&lt;br /&gt;
1 rounded teaspoon finely grated ginger&lt;br /&gt;
1⁄2 teaspoon red chili flakes&lt;br /&gt;
1⁄4 teaspoon turmeric&lt;br /&gt;
1 teaspoon kosher salt&lt;br /&gt;
1 cup water&lt;br /&gt;
1 (14-ounce) can coconut milk (not coconut cream)&lt;br /&gt;
1 bay leaf&lt;br /&gt;
1/4 cup toasted coconut to garnish&lt;br /&gt;
- Bring to a simmer, cover, cook on low for 18 minutes. Turn off heat, leave covered 5 more minutes, then fluff and serve.&lt;br /&gt;
&lt;br /&gt;
=== Mashed Potatoes ===&lt;br /&gt;
???&lt;br /&gt;
&lt;br /&gt;
=== Roasted Garlic Cauliflower ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Roasted-Garlic-Cauliflower/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 6 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tablespoons minced garlic &lt;br /&gt;
* 3 tablespoons olive oil &lt;br /&gt;
* 1 large head cauliflower, separated into florets &lt;br /&gt;
* 1/3 cup grated Parmesan cheese &lt;br /&gt;
* salt and black pepper to taste &lt;br /&gt;
* 1 tablespoon chopped fresh parsley &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat the oven to 450 degrees F (220 degrees C). Grease a large casserole dish.&lt;br /&gt;
# Place the olive oil and garlic in a large resealable bag. Add cauliflower, and shake to mix. Pour into the prepared casserole dish, and season with salt and pepper to taste.&lt;br /&gt;
# Bake for 25 minutes, stirring halfway through. Top with Parmesan cheese and parsley, and broil for 3 to 5 minutes, until golden brown.&lt;br /&gt;
&lt;br /&gt;
== Dessert ==&lt;br /&gt;
&lt;br /&gt;
=== Strawberry Granita ===&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Fresh-Strawberry-Granita/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
&lt;br /&gt;
* 2 pounds ripe strawberries, hulled and halved&lt;br /&gt;
* 1/3 cup white sugar, or to taste&lt;br /&gt;
* 1 cup water&lt;br /&gt;
* 1/2 teaspoon lemon juice (optional)&lt;br /&gt;
* 1/4 teaspoon balsamic vinegar (optional)&lt;br /&gt;
* 1 tiny pinch salt&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Rinse strawberries with cold water; let drain. Transfer berries to a blender and add sugar, water, lemon juice, balsamic vinegar, and salt.&lt;br /&gt;
# Pulse several times to get the mixture moving, then blend until smooth, about 1 minute. Pour into a large baking dish. Puree should only be about 3/8 inch deep in the dish.&lt;br /&gt;
# Place dish uncovered in the freezer until mixture barely begins to freeze around the edges, about 45 minutes. Mixture will still be slushy in the center.&lt;br /&gt;
# Lightly stir the crystals from the edge of the granita mixture into the center, using a fork, and mix thoroughly. Close freezer and chill until granita is nearly frozen, 30 to 40 more minutes. Mix lightly with a fork as before, scraping the crystals loose. Repeat freezing and stirring with the fork 3 to 4 times until the granita is light, crystals are separate, and granita looks dry and fluffy.&lt;br /&gt;
# Portion granita into small serving bowls to serve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Drinks ==&lt;br /&gt;
=== Sweet &amp;amp;amp; Sour Mix ===&lt;br /&gt;
From http://www.yumsugar.com/Ultimate-Bar-Sweet-Sour-Mix-166404&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 3 cups water&lt;br /&gt;
* 3 cups sugar&lt;br /&gt;
* 2 cups fresh lemon juice&lt;br /&gt;
* 2 cups fresh lime juice&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Combine water and sugar in large saucepan. Stir over medium heat until sugar dissolves. Bring to boil. Cool syrup.&lt;br /&gt;
# Mix syrup, lemon juice and lime juice in pitcher. Chill until cold. (Can be made 1 week ahead. Cover; keep chilled)&lt;br /&gt;
&lt;br /&gt;
=== Long Island Iced Tea ===&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
# 1 part vodka&lt;br /&gt;
# 1 part tequila&lt;br /&gt;
# 1 part rum&lt;br /&gt;
# 1 part gin&lt;br /&gt;
# 1 part triple sec&lt;br /&gt;
# 1 1/2 parts sweet and sour mix&lt;br /&gt;
# 1 splash Coca-Cola®&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=Leo%27s_Notes:Recipes&amp;diff=2086</id>
		<title>Leo&#039;s Notes:Recipes</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=Leo%27s_Notes:Recipes&amp;diff=2086"/>
		<updated>2017-05-08T15:29:29Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: /* Chicken Bake */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;More recipes:&lt;br /&gt;
* http://www.reddit.com/r/AskReddit/comments/1u6kg2/what_are_some_meals_that_are_simple_to_make_but/cef4dt7&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* http://foodwishes.blogspot.ca/2012/03/st-patricks-day-special-irish-shepherds.html&lt;br /&gt;
* http://foodwishes.blogspot.ca/2013/10/tomato-bisque-soup-might-not-count-as.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Irish-Shepherds-Pie/Detail.aspx&lt;br /&gt;
* http://allrecipes.com/Recipe/How-to-Make-Tomato-Bisque/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* http://foodwishes.blogspot.ca/2014/03/black-lentil-soup-always-bet-on-black.html&lt;br /&gt;
* http://allrecipes.com/recipe/the-best-parmesan-chicken-bake/detail.aspx&lt;br /&gt;
&lt;br /&gt;
== Breakfast ==&lt;br /&gt;
&lt;br /&gt;
=== Hash Browns ===&lt;br /&gt;
* http://foodwishes.blogspot.ca/2012/03/classic-diner-hash-browns-real-king-of.html&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
Per Person:&lt;br /&gt;
* 1 medium russet potato, grated&lt;br /&gt;
* 1 1/2 tbsp clarified butter (melted butter separated from the milky liquid)&lt;br /&gt;
* salt, pepper, cayenne, and paprika to taste&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
* Skin and grate potato into cold water. Rinse with cold water twice to remove starch. Drain and dry&lt;br /&gt;
* Use clarified butter (microwave and spoon top) and dump in grated potato&lt;br /&gt;
* Season with some pepper, cayenne and paprika&lt;br /&gt;
* Stir for crusty potatoes or leave it alone for soft potatoes on the inside.&lt;br /&gt;
&lt;br /&gt;
=== French Toast ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Fluffy-French-Toast/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Makes 12 slices.&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1/4 cup all-purpose flour &lt;br /&gt;
* 1 cup milk &lt;br /&gt;
* 1 pinch salt &lt;br /&gt;
* 3 eggs &lt;br /&gt;
* 1/2 teaspoon ground cinnamon &lt;br /&gt;
* 1 teaspoon vanilla extract &lt;br /&gt;
* 1 tablespoon white sugar &lt;br /&gt;
* 12 thick slices bread &lt;br /&gt;
&lt;br /&gt;
==== Directions ==== &lt;br /&gt;
Measure flour into a large mixing bowl. Slowly whisk in the milk. Whisk in the salt, eggs, cinnamon, vanilla extract and sugar until smooth.&lt;br /&gt;
Heat a lightly oiled griddle or frying pan over medium heat.&lt;br /&gt;
Soak bread slices in mixture until saturated. Cook bread on each side until golden brown. Serve hot.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Pancakes ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Fluffy-Pancakes-2/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Makes 8 pancakes.&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 3/4 cup milk &lt;br /&gt;
* 2 tablespoons white vinegar &lt;br /&gt;
* 1 cup all-purpose flour &lt;br /&gt;
* 2 tablespoons white sugar &lt;br /&gt;
* 1 teaspoon baking powder &lt;br /&gt;
* 1/2 teaspoon baking soda &lt;br /&gt;
* 1/2 teaspoon salt &lt;br /&gt;
* 1 egg &lt;br /&gt;
* 2 tablespoons butter, melted &lt;br /&gt;
* cooking spray &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Combine milk with vinegar in a medium bowl and set aside for 5 minutes to &amp;quot;sour&amp;quot;.&lt;br /&gt;
# Combine flour, sugar, baking powder, baking soda, and salt in a large mixing bowl. Whisk egg and butter into &amp;quot;soured&amp;quot; milk. Pour the flour mixture into the wet ingredients and whisk until lumps are gone.&lt;br /&gt;
# Heat a large skillet over medium heat, and coat with cooking spray. Pour 1/4 cupfuls of batter onto the skillet, and cook until bubbles appear on the surface. Flip with a spatula, and cook until browned on the other side.&lt;br /&gt;
&lt;br /&gt;
== Soups ==&lt;br /&gt;
&lt;br /&gt;
=== Black Lentil Soup ===&lt;br /&gt;
* http://foodwishes.blogspot.ca/2014/03/black-lentil-soup-always-bet-on-black.html&lt;br /&gt;
* http://allrecipes.com/Recipe/Chef-Johns-Black-Lentil-Soup/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tsp vegetable oil&lt;br /&gt;
* 4 oz bacon&lt;br /&gt;
* 1 cup yellow onion, large dice&lt;br /&gt;
* 1 cup carrots, large dice&lt;br /&gt;
* 1 cup celery, large dice&lt;br /&gt;
* 1/2 tsp cumin&lt;br /&gt;
* 1/4 tsp dried thyme&lt;br /&gt;
* salt and pepper to taste&lt;br /&gt;
* cayenne to taste&lt;br /&gt;
* 1 1/4 cup black lentils&lt;br /&gt;
* 5 to 6 cups chicken broth, or as needed&lt;br /&gt;
* 1 bay leaf&lt;br /&gt;
* 1/4 cup chopped Italian parsley&lt;br /&gt;
* 1 tsp extra good extra virgin olive oil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# medium heat with veg oil. Cook bacon until done&lt;br /&gt;
# Add onion, celery, carrots, pinch of salt. Cook until tender. 10 minutes&lt;br /&gt;
# ground pepper, cumen, thyme, cayanne pepper&lt;br /&gt;
# add lentils and stir until coated&lt;br /&gt;
# Add chicken broth. Bring to a simmer on high heat.&lt;br /&gt;
# Add a bay leaf&lt;br /&gt;
# Once it simmers, bring to low.&lt;br /&gt;
# Simmer for an hour until done.&lt;br /&gt;
# Season, add parsley, stir, and serve.&lt;br /&gt;
# Garnish with parsley and extra virgin olive oil&lt;br /&gt;
&lt;br /&gt;
# Optional: Add sour cream, avacado and top with cayanne pepper.&lt;br /&gt;
&lt;br /&gt;
=== Potato Leek Soup ===&lt;br /&gt;
* http://www.foodnetwork.com/recipes/robert-irvine/potato-leek-soup-recipe.html&lt;br /&gt;
&lt;br /&gt;
Yield: 8 servings &lt;br /&gt;
Prep Time: 20 minutes &lt;br /&gt;
Cook Time: 50 minutes &lt;br /&gt;
Total Time: 1.1 hour &lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 8 cups chicken stock&lt;br /&gt;
* 6 russet potatoes, peeled and cut into large pieces&lt;br /&gt;
* 4 leeks (whites only), thoroughly washed and sliced&lt;br /&gt;
* 3 stalks celery, roughly chopped&lt;br /&gt;
* 1 bay leaf&lt;br /&gt;
* 1 1/2 teaspoons finely chopped fresh thyme&lt;br /&gt;
* Salt and freshly ground pepper&lt;br /&gt;
* 1 cup heavy cream&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Put the chicken stock, potatoes, leeks, celery, bay leaf and thyme in a large pot and sprinkle with salt and pepper. Boil until the potatoes are soft, 15 to 20 minutes.&lt;br /&gt;
&lt;br /&gt;
# Remove the bay leaf. Using an immersion blender (or in batches in a blender or food processor), blend the soup until smooth. Pour the soup into a medium pot; add the cream and simmer until the soup has thickened, about 20 minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See also: http://www.simplyrecipes.com/recipes/potato_leek_soup/&lt;br /&gt;
&lt;br /&gt;
=== Broccoli Cheese Soup ===&lt;br /&gt;
* http://www.browneyedbaker.com/2012/03/08/broccoli-cheese-soup-recipe/&lt;br /&gt;
&lt;br /&gt;
Yield: 10 servings &lt;br /&gt;
Prep Time: 15 minutes &lt;br /&gt;
Cook Time: 45 minutes &lt;br /&gt;
Total Time: 1 hour &lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1/2 cup unsalted butter&lt;br /&gt;
* 1 yellow onion, finely chopped&lt;br /&gt;
* 1/3 cup all-purpose flour&lt;br /&gt;
* 4 cups whole milk&lt;br /&gt;
* 2 cups half-and-half&lt;br /&gt;
* 4 heads broccoli, stems removed and discarded, and florets cut into bite-size pieces&lt;br /&gt;
* Pinch of nutmeg&lt;br /&gt;
* 12 ounces mild cheddar cheese, shredded (about 3 cups)&lt;br /&gt;
* Salt and pepper&lt;br /&gt;
* 2 cups vegetable broth&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# In a large pot or Dutch oven, melt butter over medium heat. Add the onions and cook for 3 to 4 minutes, until they begin to soften. Sprinkle the flour over the onions and stir to combine, cooking for about 1 minute. Slowly whisk in the milk and half-and-half.&lt;br /&gt;
# Add the nutmeg, broccoli, a dash of salt, and lots of freshly ground black pepper. Cover and reduce the heat to low. Simmer for 20 to 30 minutes, or until the broccoli is tender. Add the cheese a handful at a time, stirring to melt the cheese after each addition.&lt;br /&gt;
# At this point I did a quick pass with my immersion blender on low to blend up the broccoli a bit, but still leave a good amount of texture. You could also choose to mash it with a potato masher to break up the broccoli a bit, or transfer to a blender in two batches and puree completely. Finally, whisk in the vegetable broth, and re-warm over low heat if needed, and serve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ham and Potato Soup ===&lt;br /&gt;
* http://foodwishes.blogspot.ca/2011/10/ham-and-potato-soup-tuberlicious.html&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 1/2 lb gold potato (or any other kind will work)&lt;br /&gt;
* 1 onion&lt;br /&gt;
* 1 carrot&lt;br /&gt;
* 1 celery&lt;br /&gt;
* 8 oz diced smoked ham&lt;br /&gt;
* 3 cloves garlic&lt;br /&gt;
* 3 tbsp butter&lt;br /&gt;
* 1/4 cup flour&lt;br /&gt;
* 4 cups chicken broth&lt;br /&gt;
* 2 cups water&lt;br /&gt;
* 1/2 cup cream&lt;br /&gt;
* salt and pepper to taste&lt;br /&gt;
* cayenne&lt;br /&gt;
* chives&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Dice onion, carrot, celery, and ham. Cook in medium heat with butter in a stock pot for 5-6 minutes until vegetables are tender and onions translucent. &lt;br /&gt;
# Add in flour and cook for 3 minutes&lt;br /&gt;
# Drizzle cold chicken broth and stir to avoid lumps&lt;br /&gt;
# Add water. Raise to medium-high and simmer for 15 minutes&lt;br /&gt;
# Dice potatoes. Ensure the broth is salty enough before dumping it in.&lt;br /&gt;
# When potatoes are ready (mushable), take a potato masher and mash it a dozen times to thicken&lt;br /&gt;
# Season with cayenne, black pepper. Adjust for salt. Add a splash of cream.&lt;br /&gt;
# Stir and serve.&lt;br /&gt;
# Garnish with chives and cheddar&lt;br /&gt;
&lt;br /&gt;
=== Black Bean Vegetable Soup ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Black-Bean-Vegetable-Soup/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 6 - 8 servings&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
It turned out decent. Didn&#039;t put enough beans (I read 1 can not 2).  4/5&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 tablespoon vegetable oil &lt;br /&gt;
* 1 onion, chopped &lt;br /&gt;
* 1 clove garlic, minced &lt;br /&gt;
* 2 carrots, chopped &lt;br /&gt;
* 2 teaspoons chili powder &lt;br /&gt;
* 1 teaspoon ground cumin &lt;br /&gt;
* 4 cups vegetable stock &lt;br /&gt;
* 2 (15 ounce) cans black beans, rinsed and drained &lt;br /&gt;
* 1 (8.75 ounce) can whole kernel corn &lt;br /&gt;
* 1/4 teaspoon ground black pepper &lt;br /&gt;
* 1 (14.5 ounce) can stewed tomatoes &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# In large saucepan, heat oil over medium heat; cook onion, garlic, and carrots, stirring occasionally, for 5 minutes or until onion is softened. Add chili powder and cumin; cook, stirring, for 1 minute. Add stock, 1 can of the beans, corn, and pepper; bring to boil.&lt;br /&gt;
# Meanwhile, in food processor or blender, puree together tomatoes and remaining can of beans; add to pot. Reduce heat, cover, and simmer for 10 to 15 minutes or until carrots are tender.&lt;br /&gt;
&lt;br /&gt;
== Main Courses ==&lt;br /&gt;
&lt;br /&gt;
=== Alredo ===&lt;br /&gt;
* http://www.food.com/recipe/better-than-olive-garden-alfredo-sauce-141983&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 3 tablespoons sweet butter&lt;br /&gt;
* 2 tablespoons olive oil&lt;br /&gt;
* 2 garlic cloves, minced&lt;br /&gt;
* 2 cups heavy cream&lt;br /&gt;
* 1/4 teaspoon white pepper&lt;br /&gt;
* 1/2 cup grated parmesan cheese&lt;br /&gt;
* 3/4 cup mozzarella cheese&lt;br /&gt;
* 1 (12 ounce) box angel hair pasta&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Melt butter in medium saucepan with olive oil over medium/low heat.&lt;br /&gt;
# Add the garlic, cream, white pepper and bring mixture to a simmer.&lt;br /&gt;
# Stir often.&lt;br /&gt;
# Add the Parmesan cheese and simmer sauce for 8-10 minutes or until sauce has thickened and is smooth.&lt;br /&gt;
# When sauce has thickened add the Mozzarella cheese and stir until smooth. STIR FREQUENTLY.&lt;br /&gt;
# While the sauce cooks, boil noodles for 3-5 minutes.&lt;br /&gt;
# Place pasta on serving plates and spoon sauce over pasta.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Drunken Mussels ===&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Drunken-Mussels/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tablespoons butter&lt;br /&gt;
* 4 cloves garlic, minced&lt;br /&gt;
* 1/2 teaspoon red pepper flakes, or to taste&lt;br /&gt;
* 1 lemon, zested&lt;br /&gt;
* 2 cups white wine&lt;br /&gt;
* freshly ground black pepper to taste&lt;br /&gt;
* 2 pounds mussels, cleaned and debearded&lt;br /&gt;
* 1 cup chopped fresh flat-leaf parsley&lt;br /&gt;
* 2 slices bread, grilled&lt;br /&gt;
* 2 lemon wedges for garnish&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Melt butter in a large stock pot over medium heat. Add garlic and let sizzle for about 30 seconds. Season with red pepper flakes and lemon zest, stirring for about 45 seconds.&lt;br /&gt;
# Quickly pour in wine into the pan and season with black pepper. Bring sauce to a boil, stir in mussels, and cover immediately. Shake pot and let boil for 1 minute.&lt;br /&gt;
# Stir mussels, replace cover, and let boil for 2 more minutes. The shells will begin to open. Stir in parsley, cover pot, and cook until all shells are open, 1 to 3 minutes.&lt;br /&gt;
# Serve with grilled bread and lemon wedge.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fisherman&#039;s Pie ===&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Chef-Johns-Fishermans-Pie/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
For potato crust:&lt;br /&gt;
* 3 russet potatoes, peeled and cut into chunks&lt;br /&gt;
* 3 tablespoons butter&lt;br /&gt;
* 1 pinch freshly grated nutmeg&lt;br /&gt;
* salt and ground black pepper to taste&lt;br /&gt;
* 1 pinch cayenne pepper, or to taste&lt;br /&gt;
* 1/2 cup milk&lt;br /&gt;
For the spinach:&lt;br /&gt;
* 2 teaspoons olive oil&lt;br /&gt;
* 12 ounces baby spinach leaves&lt;br /&gt;
For the sauce:&lt;br /&gt;
* 3 tablespoons butter&lt;br /&gt;
* 3 tablespoons all-purpose flour&lt;br /&gt;
* 2 cloves garlic, minced&lt;br /&gt;
* 2 cups cold milk, divided&lt;br /&gt;
* 2 teaspoons lemon zest&lt;br /&gt;
For the rest:&lt;br /&gt;
* 1 tablespoon butter&lt;br /&gt;
* salt and ground black pepper to taste&lt;br /&gt;
* 1 pinch cayenne pepper, or to taste&lt;br /&gt;
* 2 pounds boneless cod fillets&lt;br /&gt;
* 1/2 lemon, juiced&lt;br /&gt;
* 1 tablespoon chopped fresh chives for garnish&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Bring a large saucepan of salted water and to a boil; add 3 russet potatoes to boiling water and cook until very tender, about 20 minutes. Drain well. Mash in 3 tablespoons butter until thoroughly combined. Season with nutmeg, salt, black pepper, and cayenne pepper to taste. Mash 1/2 cup milk into potato mixture until smooth.&lt;br /&gt;
# Drizzle olive oil in a large Dutch oven over medium-high heat, add 12 oz spinach, and season with a big pinch of salt. Cook, stirring occasionally, until spinach has wilted, about 1 minute. Transfer to a bowl lined with paper towels to wick away excess moisture.&lt;br /&gt;
# Heat 3 tablespoons butter and 3 tablespoons flour in a saucepan over medium heat; whisk mixture to a smooth paste. Cook, stirring constantly, until mixture has a nutty smell and is slightly browned, about 2 minutes. Add chopped garlic; whisk until fragrant, 10 to 20 seconds.&lt;br /&gt;
# Whisk 1 cup cold milk into flour mixture; cook until thickened. Whisk in remaining 1 cup milk and lemon zest. Bring white sauce to a gentle simmer, whisking constantly; season with salt. Turn heat to very low and keep sauce warm.&lt;br /&gt;
# Preheat oven to 375 degrees F (190 degrees C). Grease an 8x12-inch casserole dish with 1 tablespoon butter.&lt;br /&gt;
# Season buttered pan with salt, black pepper, and cayenne pepper. Lay boneless cod fillets into the pan in a single layer. Season tops of fillets with more salt, black pepper, and cayenne pepper. Spread spinach evenly over fish and drizzle with lemon juice. Spoon white sauce over spinach; give casserole dish several taps and shakes to eliminate bubbles.&lt;br /&gt;
# Drop mashed potatoes by heaping spoonfuls over the casserole and spread smoothly to cover. Place dish onto a rimmed baking sheet to catch spills.&lt;br /&gt;
# Bake in the preheated oven until bubbling, about 40 minutes. Turn on oven&#039;s broiler and broil until potato crust has a golden brown top, about 2 minutes. Fish should flake easily. Let stand 10 minutes before serving. Garnish with a sprinkle of chives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Grilled Chicken Breasts ===&lt;br /&gt;
* http://www.apinchofhealthy.com/grilled-chicken-breasts/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ingredients&lt;br /&gt;
3 Raw boneless skinless chicken breasts&lt;br /&gt;
Salt and pepper, to taste&lt;br /&gt;
Dried oregano - about 1/8 teaspoon per chicken breast&lt;br /&gt;
Dried basil - about 1/8 teaspoon per chicken breast&lt;br /&gt;
Granulated Garlic - about 1/4 teaspoon per chicken breast&lt;br /&gt;
Cooking spray or oil of your choice (high smoke point oil like avocado, coconut or even canola is best)&lt;br /&gt;
Order Ingredients Powered by Chicory&lt;br /&gt;
Instructions&lt;br /&gt;
Preheat oven to 350 degrees F.&lt;br /&gt;
Add seasonings to both sides of the raw chicken breasts.&lt;br /&gt;
Spray indoor grill pan with cooking spray, and preheat on the stovetop over medium high heat for about one minute.&lt;br /&gt;
Place the chicken breasts on the hot grill pan.&lt;br /&gt;
Cook on the first side for about 4 minutes, and turn the chicken breasts over on the other side.&lt;br /&gt;
&lt;br /&gt;
Cook on the second side for about two minutes, and then place the grill pan into the preheated oven. (Note: you can transfer to any other baking dish if you need to. For example, if your grill pan won&#039;t fit in your small oven)&lt;br /&gt;
Cook in the oven for about 20 minutes, until chicken is cooked all the way through.&lt;br /&gt;
Let the chicken rest for 5 minutes before serving.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Chicken Bake ===&lt;br /&gt;
* http://allrecipes.com/recipe/the-best-parmesan-chicken-bake/detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tablespoons olive oil&lt;br /&gt;
* 2 cloves garlic, crushed and finely chopped&lt;br /&gt;
* 1/4 teaspoon crushed red pepper flakes, or to taste&lt;br /&gt;
* 6 skinless, boneless chicken breast halves&lt;br /&gt;
* 2 cups prepared marinara sauce&lt;br /&gt;
* 1/4 cup chopped fresh basil&lt;br /&gt;
* 1 (8 ounce) package shredded mozzarella cheese, divided&lt;br /&gt;
* 1/2 cup grated Parmesan cheese, divided&lt;br /&gt;
* 1 (5 ounce) package garlic croutons&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 350 degrees F (175 degrees C).&lt;br /&gt;
# Coat the bottom of a 9x13 inch casserole dish with olive oil, and sprinkle with garlic and hot red pepper flakes.&lt;br /&gt;
# Arrange the chicken breasts in bottom of the dish, and pour marinara sauce over chicken. Sprinkle basil over marinara sauce, and top with half the mozzarella cheese, followed by half the Parmesan cheese. Sprinkle on the croutons, then top with the remaining mozzarella cheese and remaining Parmesan cheese.&lt;br /&gt;
# Bake in preheated oven until cheese and croutons are golden brown and the chicken is no longer pink inside, about 35 minutes to an hour, depending on the shape and thickness of your chicken breasts. An instant-read thermometer inserted into the thickest part of a chicken breast should read at least 160 degrees F (70 degrees C).&lt;br /&gt;
&lt;br /&gt;
=== Chicken Cordon Blu-wich ===&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Chicken-Cordon-Bleu-Sandwich/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tablespoons dry bread crumbs&lt;br /&gt;
* 1 teaspoon butter, melted&lt;br /&gt;
* 2 tablespoons butter&lt;br /&gt;
* 1/2 cup diced smoked ham&lt;br /&gt;
* 1/2 cup diced onion&lt;br /&gt;
* 1/4 teaspoon dried thyme&lt;br /&gt;
* 2 tablespoons all-purpose flour&lt;br /&gt;
* 1/2 cup milk&lt;br /&gt;
* 1 tablespoon milk&lt;br /&gt;
* 1/2 cup shredded Gruyere cheese&lt;br /&gt;
* 1 1/2 teaspoons Dijon mustard&lt;br /&gt;
* salt and freshly ground black pepper to taste&lt;br /&gt;
* 1 pinch cayenne pepper, or more to taste&lt;br /&gt;
* 1 pinch ground nutmeg&lt;br /&gt;
* 1 cup diced cooked chicken breast&lt;br /&gt;
* 1/4 cup diced dill pickles&lt;br /&gt;
* 4 (1/2 inch thick) slices toasted French bread&lt;br /&gt;
* 1/4 cup shredded Gruyere cheese&lt;br /&gt;
* 1 tablespoon melted butter, divided&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 425 degrees F (220 degrees C). Line a baking sheet with heavy-duty aluminum foil.&lt;br /&gt;
# Combine bread crumbs and 1 teaspoon melted butter in a small bowl.&lt;br /&gt;
# Melt 2 tablespoons butter in a saucepan over medium heat. Cook and stir ham and onion in melted butter until onion turns translucent, about 5 minutes. Stir in thyme and cook for 1 minute. Add flour and cook, stirring constantly, until flour has lost its raw smell, about 3 minutes. Remove from heat and pour in 1/2 cup plus 1 tablespoon milk. Place saucepan back over medium heat and cook, stirring constantly, until sauce is thick, 1 to 2 minutes.&lt;br /&gt;
# Remove saucepan from heat and add 1/2 cup shredded Gruyere cheese, Dijon mustard, salt, black pepper, cayenne pepper, and nutmeg. Stir to combine.&lt;br /&gt;
# Stir chicken and diced pickle into cheese sauce.&lt;br /&gt;
# Place toasted bread slices on the prepared baking sheet. Brush one side of each bread slice with 3/4 teaspoon melted butter. Turn slices over and top each with 1/4 of the cheese sauce. Sprinkle 1 tablespoon shredded Gruyere cheese over the top of each sandwich. Top with bread crumb mixture.&lt;br /&gt;
# Bake sandwiches in the preheated oven until cheese is bubbling and chicken mixture is hot, 15 to 20 minutes.&lt;br /&gt;
&lt;br /&gt;
=== Garlic Chicken ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Garlic-Chicken/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 4 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 teaspoons crushed garlic &lt;br /&gt;
* 1/4 cup olive oil &lt;br /&gt;
* 1/4 cup dry bread crumbs &lt;br /&gt;
* 1/4 cup grated Parmesan cheese &lt;br /&gt;
* 4 skinless, boneless chicken breast halves &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 425 degrees F (220 degrees C).&lt;br /&gt;
# Warm the garlic and olive oil to blend the flavors. In a separate dish, combine the bread crumbs and Parmesan cheese. Dip the chicken breasts in the olive oil and garlic mixture, then into the bread crumb mixture. Place in a shallow baking dish.&lt;br /&gt;
# Bake in the preheated oven for 30 to 35 minutes, until no longer pink and juices run clear.&lt;br /&gt;
&lt;br /&gt;
=== Salisbury Steak ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Salisbury-Steak/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 6 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 (10.5 ounce) can condensed French onion soup &lt;br /&gt;
* 1 1/2 pounds ground beef &lt;br /&gt;
* 1/2 cup dry bread crumbs &lt;br /&gt;
* 1 egg &lt;br /&gt;
* 1/4 teaspoon salt &lt;br /&gt;
* 1/8 teaspoon ground black pepper &lt;br /&gt;
* 1 tablespoon all-purpose flour &lt;br /&gt;
* 1/4 cup ketchup &lt;br /&gt;
* 1/4 cup water &lt;br /&gt;
* 1 tablespoon Worcestershire sauce &lt;br /&gt;
* 1/2 teaspoon mustard powder &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# In a large bowl, mix together 1/3 cup condensed French onion soup with ground beef, bread crumbs, egg, salt and black pepper. Shape into 6 oval patties.&lt;br /&gt;
# In a large skillet over medium-high heat, brown both sides of patties. Pour off excess fat.&lt;br /&gt;
# In a small bowl, blend flour and remaining soup until smooth. Mix in ketchup, water, Worcestershire sauce and mustard powder. Pour over meat in skillet. Cover, and cook for 20 minutes, stirring occasionally.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eggplant Parmesan ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Eggplant-Parmesan-II/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 8 to 10 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 3 eggplant, peeled and thinly sliced &lt;br /&gt;
* 2 eggs, beaten &lt;br /&gt;
* 4 cups Italian seasoned bread crumbs &lt;br /&gt;
* 6 cups spaghetti sauce, divided &lt;br /&gt;
* 1 (16 ounce) package mozzarella cheese, shredded and divided &lt;br /&gt;
* 1/2 cup grated Parmesan cheese, divided &lt;br /&gt;
* 1/2 teaspoon dried basil &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 350 degrees F (175 degrees C).&lt;br /&gt;
# Dip eggplant slices in egg, then in bread crumbs. Place in a single layer on a baking sheet. Bake in preheated oven for 5 minutes on each side.&lt;br /&gt;
# In a 9x13 inch baking dish spread spaghetti sauce to cover the bottom. Place a layer of eggplant slices in the sauce. Sprinkle with mozzarella and Parmesan cheeses. Repeat with remaining ingredients, ending with the cheeses. Sprinkle basil on top.&lt;br /&gt;
# Bake in preheated oven for 35 minutes, or until golden brown.&lt;br /&gt;
&lt;br /&gt;
=== Baked Ziti ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Baked-Ziti-III/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 8 servings&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
Turned out excellent. I made half the portion and baked it until the sauce at the top was brick-colored. The cheese in the middle was perfectly melted when it came out of the conventional oven. 5/5&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 (16 ounce) package dry ziti pasta &lt;br /&gt;
* 1 pound lean ground beef &lt;br /&gt;
* 1 onion, chopped &lt;br /&gt;
* 2 (28 ounce) jars spaghetti sauce &lt;br /&gt;
* 6 ounces sliced provolone cheese &lt;br /&gt;
* 6 ounces sliced mozzarella cheese &lt;br /&gt;
* 1 1/2 cups sour cream &lt;br /&gt;
* 1/2 cup grated Parmesan cheese &lt;br /&gt;
* 1/4 cup chopped fresh basil &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Bring a large pot of lightly salted water to a boil. Add pasta and cook for 8 to 10 minutes or until al dente; drain.&lt;br /&gt;
# In a large skillet, brown beef over medium heat. Add onions; saute until tender. Drain off fat and add spaghetti sauce; simmer for about 15 minutes.&lt;br /&gt;
# Preheat oven to 350 degrees F (175 degrees C).&lt;br /&gt;
# In a lightly greased 2 quart baking dish, place about half of the pasta; top with a layer of provolone and mozzarella cheese slices. Spread on a layer of half the spaghetti sauce mixture and sour cream.&lt;br /&gt;
# Cover with remaining pasta, cheese and sauce; sprinkle a layer of Parmesan cheese and fresh basil.&lt;br /&gt;
# Bake in preheated oven for about 30 minutes or until cheese and sauce are bubbly; serve.&lt;br /&gt;
&lt;br /&gt;
=== Italian Spaghetti with Meatballs ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Italian-Spaghetti-Sauce-with-Meatballs/Detail.aspx?event8=1&amp;amp;prop24=SR_Title&amp;amp;e11=spaghetti%20meatball&amp;amp;e8=Quick%20Search&amp;amp;event10=1&amp;amp;e7=Recipe%20Hub&lt;br /&gt;
Original recipe makes 6 servings&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
The meatballs didn&#039;t have as much flavour as I wanted. Tasted only like ground beef... Otherwise, the sauce was decent, though 28oz of whole tomatoes is a bit excessive for this recipe as there were more tomatoes than meatballs. &lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
===== Meatballs =====&lt;br /&gt;
* 1 pound lean ground beef &lt;br /&gt;
* 1 cup fresh bread crumbs &lt;br /&gt;
* 1 tablespoon dried parsley &lt;br /&gt;
* 1 tablespoon grated Parmesan cheese &lt;br /&gt;
* 1/4 teaspoon ground black pepper &lt;br /&gt;
* 1/8 teaspoon garlic powder &lt;br /&gt;
* 1 egg, beaten &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
===== Sauce=====&lt;br /&gt;
* 3/4 cup chopped onion &lt;br /&gt;
* 5 cloves garlic, minced &lt;br /&gt;
* 1/4 cup olive oil &lt;br /&gt;
* 2 (28 ounce) cans whole peeled tomatoes &lt;br /&gt;
* 2 teaspoons salt &lt;br /&gt;
* 1 teaspoon white sugar &lt;br /&gt;
* 1 bay leaf &lt;br /&gt;
* 1 (6 ounce) can tomato paste &lt;br /&gt;
* 3/4 teaspoon dried basil &lt;br /&gt;
* 1/2 teaspoon ground black pepper &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# In a large bowl, combine ground beef, bread crumbs, parsley, Parmesan, 1/4 teaspoon black pepper, garlic powder and beaten egg. Mix well and form into 12 balls. Store, covered, in refrigerator until needed.&lt;br /&gt;
# In a large saucepan over medium heat, saute onion and garlic in olive oil until onion is translucent. Stir in tomatoes, salt, sugar and bay leaf. Cover, reduce heat to low, and simmer 90 minutes. Stir in tomato paste, basil, 1/2 teaspoon pepper and meatballs and simmer 30 minutes more. Serve.&lt;br /&gt;
&lt;br /&gt;
=== Chili ===&lt;br /&gt;
* http://www.food.com/recipe/award-winning-chili-105865&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 1 lb ground venison or 1 lb ground beef or 1 lb ground turkey&lt;br /&gt;
* 2 onions, diced&lt;br /&gt;
* 1 green pepper, diced&lt;br /&gt;
* 1 tablespoon jalapeno, finely chopped&lt;br /&gt;
* 1 (14 ounce) can Mexican-style tomatoes (like Rotel)&lt;br /&gt;
* 2 (8 ounce) cans tomato sauce&lt;br /&gt;
* 2 tablespoons cumin&lt;br /&gt;
* 2 tablespoons chili powder&lt;br /&gt;
* 1 teaspoon salt&lt;br /&gt;
* 1/2 teaspoon cayenne pepper&lt;br /&gt;
* 1/2 teaspoon paprika (smoked if you can find it)&lt;br /&gt;
* 1 (14 ounce) can kidney beans, drained and rinsed&lt;br /&gt;
* 1 (14 ounce) can black beans, drained and rinsed&lt;br /&gt;
* 1 cup water&lt;br /&gt;
&lt;br /&gt;
Topping:&lt;br /&gt;
* Sour Cream&lt;br /&gt;
* Cheese&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Cook ground meat with onions and peppers in dutch oven.&lt;br /&gt;
# Drain excess grease and add tomatoes, seasonings, and water, bring to a boil.&lt;br /&gt;
# Add beans, cover and simmer 1-2 hours.&lt;br /&gt;
# Serve with toppings.&lt;br /&gt;
&lt;br /&gt;
=== Garlic Chicken ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Garlic-Chicken/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 4 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
&lt;br /&gt;
* 2 teaspoons crushed garlic &lt;br /&gt;
* 1/4 cup olive oil &lt;br /&gt;
* 1/4 cup dry bread crumbs &lt;br /&gt;
* 1/4 cup grated Parmesan cheese &lt;br /&gt;
* 4 skinless, boneless chicken breast halves &lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat oven to 425 degrees F (220 degrees C).&lt;br /&gt;
# Warm the garlic and olive oil to blend the flavors. In a separate dish, combine the bread crumbs and Parmesan cheese. Dip the chicken breasts in the olive oil and garlic mixture, then into the bread crumb mixture. Place in a shallow baking dish.&lt;br /&gt;
# Bake in the preheated oven for 30 to 35 minutes, until no longer pink and juices run clear.&lt;br /&gt;
&lt;br /&gt;
== Sides ==&lt;br /&gt;
&lt;br /&gt;
=== Mashed Potatoes ===&lt;br /&gt;
???&lt;br /&gt;
&lt;br /&gt;
=== Roasted Garlic Cauliflower ===&lt;br /&gt;
* http://allrecipes.com/Recipe/Roasted-Garlic-Cauliflower/Detail.aspx?evt19=1&lt;br /&gt;
&lt;br /&gt;
Original recipe makes 6 servings&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 2 tablespoons minced garlic &lt;br /&gt;
* 3 tablespoons olive oil &lt;br /&gt;
* 1 large head cauliflower, separated into florets &lt;br /&gt;
* 1/3 cup grated Parmesan cheese &lt;br /&gt;
* salt and black pepper to taste &lt;br /&gt;
* 1 tablespoon chopped fresh parsley &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Preheat the oven to 450 degrees F (220 degrees C). Grease a large casserole dish.&lt;br /&gt;
# Place the olive oil and garlic in a large resealable bag. Add cauliflower, and shake to mix. Pour into the prepared casserole dish, and season with salt and pepper to taste.&lt;br /&gt;
# Bake for 25 minutes, stirring halfway through. Top with Parmesan cheese and parsley, and broil for 3 to 5 minutes, until golden brown.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dessert ==&lt;br /&gt;
&lt;br /&gt;
=== Strawberry Granita ===&lt;br /&gt;
&lt;br /&gt;
* http://allrecipes.com/Recipe/Fresh-Strawberry-Granita/Detail.aspx&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
&lt;br /&gt;
* 2 pounds ripe strawberries, hulled and halved&lt;br /&gt;
* 1/3 cup white sugar, or to taste&lt;br /&gt;
* 1 cup water&lt;br /&gt;
* 1/2 teaspoon lemon juice (optional)&lt;br /&gt;
* 1/4 teaspoon balsamic vinegar (optional)&lt;br /&gt;
* 1 tiny pinch salt&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Rinse strawberries with cold water; let drain. Transfer berries to a blender and add sugar, water, lemon juice, balsamic vinegar, and salt.&lt;br /&gt;
# Pulse several times to get the mixture moving, then blend until smooth, about 1 minute. Pour into a large baking dish. Puree should only be about 3/8 inch deep in the dish.&lt;br /&gt;
# Place dish uncovered in the freezer until mixture barely begins to freeze around the edges, about 45 minutes. Mixture will still be slushy in the center.&lt;br /&gt;
# Lightly stir the crystals from the edge of the granita mixture into the center, using a fork, and mix thoroughly. Close freezer and chill until granita is nearly frozen, 30 to 40 more minutes. Mix lightly with a fork as before, scraping the crystals loose. Repeat freezing and stirring with the fork 3 to 4 times until the granita is light, crystals are separate, and granita looks dry and fluffy.&lt;br /&gt;
# Portion granita into small serving bowls to serve.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Drinks ==&lt;br /&gt;
=== Sweet &amp;amp;amp; Sour Mix ===&lt;br /&gt;
From http://www.yumsugar.com/Ultimate-Bar-Sweet-Sour-Mix-166404&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
* 3 cups water&lt;br /&gt;
* 3 cups sugar&lt;br /&gt;
* 2 cups fresh lemon juice&lt;br /&gt;
* 2 cups fresh lime juice&lt;br /&gt;
&lt;br /&gt;
==== Directions ====&lt;br /&gt;
# Combine water and sugar in large saucepan. Stir over medium heat until sugar dissolves. Bring to boil. Cool syrup.&lt;br /&gt;
# Mix syrup, lemon juice and lime juice in pitcher. Chill until cold. (Can be made 1 week ahead. Cover; keep chilled)&lt;br /&gt;
&lt;br /&gt;
=== Long Island Iced Tea ===&lt;br /&gt;
&lt;br /&gt;
==== Ingredients ====&lt;br /&gt;
# 1 part vodka&lt;br /&gt;
# 1 part tequila&lt;br /&gt;
# 1 part rum&lt;br /&gt;
# 1 part gin&lt;br /&gt;
# 1 part triple sec&lt;br /&gt;
# 1 1/2 parts sweet and sour mix&lt;br /&gt;
# 1 splash Coca-Cola®&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
	<entry>
		<id>https://leo.leung.xyz/wiki/index.php?title=AMT&amp;diff=2085</id>
		<title>AMT</title>
		<link rel="alternate" type="text/html" href="https://leo.leung.xyz/wiki/index.php?title=AMT&amp;diff=2085"/>
		<updated>2017-05-07T20:50:08Z</updated>

		<summary type="html">&lt;p&gt;184.64.117.27: Created page with &amp;quot; == Vulnerability == A vulnerability allows an attacker to access the AMT web interface with no credentials required due to an issue with how the HTTP digest authentication is...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Vulnerability ==&lt;br /&gt;
A vulnerability allows an attacker to access the AMT web interface with no credentials required due to an issue with how the HTTP digest authentication is compared.&lt;br /&gt;
&lt;br /&gt;
AMT versions that ends with a version number less than 3000 are vulnerable.&lt;br /&gt;
&lt;br /&gt;
Some Dell systems have already been patched (ie. Optiplex 9010). Refer to http://en.community.dell.com/techcenter/extras/m/white_papers/20443914 for more info.&lt;br /&gt;
&lt;br /&gt;
=== See Also ===&lt;br /&gt;
* https://newsroom.intel.com/news/important-security-information-intel-manageability-firmware/&lt;br /&gt;
* https://arstechnica.com/security/2017/05/the-hijacking-flaw-that-lurked-in-intel-chips-is-worse-than-anyone-thought/?comments=1&amp;amp;post=33283099&lt;/div&gt;</summary>
		<author><name>184.64.117.27</name></author>
	</entry>
</feed>