dpkg –get-selections > installed_packages.list
That’s it.
dpkg –get-selections > installed_packages.list
That’s it.
Mots-clefs : debian
Publié dans LinuxAppz | Aucun commentaire »
Installer le package gtk-theme-switch(2)
Mots-clefs : debian, gtk
Publié dans LinuxConf | Aucun commentaire »
Utiliser le fichier /etc/rc.local
par exemple pour configurer une carte wifi sur wlan1 en rate 54M:
ajouter les lignes:
sudo ifconfig wlan1 down
sudo iwconfig wlan1 rate 54M
sudo ifconfig wlan1 up
Mots-clefs : debian
Publié dans LinuxConf | Aucun commentaire »
Le driver USB 2.0 semble avoir un problème dans la version du kernel que j’utilise (debian Etch et Debian 64Studio).
Message: USB 2-2: reset hight speed usb device using ehci_hcd and address 2
http://bugzilla.kernel.org/show_bug.cgi?id=11159
Pour contourner, unloader le module ehci_hcd pour se trouver en USB 1.1 (oui, c’est long et pas la panacé, mais rien trouvé d’autre pour l’instant…).
# rmmod ehci_hcd
Puis lancer un fsck, disque démonté:
# fsck.ext3 -C 0 -p -f -v /dev/sda1
-C 0: affiche la barre de progression dans la console.
-p: répare automatiquement les erreurs de disque qui peuvent l’être.
-f: force le test, même si le journal indique ‘clean’.
-v: verbose mode.
TODO: comprendre la différence entre les options -p et -c
Mots-clefs : debian, e2fsck
Publié dans LinuxAppz | Aucun commentaire »
Installer Debian en Read-Only sur serveur fanless Via
—————————————————–
Suivre précisément les instructions ici:
http://wiki.flimzy.com/index.php/Install_Debian_on_USB
Configuration particulière à la machine:
Alsa:
—–
# apt-get install alsa
# vim etc/modprobe.d/sound
Fichier contient
alias snd-card-0 snd-via82xx
options snd-via82xx index=0
Apt:
—-
# vim /etc/apt/sources.list
Ajouter
deb http://ftp.debian.org/debian etch main contrib non-free
deb http://security.debian.org/ etch/updates main
Sensors:
——–
# apt-get sensors
# vim /etc/sensors.conf
Rechercher la puce via686a
décommentez et adapter les lignes de temp max:
set temp1_hyst 45
set temp1_over 50
set temp2_hyst 55
set temp2_over 60
set temp3_hyst 60
set temp3_over 65
# vim /etc/modules
ajouter
eeprom
via686a
CPU powersave
————-
# vim /etc/modules
ajouter
longhaul
cpufreq_powersave
https://stargate.solsys.org/mod.php?mod=faq&op=extlist&topicid=12&expand=yes
sdparm & smartmontools
———————-
apt-get
MPD
—
# apt-get install mpd ncmpc
# vim /etc/mpd.conf
# mkdir /home/mike/.mpd
# chmod 775 /home/mike/.mpd
#
Modifier les paramètres
music_directory “/mnt/data/mp3″
playlist_directory “/mnt/data/playlists”
db_file “/mnt/data/.mpd/tag_cache”
log_file “/var/log/mpd/mpd.log”
error_file “/var/log/mpd/errors.log”
pid_file “/var/run/mpd/pid”
Penser ensuite de créer les directory mp3/, playlist/ et .mpd/ dans /mnt/data (une fois monté)
NFS
—
avant d’installer, sortir du chroot, faut monter les processus dans /mnt/chroot/proc
http://www.lea-linux.org/cached/index/Trucs:Installation_d’un_syst%C3%A8me_Linux_en_chroot_complet.html
sortir du chroot
# exit
# mount -t proc none /mnt/chroot/proc
# chroot /mnt/chroot /bin/bash
# apt-get install nfs-user-server
# vim /etc/exports
creer un group nfsgroup
# groupadd nfsgroup
# adduser mike nfsgroup
# adduser root nfsgroup
# mkdir /mnt/data
# chown mike:nfsgroup /mnt/data
# chmod g+w /mnt/data
connaître les id
# id mike
dans mon cas, uid=1000 et le groupe nfsuser=1001
SSH:
—-
dans /etc/ssh/sshd_config, modifier
Port 10022
et décommenter la ligne MaxStartups 10:30:60
X & Fluxbox:
————
# apt-get install fluxbox xserver-xorg
# dpkg-reconfigure xserver-xorg
Prendre carte vga (tenté trident, ca a l’air de passer)
Résolution: j’ai mis petit pour tester (800×600)
faire un .xsession
NTPDATE:
——–
apt-get install ntpdate
UDEV & AUTOFS
————–
apt-get install autofs
permet de reconnaitre le dd externe (num serie) et de lui attribuer un lien fixe usb_data
Hors du Chroot:
udevinfo -a -p /sys/block/sde | more
Chopper le {serial}
DEF107679C83 (pour le DD Samsung)
créer un fichier .rules:
#vim /etc/udev/rules.d/00_titanium.early.rules
ajouter
#DD externe
SUBSYSTEMS==”usb”, ATTRS{serial}==”DEF107679C83″, KERNEL==”sd*”, SYMLINK+=”usb_data”
# todo: ajouter l’apn, les clés USB etc..
# vim /etc/fstab
ajouter la ligne
# disque dur externe de donnees
/dev/usb_data /mnt/data ext3 rw,user,sync 0 0
VLC:
—-
Parait pas un bon plan: saccade
Mplayer:
——–
# apt-get install mplayer
BITTORRENT:
———–
# apt-get install bittorent
HDPARM:
——-
# apt-get install hdparm
SUDO:
—–
# visudo
et modifier le fichier de la sorte:
Defaults env_reset
# Host alias specification
# User alias specification
# Cmnd alias specification
Cmnd_Alias HALT=/sbin/halt
Cmnd_Alias REBOOT=/sbin/reboot
# User privilege specification
root ALL=(ALL) ALL
mike ALL=NOPASSWD:HALT,NOPASSWD:REBOOT
Vieille méthode
———————————-
activer le powersaving:
———————-
modprobe longhaul
ajouter
longhaul
cpufreq_powersave
dans /etc/modules
https://stargate.solsys.org/mod.php?mod=faq&op=extlist&topicid=12&expand=yes
The Lex 860A EPIA 5000 board uses the 533MHz C3 CPU. By loading the longhaul module - you can throttle the CPU. Note that it became stable with kernel 2.6.11.11 only on my system.
So - all you need to do is enable the longhaul by loading the longhaul module:
modprobe longhaul
Check using the dmesg command to see if it loaded correctly.
If this works - make sure the longhaul module gets loaded at every boot. For this - just add “longhaul” and “cpufreq_powersave” into the /etc/modules file.
Using the longhaul stuff - make sure you use under a 2.6.12.4 kernel-module (as configured in config-2.6.12.4) with the userspace-governor eabled by default - then change to:
# cd /sys/devices/system/cpu/cpu0/cpufreq
cpufreq # ls
affected_cpus
scaling_available_frequencies
scaling_governor
cpuinfo_cur_freq
scaling_available_governors
scaling_max_freq
cpuinfo_max_freq
scaling_cur_freq
scaling_min_freq
cpuinfo_min_freq
scaling_driver
scaling_setspeed
cpufreq # modprobe cpufreq_powersave
cpufreq # cat scaling_available_governors
powersave userspace
echo powersave > scaling_governor
cpufreq # cat scaling_cur_freq
399000
Mots-clefs : debian, fanless, readOnly
Publié dans LinuxEmbeded | Aucun commentaire »
Formatter une cle USB en reinstallant la MBR standard
—————————————————–
No, fdisk /mbr writes an MBR (and master boot record)
to the disk. The easiest way to format as superfloppy
(remove the MBR) is to boot a linux Live CD and do
mkdosfs -I /dev/sda
NOT mkdosfs /dev/sda1
(This assumes your version of Linux will recognize the
device as /dev/sda and will reformat the stick, destroying
any data on it).
This will remove the MBR and format the entire stick as
a “superfloppy”. See http://www.marlow.dk/site.php/tech/usbkeys
To install an MBR, he suggests first clearing the first 512 bytes
and then using a debian program called install-mbr:
dd if=/dev/zero of=/dev/sda bs=512 count=1
to erase the start of the USB Key. After that you can do a “fdisk /dev/sda” and
create a new FAT partition (FAT16 is suitable). To install a MBR and format the key
afterwards, do
install-mbr /dev/sda –force
mkdosfs -I /dev/sda1
Note the use of /dev/sda1. This means the first PARTITION on the
device and implies that it has a partition table (and MBR).
FDISK /MBR is tricky…make darned sure you are using the
correct hard disk!
Mark
Installer Debian sur une clé USB
———————————
Create a single ext2 partition on the USB drive:
foo:~/# fdisk /dev/sda
Command (m for help): d
Selected partition 1
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1015, default 1):
Last cylinder or +size or +sizeK (1-1015, default 1015):
Using default value 1015
Command (m for help): a
Partition number (1-4): 1
Command (m for help): p
Disk /dev/sda: 1031 MB, 1031798784 bytes
32 heads, 62 sectors/track, 1015 cylinders
Units = cylinders of 1984 * 512 = 1015808 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 1015 1006849 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
In short, create a Linux (type 83) partition that is bootable. Easy enough, right?
Create a filesystem on the USB media:
foo:~/# mkfs -t ext2 /dev/sda1
Desactive le count de fsck (intervalle entre 2 verif)
tune2fs -i 0 /dev/sde1
puis nous allons fixer le nombre de mount entre 2 fsck (aucun):
tune2fs -c 0 /dev/sde1
Build a Debian chroot
Prepare a work directory, and mount the USB media under the working directory as /boot:
foo:~# mkdir -p /mnt/chroot/boot
foo:~# mount /dev/sda1 /mnt/chroot/boot
From Debian Etch
Install Debian:
foo:~# debootstrap etch /mnt/chroot
Configure Locales
Chroot to the new directory, and install the locales we want (to avoid annoying errors while installing future packages), and remove unwanted locales to save space. At minimum, you probably want to generate and keep en_US ISO-8859-1, en_US.ISO-8859-15 ISO-8859-15 and en_US.UTF-8 UTF-8.
chroot /mnt/chroot
apt-get install locales
dpkg-reconfigure locales
apt-get install localepurge
localepurge
Install kernel & modules
You may be asked if you want to abort the install due to the kernel version. Since you are in a chroot, this is not as dangerous as debconf thinks, so do NOT abort!
apt-get install linux-image-2.6.18-5-686 unionfs-modules-2.6.18-5-686 squashfs-modules-2.6.18-5-686
Continuer quand même au msg de warning d’initramnd
depmod 2.6.18-5-686
Install essential tools
Install other necessary packages, including my customized version of casper (available at http://aslan.flimzy.com/casper/) and do some basic configuration
# apt-get install unionfs-tools squashfs-tools grub casper
Installer et configurer le compte root et un compte user
# user-setup
Customiser la version de casper
cd /tmp
wget http://aslan.flimzy.com/casper/casper_1.81+nymgy-2_i386.deb
dpkg -i casper_1.81+nymgy-2_i386.deb
Edit/Create config files
/etc/network/interfaces
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or
# /usr/share/doc/ifupdown/examples for more information.
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
/etc/hostname
Create this file with an appropriate hostname in it.
/etc/hosts
127.0.0.1 localhost
Add a line for your specific hostname/IP address if you wish.
/etc/fstab
proc /proc proc defaults 0 0
unionfs / unionfs rw 0 0
/dev/sda1 /boot ext2 rw 0 0
NOTE: Even if your USB drive is not /dev/sda1 on the machine you’re building this on, it likely will be on the target machine when booted, so you probably want this to read /dev/sda1 anyway.
If you are not using a USB device (perhaps a CF card in an IDE adaptor), however, this device name _could_ very well be different, in which case you’ll want to edit accordingly.
[edit]
Other
Create any other custom configurations necessary, such as updating /etc/apt/sources.list and /etc/resolv.conf.
deb http://ftp.debian.org/debian etch main contrib non-free
deb http://security.debian.org/ etch/updates main
Create Support Scripts
[edit]
/etc/initramfs-tools/hooks/casper_custom
Available [1].
#!/bin/sh -e
PREREQS=”casper”
# Output pre-requisites
prereqs()
{
echo “$PREREQS”
}
case “$1″ in
prereqs)
prereqs
exit 0
;;
esac
PRECLEANUP=”02etc_casper_conf 10adduser 13swap 14locales 15autologin ”
PRECLEANUP+=”18hostname 19keyboard 20xconfig 22gnome_panel_data ”
PRECLEANUP+=”22screensaver 23etc_modules 23networking 24preseed ”
PRECLEANUP+=”25configure_init 30accessibility 31disable_update_notifier ”
PRECLEANUP+=”33disable_binary_drivers 34disable_kwallet ”
PRECLEANUP+=”35fix_language_selector 12fstab 32disable_hibernation”
script_dir=”$DESTDIR/scripts/casper-bottom”
for script in $PRECLEANUP; do
rm $script_dir/$script
done
Then change permissions:
foo:/# chmod +x /etc/initramfs-tools/hooks/casper_custom
[edit]
/usr/local/bin/moo
Available here.
Remark: in this externally linked script, there’s an error on line 84 (one “exit” to many, which prevents updating the live system). The version below on the wiki is correct though.
#!/bin/bash
# Configurable variables
MAXLOOPS=8 # Maximum number of loop devices to allow
MAXPCT=90 # Begin deleting files on /boot when this % is used
CLEANDOC=”yes” # Clean /usr/share/doc?
CLEANMAN=”yes” # Clean /usr/share/man?
CLEANINF=”yes” # Clean /usr/share/info?
# Do not edit anything below here!
let MAXLOOPS=$MAXLOOPS-1
EXCLUDES=/tmp/moo.excludes
INCLUDES=/tmp/moo.includes
EXLIST=”^/cow/var/log/ ^/cow/var/lock/ ^/cow/tmp/ ^/cow/var/tmp/ ”
EXLIST+=”^/cow/sys/ ^/cow/dev/ ^/cow/cow/ ^/cow/proc/ ^/cow/var/run/ ”
EXLIST+=”^/cow/casper/ /.joe state$ ~$ /.bash_history$ /.lesshst$ ”
EXLIST+=”^/cow/etc/mtab$ ^/cow/etc/.wh.mtab~ ^/cow/var/cache/apt/archives/ ”
EXLIST+=”^/cow/var/lib/dhcp./ ^/cow/var/lib/urandom/ ”
EXLIST+=”^/cow/var/lib/dpkg/.*-old$ ~$”
EXBASE=”/var/log/* /var/lock/* /tmp/* /var/tmp/* /sys/* /dev/* *~ ”
EXBASE+=”/cow/* /proc/* /var/run/* /etc/mtab /boot/* .lesshst .bash_history ”
EXBASE+=”/var/cache/apt/archives/*.deb /var/lib/dhcp?/* ”
EXBASE+=”/var/lib/urandom/* /var/lib/dpkg/*-old ”
EXBASE+=”/casper/* /var/cache/apt/archives/partial/*.deb”
echo “Checking free space on /boot…”
while [ $(df /boot | grep boot | tr -s ' ' | cut -d' ' -f5 | sed -e s/%//) \> $MAXPCT ]; do
in_use=0
zap_file=$(ls -c /boot/casper/*.squashfs | grep -v /base.squashfs | tail
-n1 | sed -e s%/boot/casper/%%)
grep $zap_file /boot/casper/order.lst && in_use=1;
if [ $in_use == 1 ]; then
echo “Unable to zap /boot/casper/$zap_file!”
echo “Please free up some space on /boot then try again”
exit
fi
echo “Zapping $zap_file”
rm /boot/casper/$zap_file
done
zerosize() {
find $* | while read file; do
echo -n “.”
rm $file
touch $file
done
}
if [ "$CLEANDOC" == "yes" ]; then
echo -n “Cleaning /usr/share/doc”
zerosize /usr/share/doc -type f -size +1b
zerosize /usr/share/doc -type l
echo “”
fi
if [ "$CLEANMAN" == "yes" ]; then
echo -n “Cleaning /usr/share/man”
zerosize /usr/share/man -type f -size +1b
zerosize /usr/share/man -type l
echo “”
fi
if [ "$CLEANINF" == "yes" ]; then
echo -n “Cleaning /usr/share/info”
zerosize /usr/share/info -type f -size +1b
zerosize /usr/share/info -type l
echo “”
fi
if [ -e /boot/casper/snapshot.ver ]; then
let version=$(cat /boot/casper/snapshot.ver)+1
else
echo “Creating initial base image.”
mkdir -p /boot/casper
mkdir -p /cow/
mkdir -p /casper/
mksquashfs / /boot/casper/base.squashfs -e $EXBASE
echo “base.squashfs” > /boot/casper/order.lst
echo “0″ > /boot/casper/snapshot.ver
exit
fi
mount -o remount,rw /boot
echo $version > /boot/casper/snapshot.ver
let num_branches=$(/usr/sbin/unionctl / –list | wc -l)-1;
echo “$num_branches branches found…”
if [ $num_branches == $MAXLOOPS ]; then
echo “$MAXLOOPS branches already exist; Creating new base image.”;
mksquashfs / /boot/casper/base-$version.squashfs -e $EXBASE
echo base-$version.squashfs > /boot/casper/order.lst
echo “Mounting new image…”
mkdir /casper/base-$version.squashfs
mount -o loop /boot/casper/base-$version.squashfs
/casper/base-$version.squashfs
unionctl / –add –after /cow –mode ro /casper/base-$version.squashfs
echo “You MUST reboot before making another backup!”
exit
fi
if [ $num_branches \> $MAXLOOPS ]; then
echo “$MAXLOOPS branches already exist. Aborting.”
exit
fi
echo -n “” > $EXCLUDES
echo -n “” > $INCLUDES
echo “Reading /cow…”
cow_files=$(find /cow -depth);
echo $cow_files | sed -e ’s% %\n%g’ > /tmp/foo
for x in $EXLIST; do
echo CHECKING: $x >> $EXCLUDES
echo $cow_files | sed -e ’s% %\n%g’ | grep $x >> $EXCLUDES
cow_files=$(echo $cow_files | sed -e ’s% %\n%g’ | grep -v $x)
done
for x in $cow_files; do
let files=$files+1;
file[$files]=$x;
done
branches=$(/usr/sbin/unionctl / –list | grep -v /cow | sed -e ’s%\s%%g’ |
cut -d’(’ -f1);
# Create list of excludes
for x in $(seq 1 $files); do
file=$(echo ${file[$x]} | sed -e ’s%/cow%%’)
zap=0
is_wh_file=0
keep_wh=0
if [ $(echo $file | grep /\.wh\.) ]; then
deleted_file=$(echo $file | sed -e s%\.wh\.%%);
is_wh_file=1
fi
for branch in $branches; do
if [ $zap == 0 ];then
if [ -f "$branch"/"$file" ]; then
/usr/bin/cmp -s /cow”$file” “$branch”/”$file” && zap=1
elif [ -d "$branch"/"$file" ]; then
grep “$file”/ $INCLUDES > /dev/null || zap=1
fi
fi
if [ $is_wh_file == 1 ] && [ $zap == 0 ]; then
if [ -e "$branch"/"$deleted_file" ]; then
keep_wh=1
fi
fi
done
if [ $is_wh_file == 1 ] && [ $keep_wh == 0 ]; then
zap=1;
fi
if [ $zap == 0 ]; then
echo $file >> $INCLUDES
echo -n “+”
else
echo /cow$file >> $EXCLUDES
echo -n “-”
fi
done
echo
echo “Creating /boot/casper/$version.squashfs…”
mksquashfs /cow /boot/casper/$version.squashfs -ef $EXCLUDES
echo $version.squashfs >> /boot/casper/order.lst
mount -o remount,ro /boot
echo “Mounting new image…”
mkdir /casper/$version.squashfs
mount -o loop /boot/casper/$version.squashfs /casper/$version.squashfs
unionctl / –add –after /cow –mode ro /casper/$version.squashfs
rm $EXCLUDES
rm $INCLUDES
Then change permissions:
foo:/# chmod +x /usr/local/bin/moo
Note that by default, ‘moo’ will truncate all files in /usr/share/doc, /usr/share/man, and /usr/share/info to save space. (I don’t mind reading my docs on another machine!) It truncates them rather than deleting them so that dpkg doesn’t get confused when files go missing! 0-byte files will compress to practically no space in squashfs, so this shouldn’t be much of a waste of space. I found that truncating these files saved roughly 2-5mb of space in the squashfs on a minimalistic Debian install.
If you do not want to delete these files, edit the ‘moo’ script and change the CLEANMAN, CLEANDOC, and/or CLEANINF variables to “no”.
Install GRUB
You must exit the chroot so that grub-install has proper access to the necessary device files, so type exit, then run the following command. Replace ‘/dev/sda’ with the appropriate name of your flash drive on the installation system (for me it’s actually ‘/dev/sdc’):
exit
grub-install –recheck –root-directory=/mnt/chroot /dev/sda
Then go back into the chroot, and configure grub.
chroot /mnt/chroot
update-grub
Then manually edit the /boot/grub/menu.lst file. find the line that begins with # kopt= and change it to read:
# kopt=boot=casper ramdisk_size=16384 root=/dev/ram rw ip=frommedia quickreboot livemount=/boot showmounts
Also edit the line that begins with # groot and change it so that it corresponds to the device your flash drive will be on reboot. If you have no SATA drives, above grub-install command would have detected /dev/sda as (hd1,0) and that’s what your grub root device should be.
Then update the final configuration, exit the chroot, and unmount the media:
update-grub
exit
umount /mnt/chroot/boot
Plug the USB stick into a bootable system, and give it a try!
Debian sur une clé USB - autre méthode
—————————————
Insérer une clé 1Gb
Passer root
# sudo su
donner plus d’infos sur les devices, notamment la clé (sur /dev/sdX)
# fdisk -l
Copier l’image pendrivelinux.img téléchargée sur la clé
# dd if=pendrivelinux.img of=/dev/sdX
TIPS pour les galères avec GRUB
——————————–
Passer en shell grub (depuis un LIVE)
# grub
ensuite tapper
root (hd0,0)
pour voir un peu
pour réinstaller grub à partir des fichiers présents
# setup (hd0)
TIPS: remonter une partition lecture seule en écriture, à chaud
—————————————————————
mount -o remount,rw /boot
TIPS: backup and restore a partition
————————————
1. Boot from the live cdrom distribution.
2. Switch to root.
3. Make sure NO partitions are mounted from the source hard drive.
4. Mount the external HD.
# mount -t vfat /dev/sda1 /mnt/sda1
5. Backup the drive.
# dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.img.gz
“dd” is the command to make a bit-by-bit copy of “if=/dev/hda” as the “Input File” to “of=/mnt/sda1/hda.img.gz” as the “Output File”. Everything from the partition will go into an “Output File” named “hda.img.gz”. “conv=sync,noerror” tells dd that if it can’t read a block due to a read error, then it should at least write something to its output of the correct length. Even if your hard disk exhibits no errors, remember that dd will read every single block, including any blocks which the OS avoids using because it has marked them as bad. “bs=64K” is the block size of 64×1024 Bytes. Using this large of block size speeds up the copying process. The output of dd is then piped through gzip to compress it.
6. To restore your system:
# gunzip -c /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K
7. Store extra information about the drive geometry necessary in order to interpret the partition table stored within the image. The most important of which is the cylinder size.
# fdisk -l /dev/hda > /mnt/sda1/hda_fdisk.info
Notes:
One of the disadvantages of the dd method over software specifically designed for the job such as Ghost or partimage is that dd will store the entire partition, including blocks not currently used to store files, whereas the likes of Ghost understand the filesystem and don’t store these unallocated blocks. The overhead isn’t too bad as long as you compress the image and the unallocated blocks have low entropy. In general this will not be the case because the emtpy blocks contain random junk from bygone files. To rectify this, it’s best to blank all unused blocks before making the image. After doing that, the unallocated blocks will contain mostly zeros and will therefore compress down to almost nothing.
Mount the partition, then create a file of zeros which fills the entire disk, then delete it again.
# dd if=/dev/zero of=/tmp/delete.me bs=8M; rm delete.me
Mots-clefs : debian, usb
Publié dans LinuxEmbeded | Aucun commentaire »
tech.xrousse.org est fièrement propulsé par WordPress
Articles (RSS) et Commentaires (RSS).