02 Jun 2020

feedPlanet Ubuntu

Ubuntu Blog: MicroK8s now native on Windows and macOS

An intro to MicroK8s

Windows and macOS developers can now use MicroK8s natively! Use kubectl at the Windows or Mac command line to interact with MicroK8s locally just as you would on Linux. Clean integration into the desktop means better workflows to dev, build and test your containerised apps.

MicroK8s is a conformant upstream Kubernetes, packaged for simplicity and resilience. It provides sensible defaults and bundles the most commonly used components for at-your-fingertips access. A single-node install is one command and done in seconds, which makes it easy to add or remove from any system.

MicroK8s is widely used by developers for local testing. After installing it, you can start and stop Kubernetes with a single command to conserve battery. With built-in GPGPU acceleration, Istio, Prometheus, Jaeger and many other popular services on tap, it serves as a complete workstation edition of K8s. All of this capability is now neatly accessible from the Windows and macOS command-line.

MicroK8s is also popular for CI/CD pipelines which create a fresh VM or cluster for each test run on demand. The simplicity of MicroK8s makes automation straightforward, and the speed of install reduces total test run times and resource consumption.

Windows

The new installer for Windows is a standalone executable file, available from microk8s.io.

Behind the scenes, MicroK8s on Windows uses Multipass with Hyper-V or VirtualBox to drive a dedicated Linux VM that hosts your Kubernetes. MicroK8s on Windows does the work of starting, stopping and managing that VM and the Kubernetes itself.

macOS

Install MicroK8s on macOS with the Homebrew package manager:

brew install ubuntu/microk8s/microk8s.

Here too, Multipass runs in the background to bring up a VM to host MicroK8s, transparently to the end user.

Linux

On Linux, nothing has changed:

snap install microk8s --classic

To get an overview of MicroK8s state while it is coming up:

sudo microk8s status --wait-ready

Notice anything different? Yes, all MicroK8s commands now support a non-dotted format. So 'microk8s status' and 'microk8s.status' are the same. This change is effective on Linux, Windows and macOS. The new version also supports the old dotted format for backwards compatibility.

MicroK8s 1.18 comes with other significant features too, such as Kubeflow 1.0 for AI/ML research and development. Kubeflow manages data science pipelines on Kubernetes, with Tensorflow and other processing elements.

Appliance, gadget makers and manufacturers increasingly want to use Kubernetes on their IoT or edge service. MicroK8s 1.18 introduced a snap interface that enables seamless interaction with other snap packages on the same host, giving them a local Kubernetes to drive. The Canonical support announcement for Kubernetes 1.18 and the Kubernetes community blog have further details. Also, if you are into SBC hacking and tinkering, here is a great tutorial to build a RaspberryPi K8s cluster.

Learn more about MicroK8s at microk8s.io.

02 Jun 2020 12:00pm GMT

Didier Roche: ZFS focus on Ubuntu 20.04 LTS: ZSys commands for state management

ZFS focus on Ubuntu 20.04 LTS: ZSys commands for state management

In the previous article, we presented the core state concept of ZSys. This one will focus more on how you can manage states, when we are taking them automatically or manually and way more general considerations. A lot to cover, so let's go!

zsysctl commands related to states

Most of commands related to states are grouped under the zsysctl machine and zsysctl state subcommands.

The first one is zsysctl show (alias of zsysctl machine show). It will detail any system and user states for the targeted machine ID, blank being the current machine. zsysctl machine list will display any available machine ID you can use.

$ zsysctl show
Name:           rpool/ROOT/ubuntu_qiq15o
ZSys:           true
Last Used:      current
History:        
  - Name:       rpool/ROOT/ubuntu_qiq15o@autozsys_iynia9
    Created on: 2020-04-30 14:21:47
  - Name:       rpool/ROOT/ubuntu_qiq15o@mySavedState
    Created on: 2020-04-30 13:22:04
  - Name:       rpool/ROOT/ubuntu_idjvq9
    Created on: 2020-04-29 15:19:41
  - Name:       rpool/ROOT/ubuntu_idjvq9@autozsys_cwfpcd
    Created on: 2020-04-29 11:30:39
  - Name:       rpool/ROOT/ubuntu_qiq15o@autozsys_fgw65h
    Created on: 2020-04-29 10:15:48
  - Name:       rpool/ROOT/ubuntu_qiq15o@autozsys_wjdzc4
    Created on: 2020-04-29 10:10:26
  - Name:       rpool/ROOT/ubuntu_zums7p
    Created on: 2020-04-29 09:41:28
Users:
  - Name:    didrocks
    History: 
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_iynia9 (2020-04-30 14:21:48)
     - rpool/USERDATA/didrocks_e2jj0s@mySavedState (2020-04-30 13:22:04)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_nc0t07 (2020-04-30 14:20:53)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_wul29z (2020-04-30 13:20:01)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_7urchl (2020-04-30 12:20:01)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_okd3jd (2020-04-30 11:20:01)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_nvy9n8 (2020-04-30 10:20:01)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_ltvyzi (2020-04-30 09:20:05)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_nr4qgi (2020-04-29 18:21:03)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_tznx3z (2020-04-29 17:21:05)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_ha8ydo (2020-04-29 16:21:08)
     - rpool/USERDATA/didrocks_e2jj0s-rpool.ROOT.ubuntu-idjvq9 (2020-04-29 15:21:01)
     - rpool/USERDATA/didrocks_fsmk5b@autozsys_f94bcr (2020-04-29 15:18:20)
     - rpool/USERDATA/didrocks_fsmk5b@autozsys_k1lrce (2020-04-29 15:15:01)
     - rpool/USERDATA/didrocks_fsmk5b@autozsys_voi74a (2020-04-29 14:15:01)
     - rpool/USERDATA/didrocks_fsmk5b@autozsys_xx5xxz (2020-04-29 13:15:01)
     - rpool/USERDATA/didrocks_fsmk5b@autozsys_lww7fh (2020-04-29 12:15:01)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_cwfpcd (2020-04-29 11:30:39)
     - rpool/USERDATA/didrocks_fsmk5b@autozsys_w2929w (2020-04-29 11:15:06)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_fgw65h (2020-04-29 10:15:48)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_wjdzc4 (2020-04-29 10:10:26)
     - rpool/USERDATA/didrocks_e2jj0s@autozsys_2y0bud (2020-04-29 09:41:56)
     - rpool/USERDATA/didrocks_fsmk5b (2020-04-29 09:41:28)
  - Name:    root
    History: 
     - rpool/USERDATA/root_e2jj0s@autozsys_iynia9 (2020-04-30 14:21:48)
     - rpool/USERDATA/root_e2jj0s@mySavedState (2020-04-30 13:22:04)
     - rpool/USERDATA/root_e2jj0s-rpool.ROOT.ubuntu-idjvq9 (2020-04-29 15:21:01)
     - rpool/USERDATA/root_e2jj0s@autozsys_cwfpcd (2020-04-29 11:30:39)
     - rpool/USERDATA/root_e2jj0s@autozsys_fgw65h (2020-04-29 10:15:48)
     - rpool/USERDATA/root_e2jj0s@autozsys_wjdzc4 (2020-04-29 10:10:26)
     - rpool/USERDATA/root_fsmk5b (2020-04-29 09:41:28)

For those interested, we are going to see all this more in details in the advanced final posts, but what can we already see here?

Saving states manually

Any user can save its user state at any time via the zsysctl save command which is an alias for zsysctl state save:

$ zsysctl save mySavedState
Successfully saved as "mySavedState"
$ zsysctl show
[…]
Users:
  - Name:    didrocks
    History: 
     - rpool/USERDATA/didrocks_e2jj0s@mySavedState (2020-04-30 13:22:04)

This won't ask for any additional permissions and will save current user's state.

System states can be saved by any administrator or anyone allowed by our polkit scheme to write system state. With our default policy, non administrators but sudoers will be presented a polkit authorization window: Polkit request for performing system write operation

$ zsysctl save --system MySystemSave
INFO Updating GRUB menu                           
Successfully saved as "MySystemSave"
$ zsysctl show
Name:           rpool/ROOT/ubuntu_qiq15o
ZSys:           true
Last Used:      current
History:        
  - Name:       rpool/ROOT/ubuntu_qiq15o@MySystemSave
    Created on: 2020-04-30 14:04:31
  […]
Users:
  - Name:    didrocks
    History: 
     - rpool/USERDATA/didrocks_e2jj0s@MySystemSave (2020-04-30 14:04:32)
     […]
  - Name:    root
    History: 
     - rpool/USERDATA/root_e2jj0s@MySystemSave (2020-04-30 14:04:32)
     […]

Note that you don't necessarily need to set a name even when you save a state manually. In case you don't specify one, we will generate one for you with the @autozsys_ prefix, which will qualify it for garbage collection.

You will have some manual state saves as you request them, but most of those that are see are going to be generated automatically.

When do we automatically save states?

This naturally triggers this question. How can we try to meaningfully decide when we should save state?

System states

Each time you install, remove or upgrade your packages, a state save is automatically taken by the system. This is done by apt transactions. Note that we have some specificities in ubuntu with background updates (via unattended-upgrades) which splits up upgrades in multiple apt transactions. We were able to group that in only one system saving. We split it up in two parts (saving state and rebuilding bootloader menu) as you can see when running the apt command manually:

$ apt install foo
[…]
INFO Requesting to save current system state      
Successfully saved as "autozsys_iynia9"
[installing/remove/upgrading package(s)]
INFO Updating GRUB menu

You can see the output of the automated state saving name. This creates a system state save, which compounds as well user state with the same name. Note that the bootloader menu is also refreshed.

User states

Users have thus some states save created when a system state save is requested. However, we are saving regularly more states as this is where most of your important data are.

A systemd timer unit is responsible of taking hourly state save for any connected users:

$ systemctl --user list-timers
NEXT                         LEFT       LAST                         PASSED    UNIT                      ACTIVATES                  
Thu 2020-04-30 15:44:33 CEST 45min left Thu 2020-04-30 14:44:33 CEST 14min ago zsys-user-savestate.timer zsys-user-savestate.service

1 timers listed.

We can see there next time the user state save will be taken and which systemd unit is responsible for this.

Removing state

We will see in the next blog post the garbage collection policy to remove any automated snapshots (those starting with @autozsys_), but you may want, for disk usage matters or needs to immediately remove some state, there is of course a command for that!

We have zsysctl state save STATE_NAME to create a new state and unsurprisingly, we have… zsysctl state remove STATE_NAME to delete one! However, removing a state can be a little bit more complex as they can have dependencies.

User State without any dependency

Removing a user state (simple snapshot without any dependency) is easy:

$ zsysctl state remove nc0t07

-> This is a simple case which removed for the current user the state rpool/USERDATA/ubuntu_e2jj0s@autozsys_nc0t07 and all its associated ZFS datasets.

Similarly, we can remove any manual user state with its name:

$ zsysctl state remove MyUserSave

Removing other user's state (with --user othername) will trigger a polkit prompt for access permission on other user state write.

Note that we have many ways to name a state that is removable. You can use:

If multiple states are matching a short form, you will be informed:

$ zsysctl state remove MyUserSave
ERROR couldn't remove user state MyUserSave: Couldn't find state: multiple states are matching MyUserSave:
  - rpool/USERDATA/didrocks_e2jj0s@MyUserSave (2020-04-30 09:20:05)
  - rpool/USERDATA/didrocks_a3bbe3@MyUserSave (2020-04-30 05:20:05)
  Please use full state path.

In that case, only the full qualifying name can be used.

System State without any dependency

We can remove a manual snapshot for the whole system adding --system to the call. This triggers an access permission polkit request for writing system state. Note that the bootloader menu is also refreshed.

$ zsysctl state remove --system mySavedState
INFO Updating GRUB menu

Any associated user state associated to "mySavedState" are also removed.

User State without any dependency but linked to a system state

A confirmation will be requested upon any suppression request if the user state is linked to a system state:

$ zsysctl state remove rpool/USERDATA/didrocks_e2jj0s@autozsys_iynia9
rpool/USERDATA/didrocks_e2jj0s@autozsys_iynia9 will be detached from system state rpool/ROOT/ubuntu_qiq15o@autozsys_iynia9

Would you like to proceed [y/N]? y

Warning: this system state may now be unbootable or unrevertable. In any case, you will not have this user data available anymore for this saved state after its deletion. It's better to completely suppress the system state directly.

Same is available on filesystem dataset user states associated to a system state:

$ zsysctl state remove --user=root rpool/USERDATA/root_fsmk5b
rpool/USERDATA/root_fsmk5b will be detached from system state rpool/ROOT/ubuntu_zums7p

Would you like to proceed [y/N]? y

Same prompt but different effect when user states are associated to multiple system states:

$ zsysctl state remove rpool/USERDATA/didrocks_e2jj0s-rpool.ROOT.ubuntu-idjvq9
rpool/USERDATA/didrocks_e2jj0s will be detached from system state rpool/ROOT/ubuntu_idjvq9

Would you like to proceed [y/N]? y

In this last cases, the data themselves won't be deleted. Indeed, the user state was associated to multiple system states (case of reverting the system without reverting user data. More on that later on.). As there is still at least one system state associated to it, the data are still needed. If the user state is now associated to only one system state, it will be renamed to the simpler rpool/USERDATA/didrocks_e2jj0 naming scheme for its full qualifying name.

We will detail more information in a future blog post on the dataset layout and links between user and system datasets.

User or system states with state dependencies

If a state has some state dependencies, confirmation and list of all the states that are going to be deleted are listed:

$ zsysctl state remove rpool/USERDATA/didrocks_fsmk5b
rpool/USERDATA/didrocks_fsmk5b has a dependency linked to some states:
  - rpool/USERDATA/didrocks_fsmk5b@autozsys_a45fdz (2020-04-30 16:53:51)

Would you like to proceed [y/N]? y

Deleting the main snapshots will delete any dependencies.

This can be even more complex if this is an association of states that have dependencies, and some of the dependencies are linked to system states:

$ zsysctl state remove rpool/USERDATA/didrocks_e2jj0s@autozsys_cwfpcd
rpool/USERDATA/didrocks_e2jj0s@autozsys_cwfpcd will be detached from system state rpool/ROOT/ubuntu_idjvq9@autozsys_cwfpcd
rpool/USERDATA/didrocks_e2jj0s@autozsys_cwfpcd has a dependency linked to some states:
  - rpool/USERDATA/didrocks_fsmk5b (2020-04-29 09:41:28) to remove. Currently linked to rpool/ROOT/ubuntu_zums7p
  - rpool/USERDATA/didrocks_fsmk5b@autozsys_f94bcr (2020-04-29 15:18:20)
  - rpool/USERDATA/didrocks_fsmk5b@autozsys_k1lrce (2020-04-29 15:15:01)
  - rpool/USERDATA/didrocks_fsmk5b@autozsys_lww7fh (2020-04-29 12:15:01)
  - rpool/USERDATA/didrocks_fsmk5b@autozsys_w2929w (2020-04-29 11:15:06)
  - rpool/USERDATA/didrocks_fsmk5b@autozsys_xx5xxz (2020-04-29 13:15:01)
  - rpool/USERDATA/didrocks_fsmk5b@autozsys_voi74a (2020-04-29 14:15:01)

Would you like to proceed [y/N]? y

Note that the same goes for system states. If a system states deletes some user states as well, all user states dependencies will be listed for any attached users! The list can be long, but we try to always list everything in an understandable and clear articulation for our users.

User or system states with manual ZFS clone dependencies

If the user has done a manual zfs clone via the zfs commands on any datasets composing any states (remember that a state is a set of datasets) this will be detailed to the user before confirming the deletion:

$ zsysctl state remove rpool/USERDATA/didrocks_fsmk5b@autozsys_a45fdz
rpool/USERDATA/didrocks_fsmk5b@autozsys_a45fdz has a dependency on some datasets:
  - rpool/manualclone

Would you like to proceed [y/N]? y

And finally, this goes as well when removing a state where one of the state dependencies has a dataset with some dependencies:

$ zsysctl state remove rpool/USERDATA/didrocks_fsmk5b
rpool/USERDATA/didrocks_fsmk5b will be detached from system state rpool/didrocks/ubuntu_zums7p
rpool/USERDATA/didrocks_fsmk5b has a dependency linked to some states:
  - rpool/USERDATA/didrocks_fsmk5b@autozsys_a45fdz (2020-04-30 16:53:51)
rpool/USERDATA/didrocks_fsmk5b has a dependency on some datasets:
  - rpool/manualclone

Would you like to proceed [y/N]? y

This will delete rpool/manualclone in addition to the depending and targeted states.

Final note on states

Any confirmation (if you are sure about what you are doing) can be bypassed by the force - -f - flag.

As you can see, there are lot of cases and complex handling of states for removal! We spent hours and hours to streamline and ensure that removing manually a state is done properly, taking into account dependencies and simplifying as much as possible the user experience. All this is backed up with a very extensive test suite.

We are creating a huge number of state saves automatically for you. but we don't want our users having to remove them manually. This is why we had to draft a garbage collection strategy so that your disk doesn't end up being full quickly. This is an interesting topic which will be, coincidentally, the next one! See you there :)

Meanwhile, join the discussion via the dedicated Ubuntu discourse thread.

02 Jun 2020 7:52am GMT

01 Jun 2020

feedPlanet Ubuntu

The Fridge: Ubuntu Weekly Newsletter Issue 633

Welcome to the Ubuntu Weekly Newsletter, Issue 633 for the week of May 24 - 30, 2020. The full version of this issue is available here.

In this issue we cover:

The Ubuntu Weekly Newsletter is brought to you by:

If you have a story idea for the Weekly Newsletter, join the Ubuntu News Team mailing list and submit it. Ideas can also be added to the wiki!

Except where otherwise noted, this issue of the Ubuntu Weekly Newsletter is licensed under a Creative Commons Attribution ShareAlike 3.0 License

01 Jun 2020 10:48pm GMT

06 Nov 2011

feedWhere is Ploum?

What happened during GSoC 2011?

I know I'm very late, but I really wanted to talk about this year Google Summer of Code.

For the third year in a row, I was a mentor. And this year I have a huge deception to share. I'm really sad. This week, I'v received the GSoC 2011 t-shirt. They sent me the wrong size. XXXL. I can use it as a sleeping bag with my girlfriend. I'm really disappointed.

GSOC 2011

Hopefully, GSoC is not only about receiving a t-shirt. It is also about mentoring a student.

Nearly two years ago, I started working on a complete refactoring of GTG. The code was a mess, with a lot of duplicate everywhere, with two bugs appearing while you were trying to solve one, etc.

I abstracted the structure we were using in several places and started to write a library to handle those "Acyclical Directed Graphs". As usual, it appeared that development was taking longer than expected. Weeks turned into months. Then, when it started to look good, I discovered that I forgot one critical point: thread-awareness. I felt hopeless.

Because I didn't had the motivation to do that heavy work, I proposed it as a Summer of Code project to a very motivated student: Izidor Matušov[1].

Words doesn't do any justice to the excellent work that Izidor did this summer. He's simply awesome. Some students are goods because they have previous experience. Izidor kicks asses. He learns so quickly, he's so assertive. The work was even harder than what we anticipated. But he managed to achieve everything, including feeding me with cookies at the Desktop Summit, where we met and had an awesome hacking week.

Lionel (Ploum) & Izidor at Desktop Summit

As much as I'm deceipted about the t-shirt, I'm delighted about the work achieved this summer. Izidor now knows GTG nearly as much as I do. He's taking initiatives, like organizing an online GTG hackfest on November 26th[2] and he's a bug-answering machine.

Dear Google, GNOME foundation and Lanedo[3], I would like to thank you. Thanks to your support:

  1. I received a worthless piece of clothes that travelled half of the world in order to clean my cat's dirtiness.
  2. GTG 0.2.9 should be released before the end of the year
  3. GTG gained a new co-maintainer
  4. I gained a new friend. And it probably worth everything else.

Congratulations, co-maintainer Izidor. And welcome to the community!

Notes

[1] Yes, I'm able to write his name correctly, thanks to my wonderful keyboard layout

[2] #GTG, on Gimpnet, during the whole day

[3] Lanedo paid for the travel, the accommodations and, as you can see on the picture, the clothes during the Desktop Summit

06 Nov 2011 6:23pm GMT

05 Nov 2011

feedWhere is Ploum?

The aristocratic desktop (part 4) : Kill The Double Click

Part 1 : Introduction
Part 2 : Home is Desktop
Part 3 : There's no tray icon in GNOME !
Part 4 : Kill The Double Click

When I started installing the best desktop possible for Marie and Jean, we were still in the GNOME 2.X era. GNOME 3 solved my previous concerns. No in the way I envisioned it, but solved them anyway. No more desktop icons, no more tray icons.

But now that I'm introducing Marie and Jean to GNOME 3, I still have some concerns. And one of that main concern is the infamous double-click!

Mouse click

Do you remember? Jean is a very brilliant mind, even though he never used a computer during his whole life. As a reasoning scientist, he was trying to find the logic behind my teaching.

During one of our first lesson, "Using the mouse", the conversation went like this:
- How do I know if I have to click or double click?
- Well, you double-click on icon and simple click on links and buttons.
- How do I know what is a button or an icon?
- …

Since that time, I've tried many times to find a logic behind single or double clicking. There is not. You have to learn it by experience. And it is totally, utterly pointless.

I also realized that a single click was something really hard for Jean. Achieving to click on a given point without moving the mouse is really hard for older people. Then, ask them to click twice, with a completely arbitrary speed, without moving the mouse, not to quickly, not to slowly. Impossible.

Marie, on her side, was double-clicking everywhere. And, surprisingly, it works most of the time.

So, why do we have double-click in some places? Because we want to be able to select an item without "activating" it. How often does it happen? Never for Jean. Very rarely for Marie.

To summarize, we are making the most frequent action very hard to nearly impossible in order to allow a very rare action?

I tried to disable completely the double-clicking in Nautilus.

Do you know what?

It works. Even for me. I had chronic pain in my hand and disabling double-click was a relief. I explained to Marie to never double-click anymore. She's still double-clicking from time to time but everything works even better than before. Jean was eventually able to launch a file from within Nautilus.

Selectiong multiple files Selection of one or multiple file with single mouse click

What about selection of files? I explained to Marie to draw a square with the mouse. And, yes, she found that absolutely intuitive. The only drawback I found so far was the inconsistency with lists, where double-clicking is still required. Marie called me one day because she tried to play a specific song in Rhythmbox. It wasn't working. I realize that she had to double-click on the song. "But you told me to never double click anymore!". Sorry Marie.

I'm myself incredibly frustrated by any system that requires double-click. Why do we still have double-click by default in GNOME3?


Part 1 : Introduction
Part 2 : Home is Desktop
Part 3 : There's no tray icon in GNOME !
Part 4 : Kill The Double Click


Picture by Dave Dugdale

05 Nov 2011 12:17pm GMT

28 Oct 2011

feedWhere is Ploum?

J'irai pisser sur votre moquette

Si vous deviez me décrire en deux mots, nul doute que fourbe et profiteur vous viendraient spontanément à la bouche. Paresseux, parasite et inutile suivraient de près. Et j'en suis fier. J'en ai même fait mon mode de vie.

Ma technique est simple mais éprouvée. Je croise un inconnu dans la rue à l'air affable. Tenez, prenez ce jeune homme à l'allure dynamique. Il s'appelle Jean, c'est ma prochaine victime. Il ne se doute encore de rien mais j'irai dormir dans le lit de sa femme tout en vidant son frigo.

Au premier abord, je fais le numéro du sympa-sociable, les circonstances m'ont conduit dans la rue, où j'ère sans but précis, mais je ne me plains pas, je ne quémande rien, au contraire, je refuse tout geste de pitié trop ostentatoire. J'ai ma fierté.

Lorsque Jean se propose de m'emmener manger à la maison, juste pour la soirée, je fais d'abord mine de ne pas être intéressé. Mais mes yeux acquiescent et Jean, en rigolant, insiste, me forçant presqu'à le suivre. Inutile de vous dire que c'est ce que j'attendais mais la victime doit croire qu'elle a l'initiative, c'est primordial.

Martine, la femme de Jean, n'est que moyennement contente de cet imprévu. Qu'à cela ne tienne, je fais mon charmeur, je séduis tout en ayant l'air de ne pas vouloir déranger. Je fais également un peu le pitre pour la dérider.

Et ça marche. Avant la fin de la soirée, elle discutera avec moi plus qu'avec Jean lui-même, ce dernier étant parfaitement inconscient du destin de proie que je lui réserve. De manière indirecte, je fais comprendre que je n'ai nul part où aller. Jean et Martine n'ont pas le cœur de me renvoyer seul dans le froid de la nuit. Ils se proposent donc de m'héberger, juste pour une nuit. Tandis que je m'installe confortablement sur le sofa, j'entends Martine descendre l'escalier. Elle est en déshabillé, prête à aller au lit.

- « Bonne nuit ! » me lance-t-elle avec un sourire innocent avant de remonter dare-dare dans sa chambre.

Je ricane. Je n'ai même pas eu besoin de répondre. Une seule soirée me suffit. Homme ou femme, nul ne me résiste. Je suis comme ça moi.

Bien entendu, le « seulement pour une nuit » se prolongera. Je commencerai doucement à faire comprendre mes goûts précis, envoyant Jean au supermarché afin de m'acheter ce que je souhaite. Lorsqu'elle rentre du travail, Martine a à peine un regard pour Jean. Elle se rue à l'intérieur pour voir comment je vais. Pendant ce temps-là, je me prélasse sur le canapé, je me balade un peu. Avec mon air faussement négligent, j'ai pris soin de casser quelques bibelots auxquels ils tenaient beaucoup, par pure cruauté.

Lorsque Jean partit quelques jours dans sa famille à l'étranger, je n'hésitai pas: je me glissai une nuit dans le lit de Martine, sans même lui demander, sans même m'annoncer. Elle prit un air faussement surpris mais je sais qu'elle n'attendait que cela. Elles sont toutes les mêmes. Jean nous a surpris en rentrant plus tôt. Cela ne lui a pas plu. Il m'a dit qu'il m'avait sorti de la rue, qu'il n'acceptait pas cela.

Par méchanceté, j'ai répondu en déféquant sur la moquette du salon. Il a pu tout nettoyer. Il n'était vraiment pas content mais Martine a fini par le convaincre de me garder et d'exercer le moindre de mes désirs.

Il faut dire qu'ils sont vraiment bien mes deux esclaves. Je dors dans leur lit, ils me nourrissent, nettoient sans que je n'aie besoin de faire attention à rien. Quoi que je fasse, ils me regardent avec un air attendri et me trouvent adorable. Même au milieu de la nuit, il suffit que je me mette à miauler pour qu'ils s'enquièrent immédiatement de mes besoins.

Des esclaves aussi dociles, c'est rare. Je vais les garder encore quelques temps.

28 Oct 2011 4:59pm GMT