Posts Tagged ‘Virtualisation’

Purging old data from the database used by vCentre Server 4.x (2.5 also included)

February 14, 2011 Leave a comment

We had a failed VC today – seems our client managed to fill the SQL database and fill the storage.
It is a physical host, so expanding the disk is not so easy.

Time to clear the VC database up . .

Luckily, VMware have posted the how-to for this one (as they did before for 2.5)

The details are pretty thorough . . just watch out to make sure you stop your VC service before running this (and if you can, back up your database as you’ll be purging data from the database)

Linky here:

Note: Do not run the scripts attached to this article against a VirtualCenter 2.x database. For information about purging data in VirtualCenter 2.x, see

Categories: VMWare Tags: ,

VMUG London Lowdown

February 11, 2011 Leave a comment


I attended the VMUG in London yesterday. Unfortunately I missed the Enterprise round table, to sit on Alan Renouf’s PowerCLi session.
the session was pretty handy in terms of getting me to revert to the PowerCli again, but an hour is just not enough time to get your teeth fully stuck in – his focus was reporting (which I guess makes sense, as he’d hardly want us, deleting, configuring and moving things round in his lab – which he generously shared)
Either way, the hands on labs were a good opportunity to network with other local professionals.

Alaric did a great job of entertaining us as MC – (ask him about his juvenile moment and variable names next time you see him)

Warren Oliver from Veeam really lives and breathes his product. I had a chat with him at break time and have had him in my office a few times. he really is an asset to the company – I like what Veeam do, I like their product and like their attitude. You’ll have seen several references to their tools in my previous bloggings . .and you will see more as we currently rolling Veeam vPower out at a big client site (see you in 2 weeks Warren)

either way, the presentation was humorous, but professional and entertaining – the product looks amazing (I guess we know it is . . considering all the awards they have received at VMworld etc?)

As sponsors, they did a great job too – including donating an iPad as a prize (the usual business card draw . . I need to get myself some business cards . .)

Scott’s chat on certification was very handy – saved me doing a bunch of web trawling. (I will be going for a VCDX later this year . . though not because I want the certification, but rather because I like the appeal of building a design for something then having to defend it – thus testing my own knowledge) – I will post as I get on – I have an idea for my design though – and I need to find out whether I will be allowed to publish details of this once I have completed my VCDX (it is info that I want the community to be able to use . . so a certain aspect of the VCDX design I’d like to have publicly shared)
Either way – thanks Scott.

I enjoyed Gabrie’s Budget DR talk. Oddly, it is something I have done myself before, using PowerCli and some Netapps replication. His approach is almost identical to the one I used (though my design was active/active and used a VC hosted on a VM on the non-production site) -= I’ll explain later, as I will blog my scripts in a thread call ‘DR on a shoestring’ – it will no doubt be similar to what Gabe presents, but at least give those of you who would like to try it an alternative approach (speaking of which . . I’ll need some ‘test pilots’ with alternative storage technologies to test drive my revised scripts once complete)

Steve’s cloud discussion (11th hour step in for an automation session that I was looking forward to) caught me off guard – I have been a little slow to get hooked on the cloud side of things, so it was a good eye opener – looking forward to ‘clouds’ at the next VMUG.

To finish, Chris Dearden (in a nice subtle, slightly off pink shirt) presented a humorous account of Transatlantic Data centre migration and how to (or not to) actually get it done.
Seems like they had a big project on their hands and did a reasonable job of getting it completed, considering the rather tight constraints that they had – good effort! – The last slot of the day is always the hardest (the iPad had already been given away and the morning caffeine worn off, but at the end of his presentation it seemed everyone was still awake . . an achievement in itself)

I missed the drink up afterwards (had no choice – one day family visit from the states!) – either way, once I have done DR on a shoestring . .who knows, I may present at a VMUG?

Thanks to everyone who helped organise and played apart . . looking forward to the 12th of May when we convene again.



Categories: VMWare Tags: , , ,

VMWare user Group London

February 10, 2011 Leave a comment

The blog will be dead today – I am off to the VMWare User Group in London. –

our schedule is as follows:

10.00 – 12.00 Roundtable Strategy Session with Martyn Storey and Mark Stockham; Enterprise Management – optional (spaces limited)
11:00 – 12:00 PowerCLI session with Alan Renouf – optional
12:30 – 13:00 Arrive & Refreshments
13:00 – 13:20 Welcome & News (Alaric)
13:20 – 14:00 Sponsor presentation (Veeam Systems)
14:00 – 14:30 VMware Certification – Preparing for Success (Scott Vessey)
14:30 – 15:00 Cheap Disaster Recovery using PowerShell scripts (Gabrie van Zanten
15:00 – 15:20 Refreshment break
15:30 – 16:00 Advanced vCenter Alarming and Automation (Simon Long, VMware)
16:00 – 16:30 Transatlantic Datacentre migration (Chris Dearden, JFVI)
16:30 – 16:45 Close
17:00 Pub

I’ll be attending the PowerCli session with Alan renouf . . though I am slightly grumpy that that means I’ll miss the RoundTable strategy meeting,

Of course I will feed back here with anything I learn (which no doubt will be a whole lot)
These VMUGs are a great opportunity to find out what is upcoming in the virtual world and to offer your 2 cents worth – check the VM communites, there is bound to be one near you :

Categories: VMWare Tags: ,

Adding Datastores to ESXi Hosts that have already been built

February 9, 2011 Leave a comment


Datastore addition when other DAS already exists

When attaching storage such as a MSA70 to an ESX3i host, ESX will not

automatically format it or create the relevant partitions automatically.


can however be done from an SSH connection – using the following


1. Log on to the console or use putty to connect to the ESX host remotely. If

you have not created a user for yourself you will not be able to log in through


2. SU to root. This must be done using the su

root command. If you do not use the – then you will not get root’s path and thus

get error messages that say that commands cannot be found.

3. Run fdisk -l. This will give you a list of all of your current partitions.

This is important because they are numbered. If you are using SCSI you should

see that all partitions start with /dev/sda# where # is a number from 1 to what

ever. Remember this list of number as you are going to be adding at least one

more and will have to refer to the new partition by it’s number.

4. Run fdisk /dev/sda. This will allow you to create a partition on the the

first drive. If you have more than one SCSI drive (usually the case with more

than one RAID container) then you will have to type the letter value for the

device you wish to create the partition on (sdb, sdc, and so on).

5. You are now in the fdisk program. If you get confused type "m" for menu.

This will list all of your options. There are a lot of them. You will be

ignoring most of them.

6. Type "n". This will create a new partition. It will ask you for the

starting cylinder. Unless you have a very good reason hit "enter" for default.

The program will now offer you a second option that says ending cylinder. If you

press enter you will select the rest of the space. In most cases this is what

you want.

7. Once you have selected start and end cylinder you should get a success

message. Now you must set the partition type or it’s ID. This is option "t" on

the menu.

8. Type "t". It will ask you for partition number. This is where that first

fdisk is useful. You need to know what the new partition number is. It will be

one more than the last number on fdisk. Type this number in.

9. You will now be prompted for the hex code for the partition type. You can

also type "L" for a list of codes. The code you want is "fb". So type "fb" in

the space. This will return that the partition has been changed to fb (unknown).

That is what you want.

10. Now that you have configured everything you want to save it. To do so

choose the "w" option to write the table to disk and exit.

11. Because the drive is being used by the console OS you will probably get

an error that says "WARNING: Re-reading the partition table failed with error

16: device or resource busy." This is normal. You will need to reboot.

12. To reboot the server type "reboot" at the prompt.

13. Once you have rebooted you can now format the partition VMFS. DO NOT do

this from the GUI. You must once again log into the console or remote in through


14. Once you have su’d to root you must type in "vmkfstools -C vmfs3

/vmfs/devices/disks/vmhba0:0:0:#" Were # is the number of the new partition. You

shoulder now get a "successfully created new volume" message. If you get an

error you probably chose the wrong partition. Do an fdisk – l and choose the

number with the "unknown" partition type. Note: IF you have more than one SCSI

disk or more than one container the first 0 may need to be a 1 as well.

15. Go to the GUI and in configuration/storage select refresh. You should now

see your new VMFS volume.

Categories: VMWare Tags: ,

Enabling SSH on ESXi

February 8, 2011 Leave a comment

Info below copied from :

By default SSH is not enabled on ESXi – though every time you log a call with VMWare, the first thing that they do (of course) is ask you to enable it?

To enable SSH, do the following:

1) At the console of the ESXi host, press ALT-F1 to access the console window.
2) Enter unsupported in the console and then press Enter. You will not see the text you type in.
3) If you typed in unsupported correctly, you will see the Tech Support Mode warning and a password prompt. Enter the password for the root login.
4) You should then see the prompt of ~ #. Edit the file inetd.conf (enter the command vi /etc/inetd.conf).
5) Find the lines that begins with #ssh and remove the #. Then save the file. If you’re new to using vi, then move the cursor down to #ssh line and then press the Insert key. Move the cursor over one space and then hit backspace to delete the #. Then press ESC and type in :wq to save the file and exit vi. If you make a mistake, you can press the ESC key and then type it :q! to quit vi without saving the file. Note: there are two lines for SSH with ESXi 4.0 now – one for regular IP and the other for IPv6. You should
6) Once you’ve closed the vi editor, you can either restart the host or restart the inetd process. To restart inetd run ps | grep inetd to determine the process ID for the inetd process. The output of the command will be something like 1299 1299 busybox inetd, and the process ID is 1299. Then run kill -HUP <process_id> (kill -HUP 1299 in this example) and you’ll then be able to access the host via SSH.

Tip – with some applications like WinSCP, the default encryption cipher used is AES. If you change that to Blowfish you will likely see significantly faster transfers.

Changing the port for SSH

To change the port for SSH, edit the file /etc/services and change the SSH port listed in the file. Save the file and repeat step 6 above.

Enable Telnet

The steps are the same as with SSH, but you’ll remove the # from the 2 telnet entries in /etc/inetd.conf. Enabling telnet is not recommended if security is a concern.

Enable SSH access for a non-root account

Use the following process to enable SSH access for a non-root account
1) Access SSH or the console with a root account.
2) Create a new account with the command useradd <account_name> -M -d/ . This will set the home directory to / instead of requiring a /home directory.
3) Use the command passwd <account_name> to set the password for your new login.
4) Edit the passwd file with vi /etc/passwd. For the entry for your new account, change the /bin/sh part to /bin/ash. Save the file and exit. See the example for the test1 user below.

nfsnobody:x:65534:65534:Anonymous NFS User:/:/sbin/nologin
dcui:x:100:100:DCUI User:/:/sbin/nologin
test1:x:500:500:Linux User,,,:/:/bin/ash

You should now be able to connect with SSH using this new account.

Disable SSH access for the root account

If you have created non-root accounts for SSH access you can also disable root access via SSH. Edit the /etc/inetd.conf file using the initial process on this page and add the option -w after the -i option. The line in inetd.conf will appear similar to the below.

ssh stream tcp nowait root /sbin/dropbearmulti dropbear ++min=0,swap,group=shell -i -w -K60

One you have made the change, save the file and run the kill -HUP command to restart the inetd process. You will now be able to login with a non-root account, but will get access denied if you use a root account. Once you have established a SSH session with your non-root account you can issue the command su – to switch to the root account.

Script of the Day – shutdown your VMware ESX estate with PowerCLI

February 7, 2011 Leave a comment

The following script is straight from

I have used it a few times and it is very effective and easy to use.

Connect-VIServer MyVIServer

# Get All the ESX Hosts
$ESXSRV = Get-VMHost

# For each of the VMs on the ESX hosts
Foreach ($VM in ($ESXSRV | Get-VM)){
# Shutdown the guest cleanly
$VM | Shutdown-VMGuest -Confirm:$false

# Set the amount of time to wait before assuming the remaining powered on guests are stuck
$waittime = 200 #Seconds

$Time = (Get-Date).TimeofDay
do {
# Wait for the VMs to be Shutdown cleanly
sleep 1.0
$timeleft = $waittime - ($Newtime.seconds)
$numvms = ($ESXSRV | Get-VM | Where { $_.PowerState -eq "poweredOn"}).Count
Write "Waiting for shutdown of $numvms VMs or until $timeleft seconds"
$Newtime = (Get-Date).TimeofDay - $Time
} until ((@($ESXSRV | Get-VM | Where { $_.PowerState -eq "poweredOn" }).Count) -eq 0 -or ($Newtime).Seconds -ge $waittime)

# Shutdown the ESX Hosts
$ESXSRV | Foreach {Get-View $_.ID} | Foreach {$_.ShutdownHost_Task($TRUE)}

Write-Host "Shutdown Complete"


Copying VMware Network config / Port Groups

February 7, 2011 Leave a comment

How often do you need to duplicate the port group config from one ESX host to another – easy if you can use Host Profiles . . but maybe you are not licensed for it?

I found a great (FREE . . the best type) tool for this:

The author is Flores Eken from ITQ Consultancy in the Netherlands. He is a VMware SDK programmer. He wrote this application in C# based on the new ESX3.x /VC2.x SDK, but it works in ESX 4

you can download it at :

Script of the Day – import all VMs from a Datastore to VMWare ESX / ESXi

February 3, 2011 Leave a comment

So your DC fell over . . but you have a copy of all your vmdks etc and would like to import them to a new ESX host . .

The following script will run you through a series of prompt and then import all VMs from a DS to the specified ESX cluster

# Code by Alan van Wyk
# This script prompts for a Cluster and a Datastore and imports all VMs from the DS to the Cluster (to be used in DR emergencies etc)

# Simple function to tidy display at prompt screen
Function Selections () # Refresh screen at top of page, shows user selections
Write-Host ("Virtual Center: ") -ForegroundColor Blue -NoNewLine; Write-Host (" " + $vc)
Write-Host ("Destination Data Center: ") -ForegroundColor Blue -NoNewLine; Write-Host (" "  + $DC2)
Write-Host ("Destination Cluster: ") -ForegroundColor Blue -NoNewLine; Write-Host (" "  + $Cluster2)
Write-Host ("Destination Datastore: ") -ForegroundColor Blue -NoNewline; Write-Host (" "  + $Datastore2)
Function quit #quits script
Function Pause ($Message="Press any key to continue...") #pause and wait for user to hit key to continue
Write-Host -NoNewLine $Message
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Write-Host ""

$vc = Read-Host "Please specify your Virtual Center"
Write-Host "Connecting to Virtual Center... "
 Connect-VIServer $vc

#Select DC
 $x = @(0) * 20 # initialize the array
 $i=0 # intialize the indexer
 Get-Datacenter `
 | select -first 20 `
 | % { $x[$i]=$_.Name; "{0} {1}" -f $i++, $_.Name } # store the DCs into an array and display the array
 Write-Host ("`n Please select Destination DataCenter from index above:`n") -ForegroundColor Yellow -BackgroundColor Red
 $index = read-host index # ask for an index
 $dc2 = $x[$index] # select index

 # Select cluster
 $x = @(0) * 20 # initialize the array
 $i=0 # intialize the indexer
 Get-Datacenter $dc2    | Get-Cluster `
 | select -first 20 `
 | % { $x[$i]=$_.Name; "{0} {1}" -f $i++, $_.Name } # store the Clusters into an array and display the array
 Write-Host ("`n Please select Destination Cluster from index above:`n")    -ForegroundColor Yellow -BackgroundColor Red

 $index = read-host index # ask for an index
 $Cluster2 = $x[$index] # select index

 $x = @(0) * 20 # initialize the array
 $i=0 # intialize the indexer
 get-cluster $cluster2 | get-vmhost | Get-Datastore `
 | select -first 20 `
 | % { $x[$i]=$_.Name; "{0} {1}" -f $i++, $_.Name } # store the Datastores into an array and display the array
 Write-Host ("`n Please select Destination Datastore from index above:`n")    -ForegroundColor Yellow -BackgroundColor Red
 $index = read-host index # ask for an index
 $Datastore2 = $x[$index] # select index

 #Prompt for confirmation

 $confirmation = Read-Host "Type CONTINUE to confirm that you would like to import all VMs from $Datastore2 to $cluster2"
 If ($confirmation -cne "CONTINUE")
 Write-Host ("Settings not confirmed - disconnecting from Virtual Center") -BackgroundColor Red -ForegroundColor Yellow
 disconnect-viserver -confirm:$false

 $dsname = $Datastore2
 $datacenter = $dc2
 $cluster = $cluster2

# Code below by LucD

$ESXname = Get-Cluster $cluster | Get-VMHost | select -First 1
$dsBrowser = Get-View (Get-View (Get-VMHost -Name $ESXname).ID).DatastoreBrowser
$folder = Get-View (Get-Datacenter -Name $datacenter | Get-Folder -Name "vm").ID
$pool = Get-View (Get-Cluster -Name $cluster | Get-ResourcePool -Name "Resources").ID

foreach($dsImpl in $dsBrowser.Datastore){
 $ds = Get-View $dsImpl
 if($ds.Summary.Name -ne $dsname){continue}

 $datastorepath = "[" + $ds.Summary.Name + "]"

 $searchspec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec
 $searchSpec.matchpattern = "*.vmx"

 Write-Host "Searching in path" $datastorepath

 $task = Get-View ($dsBrowser.SearchDatastoreSubFolders_Task($datastorePath, $searchSpec))
 while ($task.Info.State -eq "running" -or $task.Info.State -eq "queued"){
 sleep 5
 if($ -ne $null){
 foreach ($file in ${

 if($file.FolderPath -match ".snapshot"){continue}
 $found = $FALSE
 foreach($vmx in $vms){
 if(($file.FolderPath + $file.File[0].Path) -eq $vmx){
 Write-Host "`tVM is registered"
 $found = $TRUE
 if (-not $found -and $task.Info.Result[0].File -ne $null){
 $vmx = $file.FolderPath + $file.File[0].Path
 $params = @($vmx,$null,$FALSE,$pool.MoRef,$null)
 Write-Host "Registering" $vmx
 $folder.GetType().GetMethod("RegisterVM_Task").Invoke($folder, $params)


Accessing VMWare logs

February 3, 2011 Leave a comment

You can see ESX logs:

  • From the Service Console
  • From the vSphere Client connected directly to the ESX host (click Home > Administration > System Logs)
  • From the VMware Infrastructure Client connected directly to the ESX host (click Administration > System Logs)

The vmkernel logs (which log everything related to the kernel/core of the ESX) are located at /var/log/vmkernel.

The vmkwarning logs (which log warnings from the vmkernel) are located at /var/log/vmkwarning.

The vmksummary logs (which provide a summary of system activities such as uptime, downtime, reasons for downtime) are located at /var/log/vmksummary.

The hostd log (which is the log of the ESX management service of the ESX) are located at /var/log/vmware/hostd.log.

The messages log (which log activity on the Service Console operating system) is located at /var/log/messages.

The VirtualCenter Agent log is located at /var/log/vmware/vmware/vpx/vpxa.log.

The Automatic Availability Manager (AAM) logs are located at /var/log/vmware/aam/vmware_<hostname>-xxx.log.

The SW iSCSI logs are located at /var/log/vmkiscsid.log.

The System boot log is located at /var/log/boot-logs/sysboot.log.


More complete information available at:

ESXi host losing settings at reboot – checking system partitions of ESX host

February 2, 2011 Leave a comment

On 3 separate occasions I have seen ESX hosts that appeared to lose their config at reboot.
I stumbled across a useful doc once and copied some of it, but can not remember where I found it..

Anyway, in all instances, the problem was caused by the bootbank being corrupted and I followed the following process to resolve the issue.

You see, the way VMWare operates is that 3 Hypervisor partitions are created and used for normal operation. the are mounted as /bootbank, /altbootbank and /store.

/store is simply used to ‘store’ data (e.g. VMTools isos and VI client etc) as well as information for the vCenter Server agent and the HA agent

Once you configure the Scratchconfig.ConfiguredScratchLocation paramater for an ESX host (swap file) it will mount a 4th partition for this purpose.

Anyway, the first two partitions mentioned above are used for the ‘running’ config and ‘saved’ config . . very loosely similarly to the way in which a Cisco router stores 2 different configs.
What happens with VMware though is that the ‘running’ config
/bootbank and /altbootbank are effectively the running copy of the ESX firmware / config and the last saved version.

VMWare backs up its running config every hours (at the1 minute after the hour)

to see if you have been getting updated backups (so there is a failure in the process) you can check for a an up to date stage.tgz file.

At the ESXi hgost, hit  ALT+F1 / then type in ‘unsupported’, press enter and login with the root password)

 ls -l /bootbank/

and check the timestamp of state.tgz (make sure this is 1 minute past an hour ago)

If this shows an old version, you could try force a backup:

/sbin/ 0 /bootbank/

Check again if  the timestamp on local.tgz gets updated

If not, we should try to fix corruption (if this is indeed the cause)

In order to identify the different paritions, you can use one of 2 methods:

~ # esxcfg-vmhbadevs -f
~ # ls -l | grep vmfs

what you need to do is simply identify which partitions are the /bootbank and /altbootbank partition, so that you can run a check.

to run a check on a partition, simply run dosfsck -v /dev/disks/<hba id>

dosfsck -v /dev/disks/vmhba1:0:0:4

Of course, using this tool, you can perform various other checks, so I have included the contents of the man page below:

dosfsck - check and repair MS-DOS file systems
dosfsck [-aAflnrtvVwy] [-d path -d ...] [-u path
-u ...] device
dosfsck verifies the consistency of MS-DOS file systems and optionally
tries to repair them. The following file system problems can be cor-
rected (in this order):
- FAT contains invalid cluster numbers. Cluster is changed to EOF.
- File's cluster chain contains a loop. The loop is broken.
- Bad clusters (read errors). The clusters are marked bad and they
are removed from files owning them. This check is optional.
- Directories with a large number of bad entries (probably cor-
rupt). The directory can be dropped.
- Files . and .. are non-directories. They can be dropped or
- Directories . and .. in root directory. They are dropped.
- Bad file names. They can be renamed.
- Duplicate directory entries. They can be dropped or renamed.
- Directories with non-zero size field. Size is set to zero.
- Directory . does not point to parent directory. The start
pointer is adjusted.
- Directory .. does not point to parent of parent directory. The
start pointer is adjusted.
- Start cluster number of a file is invalid. The file is trun-
- File contains bad or free clusters. The file is truncated.
- File's cluster chain is longer than indicated by the size
fields. The file is truncated.
- Two or more files share the same cluster(s). All but one of the
files are truncated. If the file being truncated is a directory
file that has already been read, the file system check is
restarted after truncation.
- File's cluster chain is shorter than indicated by the size
fields. The file is truncated.
- Clusters are marked as used but are not owned by a file. They
are marked as free.
Additionally, the following problems are detected, but not repaired:
- Invalid parameters in boot sector.
- Absence of . and .. entries in non-root directories
When dosfsck checks a file system, it accumulates all changes in memory
and performs them only after all checks are complete. This can be dis-
abled with the -w option.
-a Automatically repair the file system. No user intervention is
necessary. Whenever there is more than one method to solve a
problem, the least destructive approach is used.
-A Use Atari variation of the MS-DOS filesystem. This is default if
dosfsck is run on an Atari, then this option turns off Atari
format. There are some minor differences in Atari format: Some
boot sector fields are interpreted slightly different, and the
special FAT entries for end-of-file and bad cluster can be dif-
ferent. Under MS-DOS 0xfff8 is used for EOF and Atari employs
0xffff by default, but both systems recognize all values from
0xfff8...0xffff as end-of-file. MS-DOS uses only 0xfff7 for bad
clusters, where on Atari values 0xfff0...0xfff7 are for this
purpose (but the standard value is still 0xfff7).
-d Drop the specified file. If more that one file with that name
exists, the first one is dropped.
-f Salvage unused cluster chains to files. By default, unused clus-
ters are added to the free disk space except in auto mode (-a).
-l List path names of files being processed.
-n No-operation mode: non-interactively check for errors, but don't
write anything to the filesystem.
-r Interactively repair the file system. The user is asked for
advice whenever there is more than one approach to fix an incon-
-t Mark unreadable clusters as bad.
-u Try to undelete the specified file. dosfsck tries to allocate a
chain of contiguous unallocated clusters beginning with the
start cluster of the undeleted file.
-v Verbose mode. Generates slightly more output.
-V Perform a verification pass. The file system check is repeated
after the first run. The second pass should never report any
fixable errors. It may take considerably longer than the first
pass, because the first pass may have generated long list of
modifications that have to be scanned for each disk read.
-w Write changes to disk immediately.
-y Same as -a (automatically repair filesystem) for compatibility
with other fsck tools.
If -a and -r are absent, the file system is only checked, but not
0 No recoverable errors have been detected.
1 Recoverable errors have been detected or dosfsck has discovered
an internal inconsistency.
2 Usage error. dosfsck did not access the file system.
Does not create . and .. files where necessary. Does not remove
entirely empty directories. Should give more diagnostic messages.
Undeleting files should use a more sophisticated algorithm.
Werner Almesberger <> Extensions
(FAT32, VFAT) by and current maintainer: Roman Hodek <>